|
@@ -0,0 +1,144 @@
|
|
|
+#!/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
|
|
|
+
|
|
|
+if [ -z $1 ];then
|
|
|
+ print give the filename of the archive you want to install
|
|
|
+ exit 1
|
|
|
+fi
|
|
|
+archive=$1
|
|
|
+
|
|
|
+# get adk target system
|
|
|
+target=$(cat /etc/.adktarget)
|
|
|
+if [ -z $target ];then
|
|
|
+ print autodetection of target failed
|
|
|
+ exit 1
|
|
|
+fi
|
|
|
+
|
|
|
+case $target {
|
|
|
+(mikrotik-rb532)
|
|
|
+ cfgfssize=32768
|
|
|
+ nand=0
|
|
|
+ cf=0
|
|
|
+ fs=ext4
|
|
|
+ while getopts "cnf:" ch; do
|
|
|
+ case $ch in
|
|
|
+ c)
|
|
|
+ cf=1
|
|
|
+ fs=ext4
|
|
|
+ ;;
|
|
|
+ n)
|
|
|
+ nand=1
|
|
|
+ fs=yaffs2
|
|
|
+ ;;
|
|
|
+ f)
|
|
|
+ fs=$OPTARG
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
+ done
|
|
|
+ shift $((OPTIND - 1))
|
|
|
+ ;;
|
|
|
+(*)
|
|
|
+ print target $target not supported
|
|
|
+ exit 1
|
|
|
+ ;;
|
|
|
+}
|
|
|
+
|
|
|
+f=0
|
|
|
+for tool in parted sfdisk mkfs.$fs;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 for filesystem $2
|
|
|
+ parted -s $1 unit s mkpart primary $2 $3 $4
|
|
|
+}
|
|
|
+
|
|
|
+function set_boot_flag {
|
|
|
+ print setting bootflag on $1 partition $2
|
|
|
+ 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.$fs -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 0 1
|
|
|
+ create_partition /dev/sda ext2 1 $rootsize
|
|
|
+ create_partition /dev/sda ext2 $rootsize $maxsize
|
|
|
+ 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
|
|
|
+ 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
|