adkinstall 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. #!/bin/mksh
  2. # This file is part of the OpenADK project.
  3. # install OpenADK to a block/flash device
  4. if [ $(id -u) -ne 0 ];then
  5. print installation is only possible as root
  6. exit 1
  7. fi
  8. # get adk target system
  9. target=$(cat /etc/.adktarget)
  10. if [ -z $target ];then
  11. print autodetection of target failed
  12. exit 1
  13. fi
  14. function mikrotik-rb532-help {
  15. cat >&2 <<EOF
  16. Syntax: adkinstall [-c|-n] <archive>
  17. -c: compact flash install
  18. -n: nand install
  19. -f: filesystem for compact flash
  20. -h: help text
  21. EOF
  22. exit 1
  23. }
  24. function sgi-o2-help {
  25. cat >&2 <<EOF
  26. Syntax: adkinstall <archive>
  27. -d: create data partition
  28. -f: filesystem (default ext4)
  29. -h: help text
  30. EOF
  31. exit 1
  32. }
  33. function ibm-x40-help {
  34. cat >&2 <<EOF
  35. Syntax: adkinstall <archive>
  36. -d: create data partition
  37. -f: filesystem (default ext4)
  38. -h: help text
  39. EOF
  40. exit 1
  41. }
  42. function pcengines-apu-help {
  43. cat >&2 <<EOF
  44. Syntax: adkinstall <archive>
  45. -f: filesystem (default ext4)
  46. -h: help text
  47. EOF
  48. exit 1
  49. }
  50. function pcengines-alix-help {
  51. cat >&2 <<EOF
  52. Syntax: adkinstall <archive>
  53. -f: filesystem (default ext4)
  54. -h: help text
  55. EOF
  56. exit 1
  57. }
  58. case $target {
  59. (sgi-o2)
  60. cfgfssize=32768
  61. data=
  62. fs=ext4
  63. while getopts "f:d:" ch; do
  64. case $ch in
  65. d)
  66. data=$OPTARG
  67. ;;
  68. f)
  69. fs=$OPTARG
  70. ;;
  71. *)
  72. sgi-o2-help
  73. exit 1
  74. ;;
  75. esac
  76. done
  77. shift $((OPTIND - 1))
  78. if [ -z $1 ];then
  79. sgi-o2-help
  80. else
  81. archive=$1
  82. fi
  83. ;;
  84. (ibm-x40)
  85. cfgfssize=32768
  86. data=
  87. fs=ext4
  88. while getopts "f:d:" ch; do
  89. case $ch in
  90. d)
  91. data=$OPTARG
  92. ;;
  93. f)
  94. fs=$OPTARG
  95. ;;
  96. *)
  97. ibm-x40-help
  98. exit 1
  99. ;;
  100. esac
  101. done
  102. shift $((OPTIND - 1))
  103. if [ -z $1 ];then
  104. ibm-x40-help
  105. else
  106. archive=$1
  107. fi
  108. ;;
  109. (pcengines-apu)
  110. cfgfssize=32768
  111. fs=ext4
  112. while getopts "f:" ch; do
  113. case $ch in
  114. f)
  115. fs=$OPTARG
  116. ;;
  117. *)
  118. pcengines-apu-help
  119. exit 1
  120. ;;
  121. esac
  122. done
  123. shift $((OPTIND - 1))
  124. if [ -z $1 ];then
  125. pcengines-apu-help
  126. else
  127. archive=$1
  128. fi
  129. ;;
  130. (pcengines-alix)
  131. cfgfssize=32768
  132. fs=ext4
  133. while getopts "f:" ch; do
  134. case $ch in
  135. f)
  136. fs=$OPTARG
  137. ;;
  138. *)
  139. pcengines-alix-help
  140. exit 1
  141. ;;
  142. esac
  143. done
  144. shift $((OPTIND - 1))
  145. if [ -z $1 ];then
  146. pcengines-alix-help
  147. else
  148. archive=$1
  149. fi
  150. ;;
  151. (mikrotik-rb532)
  152. cfgfssize=32768
  153. nand=0
  154. cf=0
  155. fs=ext4
  156. while getopts "cnf:" ch; do
  157. case $ch in
  158. c)
  159. cf=1
  160. fs=ext4
  161. ;;
  162. n)
  163. nand=1
  164. fs=yaffs2
  165. ;;
  166. f)
  167. fs=$OPTARG
  168. ;;
  169. *)
  170. mikrotik-rb532-help
  171. exit 1
  172. ;;
  173. esac
  174. done
  175. shift $((OPTIND - 1))
  176. if [ -z $1 ];then
  177. mikrotik-rb532-help
  178. else
  179. archive=$1
  180. fi
  181. ;;
  182. (*)
  183. print target $target not supported
  184. exit 1
  185. ;;
  186. }
  187. if [ "$target" = "mikrotik-rb532" ];then
  188. if [ $cf -eq 0 -a $nand -eq 0 ];then
  189. print "you either install on cf (-c) or nand (-n)"
  190. mikrotik-rb532-help
  191. fi
  192. fi
  193. tools="parted partprobe sfdisk mkfs.$fs"
  194. f=0
  195. for tool in $tools;do
  196. if ! which $tool >/dev/null; then
  197. echo "checking if $tool is installed... failed"
  198. f=1
  199. fi
  200. done
  201. if [ $f -eq 1 ];then exit 1;fi
  202. # create empty partition table
  203. function create_label {
  204. print "creating empty partition table"
  205. parted -s $1 mklabel msdos > /dev/null 2>&1
  206. if [ $? -ne 0 ]; then
  207. echo "creating empty partition failed!"
  208. exit 1
  209. fi
  210. }
  211. # get max size of disk in sectors
  212. function get_max_size {
  213. maxsize=$(env LC_ALL=C parted $1 -s unit s print |awk '/^Disk/ { print $3 }'|sed -e 's/s//')
  214. rootsize=$(($maxsize-$cfgfssize))
  215. print device has $maxsize sectors. using $rootsize for root.
  216. }
  217. # create partition, with fstype start and end in sectors
  218. function create_partition {
  219. print creating partition on $1
  220. parted -s $1 unit s mkpart primary $2 $3 $4 > /dev/null 2>&1
  221. if [ $? -ne 0 ]; then
  222. echo "creating primary partition failed!"
  223. exit 1
  224. fi
  225. }
  226. function set_boot_flag {
  227. print setting bootflag on $1 partition $2
  228. parted -s $1 set $2 boot on > /dev/null 2>&1
  229. if [ $? -ne 0 ]; then
  230. echo "setting bootflag failed!"
  231. exit 1
  232. fi
  233. }
  234. function change_part_type {
  235. print setting partition type on $1 partition $2 to $3
  236. sfdisk --change-id $1 $2 $3 >/dev/null 2>&1
  237. if [ $? -ne 0 ]; then
  238. echo "changing partition type failed!"
  239. exit 1
  240. fi
  241. }
  242. function create_filesystem {
  243. print creating filesystem $2 on $1 partition $3
  244. mkfs.$2 -F -q ${1}${3}
  245. if [ $? -ne 0 ]; then
  246. echo "creating filesystem on partition failed!"
  247. exit 1
  248. fi
  249. }
  250. function mount_fs {
  251. print mounting ${1}${2} to $4 with filesystem $3
  252. mount -t $3 ${1}${2} $4
  253. if [ $? -ne 0 ]; then
  254. echo "mounting filesystem failed!"
  255. exit 1
  256. fi
  257. }
  258. function extract_archive {
  259. print extracting archive $1 onto $2
  260. tar -C $2 -xpf $1
  261. if [ $? -ne 0 ]; then
  262. echo "archive extraction failed!"
  263. exit 1
  264. fi
  265. }
  266. function grub_install {
  267. print installing bootloader grub
  268. (
  269. print set default=0
  270. print set timeout=1
  271. print serial --unit=0 --speed=115200
  272. print terminal_output serial
  273. print terminal_input serial
  274. consargs="console=ttyS0,115200"
  275. print
  276. print 'menuentry "GNU/Linux (OpenADK)" {'
  277. print "\tlinux /boot/kernel root=/dev/sda1"
  278. print '}'
  279. ) >/mnt/boot/grub/grub.cfg
  280. grub-install $1 --root-directory /mnt
  281. if [ $? -ne 0 ]; then
  282. echo "grub install failed!"
  283. exit 1
  284. fi
  285. }
  286. function fix_perm {
  287. print fixing permissions
  288. chmod 1777 ${1}/tmp
  289. [[ -f ${1}/usr/bin/sudo ]] && chmod 4755 ${1}/usr/bin/sudo
  290. [[ -f ${1}/usr/bin/Xorg ]] && chmod 4755 ${1}/usr/bin/Xorg
  291. }
  292. case $target {
  293. (sgi-o2)
  294. get_max_size /dev/sda
  295. create_label /dev/sda
  296. if [ -z $data ];then
  297. create_partition /dev/sda ext2 16385 $rootsize
  298. create_partition /dev/sda ext2 $(($rootsize+1)) $(($maxsize-1))
  299. set_boot_flag /dev/sda 1
  300. change_part_type /dev/sda 2 88
  301. else
  302. datasize=$(($data*1024*2))
  303. echo datasize is: $datasize
  304. echo create partition from 16385 to $(($rootsize-$datasize))
  305. create_partition /dev/sda ext2 16385 $(($rootsize-$datasize))
  306. echo create partition from $(($rootsize-$datasize+1)) to $(($maxsize-$cfgfssize-1))
  307. create_partition /dev/sda ext2 $(($rootsize-$datasize+1)) $(($maxsize-$cfgfssize-1))
  308. echo create partition from $(($maxsize-$cfgfssize)) to $(($maxsize-1))
  309. create_partition /dev/sda ext2 $(($maxsize-$cfgfssize)) $(($maxsize-1))
  310. set_boot_flag /dev/sda 1
  311. change_part_type /dev/sda 3 88
  312. fi
  313. partprobe /dev/sda
  314. sync
  315. sleep 2
  316. if [ -z $data ];then
  317. create_filesystem /dev/sda $fs 1
  318. else
  319. create_filesystem /dev/sda $fs 1
  320. create_filesystem /dev/sda $fs 2
  321. fi
  322. mdev -s
  323. mount_fs /dev/sda 1 $fs /mnt
  324. extract_archive $archive /mnt
  325. if [ ! -z $data ];then
  326. echo creating data dir and fstab entry
  327. mkdir /mnt/data
  328. echo "/dev/sda2 /data ext4 rw 0 0" >> /mnt/etc/fstab
  329. fi
  330. fix_perm /mnt
  331. umount /mnt
  332. ;;
  333. (ibm-x40)
  334. get_max_size /dev/sda
  335. create_label /dev/sda
  336. if [ -z $data ];then
  337. create_partition /dev/sda ext2 16385 $rootsize
  338. create_partition /dev/sda ext2 $(($rootsize+1)) $(($maxsize-1))
  339. set_boot_flag /dev/sda 1
  340. change_part_type /dev/sda 2 88
  341. else
  342. datasize=$(($data*1024*2))
  343. echo datasize is: $datasize
  344. echo create partition from 16385 to $(($rootsize-$datasize))
  345. create_partition /dev/sda ext2 16385 $(($rootsize-$datasize))
  346. echo create partition from $(($rootsize-$datasize+1)) to $(($maxsize-$cfgfssize-1))
  347. create_partition /dev/sda ext2 $(($rootsize-$datasize+1)) $(($maxsize-$cfgfssize-1))
  348. echo create partition from $(($maxsize-$cfgfssize)) to $(($maxsize-1))
  349. create_partition /dev/sda ext2 $(($maxsize-$cfgfssize)) $(($maxsize-1))
  350. set_boot_flag /dev/sda 1
  351. change_part_type /dev/sda 3 88
  352. fi
  353. partprobe /dev/sda
  354. sync
  355. sleep 2
  356. if [ -z $data ];then
  357. create_filesystem /dev/sda $fs 1
  358. else
  359. create_filesystem /dev/sda $fs 1
  360. create_filesystem /dev/sda $fs 2
  361. fi
  362. mdev -s
  363. mount_fs /dev/sda 1 $fs /mnt
  364. extract_archive $archive /mnt
  365. if [ ! -z $data ];then
  366. echo creating data dir and fstab entry
  367. mkdir /mnt/data
  368. echo "/dev/sda2 /data ext4 rw 0 0" >> /mnt/etc/fstab
  369. fi
  370. grub_install /dev/sda
  371. fix_perm /mnt
  372. umount /mnt
  373. ;;
  374. (pcengines-apu|pcengines-alix)
  375. get_max_size /dev/sda
  376. create_label /dev/sda
  377. create_partition /dev/sda ext2 16385 $rootsize
  378. create_partition /dev/sda ext2 $(($rootsize+1)) $(($maxsize-1))
  379. set_boot_flag /dev/sda 1
  380. change_part_type /dev/sda 2 88
  381. partprobe /dev/sda
  382. sync
  383. sleep 2
  384. create_filesystem /dev/sda $fs 1
  385. mdev -s
  386. mount_fs /dev/sda 1 $fs /mnt
  387. extract_archive $archive /mnt
  388. grub_install /dev/sda
  389. fix_perm /mnt
  390. umount /mnt
  391. ;;
  392. (mikrotik-rb532)
  393. if (( cf )); then
  394. get_max_size /dev/sda
  395. create_label /dev/sda
  396. create_partition /dev/sda ext2 1 16384
  397. create_partition /dev/sda ext2 16385 $rootsize
  398. create_partition /dev/sda ext2 $(($rootsize+1)) $(($maxsize-1))
  399. set_boot_flag /dev/sda 1
  400. change_part_type /dev/sda 1 27
  401. change_part_type /dev/sda 3 88
  402. partprobe /dev/sda
  403. sync
  404. sleep 2
  405. create_filesystem /dev/sda $fs 2
  406. mdev -s
  407. mount_fs /dev/sda 2 $fs /mnt
  408. extract_archive $archive /mnt
  409. print installing kernel to cf disk /dev/sda1
  410. dd if=/mnt/boot/kernel of=/dev/sda1 bs=2048 >/dev/null 2>&1
  411. fix_perm /mnt
  412. umount /mnt
  413. fi
  414. if (( nand )); then
  415. mount_fs /dev/mtdblock 1 $fs /mnt
  416. rm -rf /mnt/* >/dev/null 2>&1
  417. mkdir /mnt/boot
  418. mount_fs /dev/mtdblock 0 $fs /mnt/boot
  419. extract_archive $archive /mnt
  420. fix_perm /mnt
  421. umount /mnt/boot
  422. umount /mnt
  423. fi
  424. ;;
  425. }
  426. echo "successfully installed OpenADK on $target."
  427. exit 0