123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- #!/bin/mksh
- # This file is part of the OpenADK project.
- # install to ADK to a block/flash device
- if [ $(id -u) -ne 0 ];then
- print Installation is only possible as root
- exit 1
- fi
- # get adk target system
- target=$(cat /etc/.adktarget)
- if [ -z $target ];then
- print autodetection of target failed
- exit 1
- fi
- function mikrotik-rb532-help {
- cat >&2 <<EOF
- Syntax: adkinstall [-c|-n] -a <archive>
- -a: archive
- -c: compact flash install
- -n: nand install
- -f: filesystem for compact flash
- -h: help text
- EOF
- exit 1
- }
- case $target {
- (mikrotik-rb532)
- cfgfssize=32768
- nand=0
- cf=0
- fs=ext4
- while getopts "a:cnhf:" ch; do
- case $ch in
- a)
- archive=$OPTARG
- ;;
- c)
- cf=1
- fs=ext4
- ;;
- n)
- nand=1
- fs=yaffs2
- ;;
- f)
- fs=$OPTARG
- ;;
- h)
- mikrotik-rb532-help
- exit 1
- ;;
- *)
- mikrotik-rb532-help
- exit 1
- ;;
- esac
- done
- shift $((OPTIND - 1))
- ;;
- (*)
- print target $target not supported
- exit 1
- ;;
- }
- if [ $cf -eq 0 -a $nand -eq 0 ];then
- print "You either install on cf (-c) or nand (-n)"
- mikrotik-rb532-help
- exit 1
- fi
- tools="parted sfdisk"
- if [ $cf -eq 1 ];then
- tools="$tools mkfs.$fs"
- fi
- f=0
- for tool in $tools;do
- if ! which $tool >/dev/null; then
- echo "Checking if $tool is installed... failed"
- f=1
- fi
- done
- if [ $f -eq 1 ];then exit 1;fi
- # create empty partition table
- function create_label {
- print "Creating empty partition table"
- parted -s $1 mklabel msdos
- }
- # get max size of disk in sectors
- function get_max_size {
- maxsize=$(env LC_ALL=C parted $1 -s unit s print |awk '/^Disk/ { print $3 }'|sed -e 's/s//')
- rootsize=$(($maxsize-$cfgfssize))
- print device has $maxsize sectors. Using $rootsize for root.
- }
- # create partition, with fstype start and end in sectors
- function create_partition {
- print creating partition on $1
- parted -s $1 unit s mkpart primary $2 $3 $4 > /dev/null 2>&1
- }
- function set_boot_flag {
- print setting bootflag on $1 partition $2 > /dev/null 2>&1
- parted -s $1 set $2 boot on
- }
- function change_part_type {
- print setting partition type on $1 partition $2 to $3
- sfdisk --change-id $1 $2 $3 >/dev/null 2>&1
- }
- function create_filesystem {
- print creating filesystem $2 on $1 partition $3
- mkfs.$2 -q ${1}${3}
- }
- function mount_fs {
- print mounting ${1}${2} to $4 with filesystem $3
- mount -t $3 ${1}${2} $4
- }
- function extract_archive {
- print extracting archive $1 onto $2
- tar -C $2 -xpf $1
- }
- function fix_perm {
- print fixing permissions
- chmod 1777 ${1}/tmp
- chmod 4755 ${1}/bin/busybox
- }
- case $target {
- (mikrotik-rb532)
- if (( cf )); then
- get_max_size /dev/sda
- create_label /dev/sda
- create_partition /dev/sda ext2 1 8192
- create_partition /dev/sda ext2 8193 $rootsize
- create_partition /dev/sda ext2 $(($rootsize+1)) $(($maxsize-1))
- set_boot_flag /dev/sda 1
- change_part_type /dev/sda 1 27
- change_part_type /dev/sda 3 88
- create_filesystem /dev/sda $fs 2
- mdev -s
- mount_fs /dev/sda 2 $fs /mnt
- extract_archive $archive /mnt
- print installing kernel to cf disk /dev/sda1
- dd if=/mnt/boot/kernel of=/dev/sda1 bs=2048 >/dev/null 2>&1
- fix_perm /mnt
- umount /mnt
- fi
- if (( nand )); then
- mount_fs /dev/mtdblock 1 $fs /mnt
- rm -rf /mnt/* >/dev/null 2>&1
- mkdir /mnt/boot
- mount_fs /dev/mtdblock 0 $fs /mnt/boot
- extract_archive $archive /mnt
- fix_perm /mnt
- umount /mnt/boot
- umount /mnt
- fi
- ;;
- }
- echo "Successfully installed OpenADK on $target."
- exit 0
|