init 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998
  1. #!/bin/bash
  2. # Last change: 07. Dec. 2016.
  3. # ============================================================
  4. # This is the standard Ubuntu initramfs initialization process
  5. # ============================================================
  6. # Default PATH differs between shells, and is not automatically exported
  7. # by klibc dash. Make it consistent.
  8. export PATH=/sbin:/usr/sbin:/bin:/usr/bin
  9. [ -d /dev ] || mkdir -m 0755 /dev
  10. [ -d /root ] || mkdir -m 0700 /root
  11. [ -d /sys ] || mkdir /sys
  12. [ -d /proc ] || mkdir /proc
  13. [ -d /tmp ] || mkdir /tmp
  14. mkdir -p /var/lock
  15. mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
  16. mount -t proc -o nodev,noexec,nosuid proc /proc
  17. # Some things don't work properly without /etc/mtab.
  18. ln -sf /proc/mounts /etc/mtab
  19. echo "1 1 1 1" > /proc/sys/kernel/printk
  20. grep -q '\<quiet\>' /proc/cmdline || echo "Loading, please wait..."
  21. # Note that this only becomes /dev on the real filesystem if udev's scripts
  22. # are used; which they will be, but it's worth pointing out
  23. if ! mount -t devtmpfs -o nosuid,mode=0755 udev /dev; then
  24. echo "W: devtmpfs not available, falling back to tmpfs for /dev"
  25. mount -t tmpfs -o nosuid,mode=0755 udev /dev
  26. [ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
  27. [ -e /dev/null ] || mknod /dev/null c 1 3
  28. fi
  29. mkdir /dev/pts
  30. mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
  31. mount -t tmpfs -o "noexec,nosuid,size=80%,mode=0755" tmpfs /run
  32. mkdir -m 0755 /run/initramfs
  33. # Export the dpkg architecture
  34. export DPKG_ARCH=
  35. . /conf/arch.conf
  36. # Set modprobe env
  37. export MODPROBE_OPTIONS="-qb"
  38. # Export relevant variables
  39. export ROOT=
  40. export ROOTDELAY=
  41. export ROOTFLAGS=
  42. export ROOTFSTYPE=
  43. export IP=
  44. export BOOT=
  45. export BOOTIF=
  46. export UBIMTD=
  47. export break=
  48. export init=/sbin/init
  49. export quiet=y
  50. export readonly=y
  51. export rootmnt=/root
  52. export debug=
  53. export panic=
  54. export blacklist=
  55. export resume=
  56. export resume_offset=
  57. export drop_caps=
  58. export fastboot=n
  59. export forcefsck=n
  60. export fsckfix=
  61. export recovery=
  62. export BOOT_CARDTYPE="unknown"
  63. export OTHER_CARDTYPE="unknown"
  64. export BOOT_CARDDEV="0"
  65. export OTHER_CARDDEV="9"
  66. export EDITOR="mcedit mc"
  67. # mdadm needs hostname to be set. This has to be done before the udev rules are called!
  68. if [ -f "/etc/hostname" ]; then
  69. /bin/hostname -F /etc/hostname >/dev/null 2>&1
  70. fi
  71. # Bring in the main config
  72. . /conf/initramfs.conf
  73. for conf in conf/conf.d/*; do
  74. [ -f ${conf} ] && . ${conf}
  75. done
  76. . /scripts/functions
  77. echo "1 1 1 1" > /proc/sys/kernel/printk
  78. BOOTDELAY=60
  79. DEFAULTBOOT="1"
  80. # Parse command line options
  81. for x in $(cat /proc/cmdline); do
  82. case $x in
  83. boot_card_type=*)
  84. BOOT_CARDTYPE=${x#boot_card_type=}
  85. ;;
  86. boot_card_dev=*)
  87. BOOT_CARDDEV=${x#boot_card_dev=}
  88. ;;
  89. boot_delay=*)
  90. BOOTDELAY="${x#boot_delay=}"
  91. case ${BOOTDELAY} in
  92. *[![:digit:].]*)
  93. BOOTDELAY=60
  94. ;;
  95. esac
  96. ;;
  97. default_boot=*)
  98. DEFAULTBOOT="${x#default_boot=}"
  99. ;;
  100. quiet)
  101. quiet=y
  102. ;;
  103. ro)
  104. readonly=y
  105. ;;
  106. rw)
  107. readonly=n
  108. ;;
  109. break=*)
  110. break=${x#break=}
  111. ;;
  112. break)
  113. break=premount
  114. ;;
  115. esac
  116. done
  117. # Default to BOOT=local if no boot script defined.
  118. if [ -z "${BOOT}" ]; then
  119. BOOT=local
  120. fi
  121. if [ -n "${noresume}" ]; then
  122. export noresume
  123. unset resume
  124. else
  125. resume=${RESUME:-}
  126. fi
  127. maybe_break top
  128. # export BOOT variable value for compcache,
  129. # so we know if we run from casper
  130. export BOOT
  131. # Don't do log messages here to avoid confusing graphical boots
  132. run_scripts /scripts/init-top
  133. #maybe_break modules
  134. #[ -n "${netconsole}" ] && modprobe netconsole netconsole="${netconsole}"
  135. load_modules
  136. maybe_break premount
  137. run_scripts /scripts/init-premount
  138. maybe_break mount
  139. # Always load local and nfs (since these might be needed for /etc or
  140. # /usr, irrespective of the boot script used to mount the rootfs).
  141. . /scripts/local
  142. . /scripts/nfs
  143. . /scripts/${BOOT}
  144. parse_numeric ${ROOT}
  145. maybe_break mountroot
  146. mount_top
  147. mount_premount
  148. #mountroot
  149. if read_fstab_entry /usr; then
  150. mountfs /usr
  151. fi
  152. # Mount cleanup
  153. mount_bottom
  154. nfs_bottom
  155. local_bottom
  156. chown 0:0 /bin/*
  157. chown 0:0 /sbin/*
  158. echo "1 1 1 1" > /proc/sys/kernel/printk
  159. sleep 1
  160. # === Variables ===
  161. [ ! $BOOTDELAY -gt 4 ] && BOOTDELAY=5
  162. export SCRIPT_VERSION="v2.1"
  163. export O_BOARD="OD"
  164. export ODROID_DTB="odroid.dtb"
  165. export ODROID_FSTAB="fstab.odroid"
  166. export ODROID_IMAGE="Kernel"
  167. export ODROID_ASYSTEMIMAGE="androsystem.img"
  168. export BKP_PREFIX="OD"
  169. export NUMCARDS="1"
  170. export UPGRADE_ANDROID="no"
  171. export ASYSTEM_PART="2"
  172. export ADATA_PART="5"
  173. export ACACHE_PART="3"
  174. export ADATA_PART_ORIG="3"
  175. export ACACHE_PART_ORIG="4"
  176. export LINUX_PART="7"
  177. export LINUX2_PART="8"
  178. export OELEC_PART="6"
  179. _desc=""
  180. _ini_prefix="multiboot"
  181. _actmount="mnt1"
  182. _numos=0
  183. _menu_no=49
  184. _menu_key="1"
  185. _menuitem_1=""
  186. _menuitem_2=""
  187. _menuitem_3=""
  188. _menuitem_4=""
  189. _menuitem_5=""
  190. _menuitem_6=""
  191. _menuitem_7=""
  192. _menuitem_8=""
  193. _mndscr_1=""
  194. _mndscr_2=""
  195. _mndscr_3=""
  196. _mndscr_4=""
  197. _mndscr_5=""
  198. _mndscr_6=""
  199. _mndscr_7=""
  200. _mndscr_8=""
  201. _mncrd_1="1"
  202. _mncrd_2="1"
  203. _mncrd_3="1"
  204. _mncrd_4="1"
  205. _mncrd_5="1"
  206. _mncrd_6="1"
  207. _mncrd_7="1"
  208. _mncrd_8="1"
  209. _boot_delay=2
  210. _defboot="none"
  211. _defdescr="none"
  212. _defcard="1"
  213. boot_fail="yes"
  214. ask_for_card() {
  215. clear
  216. if [ ! "$O_BOARD" = "XU" ]; then
  217. mkdir /mnt1 > /dev/null 2>&1
  218. umount /mnt1 > /dev/null 2>&1
  219. mount -t vfat /dev/mmcblk0p1 /mnt1 > /dev/null 2>&1
  220. if [ $? -eq 0 ]; then
  221. if [ -f /mnt1/THIS_IS_SDCARD ]; then
  222. BOOT_CARDTYPE="SD"
  223. umount /mnt1 > /dev/null 2>&1
  224. return
  225. elif [ -f /mnt1/THIS_IS_EMMC ]; then
  226. BOOT_CARDTYPE="EMMC"
  227. umount /mnt1 > /dev/null 2>&1
  228. return
  229. fi
  230. fi
  231. umount /mnt1 > /dev/null 2>&1
  232. fi
  233. printf "\n\n \033[31m\033[1mBOOT card type is unknown, you have booted from original Odroid card\033[22m\033[37m\n"
  234. printf " \033[31mHave you booted from \033[1mEMMC\033[22m (Y/N) ? \033[37m"
  235. local B="X"
  236. while true; do
  237. if read -n 1 -t 1 -s B; then
  238. if [ "${B}" = "y" ] || [ "${B}" = "Y" ]; then
  239. BOOT_CARDTYPE="EMMC"
  240. break
  241. elif [ "${B}" = "n" ] || [ "${B}" = "N" ]; then
  242. BOOT_CARDTYPE="SD"
  243. if [ "$O_BOARD" = "XU" ] && [ "${NUMCARDS}" = "2" ]; then
  244. BOOT_CARDDEV="1"
  245. fi
  246. break
  247. fi
  248. fi
  249. done
  250. }
  251. # =========================================================
  252. # === Set the variables depending on used Odroid board ===
  253. [ -f /ODROID_C1 ] && O_BOARD="C1"
  254. [ -f /ODROID_C2 ] && O_BOARD="C2"
  255. [ -f /ODROID_XU ] && O_BOARD="XU"
  256. [ -b /dev/mmcblk1 ] && NUMCARDS="2"
  257. [ "${O_BOARD}" = "C1" ] && run_scripts /scripts/panic
  258. if [ "${BOOT_CARDTYPE}" = "unknown" ]; then
  259. if [ ! "$O_BOARD" = "XU" ]; then
  260. if [ "${NUMCARDS}" = "1" ]; then
  261. BOOT_CARDDEV="0"
  262. ask_for_card
  263. fi
  264. elif [ "$O_BOARD" = "XU" ]; then
  265. ask_for_card
  266. fi
  267. fi
  268. if [ "$O_BOARD" = "C2" ]; then
  269. ADATA_PART_ORIG="4"
  270. ACACHE_PART_ORIG="3"
  271. ODROID_DTB="meson64_odroidc2.dtb"
  272. ODROID_FSTAB="fstab.odroidc2"
  273. ODROID_IMAGE="Image"
  274. ODROID_ASYSTEMIMAGE="rootsystem.img"
  275. BKP_PREFIX="C2"
  276. if [ "${NUMCARDS}" = "2" ]; then
  277. BOOT_CARDTYPE="EMMC"
  278. NUMCARDS="2"
  279. OTHER_CARDDEV="1"
  280. OTHER_CARDTYPE="SD"
  281. fi
  282. elif [ "$O_BOARD" = "C1" ]; then
  283. ADATA_PART_ORIG="4"
  284. ACACHE_PART_ORIG="3"
  285. ODROID_DTB="meson8b_odroidc.dtb"
  286. ODROID_FSTAB="fstab.odroidc"
  287. ODROID_IMAGE="uImage"
  288. ODROID_ASYSTEMIMAGE="rootsystem.img"
  289. BKP_PREFIX="C1"
  290. if [ "${NUMCARDS}" = "2" ]; then
  291. BOOT_CARDTYPE="EMMC"
  292. NUMCARDS="2"
  293. OTHER_CARDDEV="1"
  294. OTHER_CARDTYPE="SD"
  295. fi
  296. elif [ "$O_BOARD" = "XU" ]; then
  297. ADATA_PART_ORIG="3"
  298. ACACHE_PART_ORIG="4"
  299. ODROID_DTB="exynos5422-odroidxu3.dtb"
  300. ODROID_FSTAB="fstab.odroidxu3"
  301. ODROID_IMAGE="zImage"
  302. ODROID_ASYSTEMIMAGE="system.img"
  303. BKP_PREFIX="XU"
  304. [ "${BOOT_CARDTYPE}" = "eMMC" ] && BOOT_CARDTYPE="EMMC"
  305. if [ "${NUMCARDS}" = "2" ]; then
  306. if [ "${BOOT_CARDTYPE}" = "SD" ]; then
  307. OTHER_CARDDEV="0"
  308. OTHER_CARDTYPE="EMMC"
  309. else
  310. OTHER_CARDDEV="1"
  311. OTHER_CARDTYPE="SD"
  312. BOOT_CARDDEV="0"
  313. fi
  314. fi
  315. fi
  316. # =========================================================
  317. # === Functions ===
  318. # Get OS description from boot.ini
  319. #-----------------------------------------------------
  320. get_descr() {
  321. _desc=""
  322. local _descx=
  323. _descx=`cat /${_actmount}/${_ini_prefix}/$1 | grep \#DESCRIPTION`
  324. if [ ! "${_descx}" = "" ]; then
  325. _desc=$(echo ${_descx} | sed -r 's/^.{13}//')
  326. fi
  327. if [ "${_desc}" = "" ]; then
  328. _desc="${2}"
  329. fi
  330. }
  331. #-----------------------------------------------------
  332. #----------------------------------------------------------------------------------------------------
  333. restore_bootini() {
  334. printf "\033[31m\033[1m %s\033[22m\033[37m" "${1}"
  335. cp /mnt1/${_ini_prefix}/boot.ini.multi /mnt1/boot.ini > /dev/null 2>&1
  336. [ "${O_BOARD}" = "XU" ] && cp /mnt1/${_ini_prefix}/boot.scr.multi /mnt1/boot.scr > /dev/null 2>&1
  337. umount /mnt_a > /dev/null 2>&1
  338. sleep 3
  339. }
  340. #----------------------------------------------------------------------------------------------------
  341. #-----------------------------------------------------------------------------------------------------------------------
  342. change_afstab() {
  343. # === Configure Android fstab to mount the right partitions ===
  344. if [ -f /mnt_a/${ODROID_FSTAB} ]; then
  345. if [ "${1}" = "yes" ]; then
  346. # Two cards, boot to Android on NON Boot card
  347. if [ ! "${O_BOARD}" = "XU" ]; then
  348. sed -i "s/\/dev\/block\/mmcblk0/\/dev\/block\/mmcblk1/g" /mnt_a/${ODROID_FSTAB}
  349. # on C2 prepare boot.ini for boot from sdcard
  350. sed -i "s/root=\/dev\/mmcblk0p2/root=\/dev\/mmcblk1p2/g" /mnt1/boot.ini
  351. else
  352. if [ "${OTHER_CARDTYPE}" = "SD" ]; then
  353. cp /mnt_a/${ODROID_FSTAB}.other /mnt_a/${ODROID_FSTAB}
  354. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.andro_1/g" /mnt1/boot.ini
  355. else
  356. cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
  357. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
  358. fi
  359. fi
  360. else
  361. # One or two cards, boot to Android on Boot card
  362. if [ ! "${O_BOARD}" = "XU" ]; then
  363. # Restore boot device if modified earlier
  364. sed -i "s/\/dev\/block\/mmcblk1/\/dev\/block\/mmcblk0/g" /mnt_a/${ODROID_FSTAB}
  365. else
  366. if [ "${NUMCARDS}" = "1" ]; then
  367. cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
  368. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
  369. else
  370. # Two cards, boot to Android on Boot card
  371. if [ "${BOOT_CARDTYPE}" = "SD" ] && [ "${BOOT_CARDDEV}" = "1" ]; then
  372. cp /mnt_a/${ODROID_FSTAB}.other /mnt_a/${ODROID_FSTAB}
  373. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.andro_1/g" /mnt1/boot.ini
  374. else
  375. cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
  376. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
  377. fi
  378. fi
  379. fi
  380. fi
  381. if [ "${O_BOARD}" = "XU" ]; then
  382. cp -f /mnt_a/${ODROID_FSTAB} /mnt_a/${ODROID_FSTAB}.sdboot
  383. fi
  384. else
  385. restore_bootini "${ODROID_FSTAB} not found"
  386. return 1
  387. fi
  388. return 0
  389. }
  390. #-----------------------------------------------------------------------------------------------------------------------
  391. #----------------------------------------------------------------------------------------------------------------------
  392. # =======================================================================
  393. # On C2 boot drive is always mmcblk0 and is mounted on /mnt1
  394. # On XU3/XU4 boot drive can be mmcblk0 or mmcblk1 and is mounted on /mnt1
  395. # =======================================================================
  396. do_boot() {
  397. [ "${1}" = "none" ] && return 0
  398. local change_drive="no"
  399. local _oncard=""
  400. _actmount="mnt1"
  401. if [ "${3}" = "2" ]; then
  402. # Operating system on NON BOOT card
  403. _actmount="mnt2"
  404. change_drive="yes"
  405. fi
  406. if [ "${NUMCARDS}" = "2" ]; then
  407. if [ "${_actmount}" = "mnt1" ]; then
  408. _oncard=" on ${BOOT_CARDTYPE}"
  409. else
  410. _oncard=" on ${OTHER_CARDTYPE}"
  411. fi
  412. fi
  413. if [ -f /${_actmount}/${_ini_prefix}/${1} ]; then
  414. boot_fail="yes"
  415. printf "\r\033[2K"
  416. printf " Booting to \033[32m%s\033[37m\033[36m%s\033[37m" "${2}" "${_oncard}"
  417. # === Copy selected boot.ini to BOOT partition
  418. cp /${_actmount}/${_ini_prefix}/${1} /mnt1/boot.ini > /dev/null 2>&1
  419. if [ ! $? -eq 0 ]; then
  420. restore_bootini "ERROR copying /${_actmount}/${_ini_prefix}/${1}"
  421. return 1
  422. fi
  423. sleep 1
  424. if [ "${change_drive}" = "yes" ]; then
  425. # === boot.ini from NON-BOOT card, prepare it for boot from BOOT card ===
  426. if [ "${O_BOARD}" = "C2" ]; then
  427. # for kernel/initrd/dtb loading
  428. sed -i "s/fatload mmc 0:1/fatload mmc 1:1/g" /mnt1/boot.ini
  429. # for boot.ini loading from /multiboot (it was changed with previous sed operation!)
  430. sed -i "s/1:1 0x60000000/0:1 0x60000000/g" /mnt1/boot.ini
  431. elif [ "${O_BOARD}" = "C1" ]; then
  432. # for kernel/initrd/dtb loading
  433. sed -i "s/fatload mmc 0:1/fatload mmc 1:1/g" /mnt1/boot.ini
  434. # for boot.ini loading from /multiboot (it was changed with previous sed operation!)
  435. sed -i "s/1:1 0x30000000/0:1 0x30000000/g" /mnt1/boot.ini
  436. else
  437. # for kernel/initrd/dtb loading
  438. sed -i "s/setenv change_osdev no/setenv change_osdev yes/g" /mnt1/boot.ini
  439. fi
  440. fi
  441. if [ "${1}" = "boot.ini.android" ]; then
  442. # === mount destination android system partition to prepare android fstab ===
  443. mkdir /mnt_a > /dev/null 2>&1
  444. if [ "${change_drive}" = "yes" ]; then
  445. mount -t ext4 /dev/mmcblk${OTHER_CARDDEV}p2 /mnt_a > /dev/null 2>&1
  446. else
  447. mount -t ext4 /dev/mmcblk${BOOT_CARDDEV}p2 /mnt_a > /dev/null 2>&1
  448. fi
  449. if [ $? -ne 0 ]; then
  450. restore_bootini "Mount Android system partition ERROR"
  451. return 1
  452. fi
  453. # === Configure Android fstab to mount the right partitions ===
  454. change_afstab "${change_drive}"
  455. [ $? -ne 0 ] && return 1
  456. umount /mnt_a > /dev/null 2>&1
  457. # =============================================================
  458. fi
  459. if [ "${O_BOARD}" = "XU" ]; then
  460. # Convert boot.ini to boot.scr
  461. mkimage -C none -A arm -T script -d /mnt1/boot.ini /mnt1/boot.scr > /dev/null 2>&1
  462. if [ $? -ne 0 ]; then
  463. restore_bootini "mkimage (boot.scr) ERROR"
  464. return 1
  465. fi
  466. if [ -f /mnt1/multiboot/newscr ]; then
  467. mkimage -C none -A arm -T script -d /mnt1/multiboot/boot.ini.multi /mnt1/multiboot/boot.scr.multi > /dev/null 2>&1
  468. if [ $? -ne 0 ]; then
  469. restore_bootini "mkimage (boot.scr.multi) ERROR"
  470. return 1
  471. fi
  472. rm -f /mnt1/multiboot/newscr > /dev/null 2>&1
  473. fi
  474. fi
  475. sleep 1
  476. umount /mnt1
  477. umount /mnt2 > /dev/null 2>&1
  478. fsck.fat -aw /dev/mmcblk${BOOT_CARDDEV}p1 > /dev/null 2>&1
  479. reboot
  480. fi
  481. }
  482. #----------------------------------------------------------------------------------------------------------------------
  483. #------------------------------------------------------
  484. set_menu_key() {
  485. _menu_key="\\$(printf '%03o' ${_menu_no})"
  486. if [ $_menu_no -eq 49 ]; then
  487. _menuitem_1="${1}"
  488. _mndscr_1="${_desc}"
  489. [ "${_actmount}" = "mnt2" ] && _mncrd_1="2"
  490. elif [ $_menu_no -eq 50 ]; then
  491. _menuitem_2="${1}"
  492. _mndscr_2="${_desc}"
  493. [ "${_actmount}" = "mnt2" ] && _mncrd_2="2"
  494. elif [ $_menu_no -eq 51 ]; then
  495. _menuitem_3="${1}"
  496. _mndscr_3="${_desc}"
  497. [ "${_actmount}" = "mnt2" ] && _mncrd_3="2"
  498. elif [ $_menu_no -eq 52 ]; then
  499. _menuitem_4="${1}"
  500. _mndscr_4="${_desc}"
  501. [ "${_actmount}" = "mnt2" ] && _mncrd_4="2"
  502. elif [ $_menu_no -eq 53 ]; then
  503. _menuitem_5="${1}"
  504. _mndscr_5="${_desc}"
  505. [ "${_actmount}" = "mnt2" ] && _mncrd_5="2"
  506. elif [ $_menu_no -eq 54 ]; then
  507. _menuitem_6="${1}"
  508. _mndscr_6="${_desc}"
  509. [ "${_actmount}" = "mnt2" ] && _mncrd_6="2"
  510. elif [ $_menu_no -eq 55 ]; then
  511. _menuitem_7="${1}"
  512. _mndscr_7="${_desc}"
  513. [ "${_actmount}" = "mnt2" ] && _mncrd_7="2"
  514. elif [ $_menu_no -eq 56 ]; then
  515. _menuitem_8="${1}"
  516. _mndscr_8="${_desc}"
  517. [ "${_actmount}" = "mnt2" ] && _mncrd_8="2"
  518. fi
  519. let _menu_no=_menu_no+1
  520. let _numos=_numos+1
  521. }
  522. #------------------------------------------------------
  523. #---------------------------------------------------------------------------------------------
  524. # shellcheck disable=SC2059
  525. get_menu_items() {
  526. local _oncard=""
  527. if [ "${NUMCARDS}" = "2" ]; then
  528. if [ "${_actmount}" = "mnt1" ]; then
  529. _oncard=" on ${BOOT_CARDTYPE}"
  530. else
  531. _oncard=" on ${OTHER_CARDTYPE}"
  532. fi
  533. fi
  534. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.android ]; then
  535. get_descr "boot.ini.android" "Android"
  536. set_menu_key "boot.ini.android"
  537. printf "\033[36m \033[32m\033[1m${_menu_key}\033[22m\033[36m boot to \033[32m${_desc}\033[36m${_oncard}\n"
  538. fi
  539. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.linux ]; then
  540. get_descr "boot.ini.linux" "Linux"
  541. set_menu_key "boot.ini.linux"
  542. printf "\033[36m \033[33m\033[1m${_menu_key}\033[22m\033[36m boot to \033[33m${_desc}\033[36m${_oncard}\n"
  543. fi
  544. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.oelec ]; then
  545. get_descr "boot.ini.oelec" "OpenElec"
  546. set_menu_key "boot.ini.oelec"
  547. printf "\033[36m \033[37m\033[1m${_menu_key}\033[22m\033[36m boot to \033[37m${_desc}\033[36m${_oncard}\n"
  548. fi
  549. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.linux2 ]; then
  550. get_descr "boot.ini.linux2" "Linux #2"
  551. set_menu_key "boot.ini.linux2"
  552. printf "\033[36m \033[33m\033[1m${_menu_key}\033[22m\033[36m boot to \033[33m${_desc}\033[36m${_oncard}\n"
  553. fi
  554. }
  555. #---------------------------------------------------------------------------------------------
  556. #-----------------------------------------------------------------------------------------------------
  557. do_halt() {
  558. umount /mnt1 > /dev/null 2>&1
  559. umount /mnt2 > /dev/null 2>&1
  560. local B="X"
  561. local _reboot_delay=60
  562. while [ $_reboot_delay -gt 0 ]; do
  563. printf "\r\033[2K"
  564. printf " \033[31m\033[1m%s, press R to reboot %s\033[22m\033[37m\r" "${1}" "$_reboot_delay"
  565. if read -n 1 -t 1 -s B; then
  566. _reboot_delay=60
  567. if [ "${B}" = "r" ] || [ "${B}" = "R" ]; then
  568. printf "\r\033[2K"
  569. reboot
  570. fi
  571. else
  572. let _reboot_delay=_reboot_delay-1
  573. fi
  574. done
  575. reboot
  576. }
  577. #-----------------------------------------------------------------------------------------------------
  578. #-----------------------------------------------------------------------------------------------------------------
  579. os_detect() {
  580. _desc=""
  581. _ini_prefix="multiboot"
  582. _actmount="mnt1"
  583. _numos=0
  584. _menu_no=49
  585. _menu_key="1"
  586. _menuitem_1=""
  587. _menuitem_2=""
  588. _menuitem_3=""
  589. _menuitem_4=""
  590. _menuitem_5=""
  591. _menuitem_6=""
  592. _menuitem_7=""
  593. _menuitem_8=""
  594. _mndscr_1=""
  595. _mndscr_2=""
  596. _mndscr_3=""
  597. _mndscr_4=""
  598. _mndscr_5=""
  599. _mndscr_6=""
  600. _mndscr_7=""
  601. _mndscr_8=""
  602. _mncrd_1="1"
  603. _mncrd_2="1"
  604. _mncrd_3="1"
  605. _mncrd_4="1"
  606. _mncrd_5="1"
  607. _mncrd_6="1"
  608. _mncrd_7="1"
  609. _mncrd_8="1"
  610. _boot_delay=2
  611. _defboot="none"
  612. _defdescr="none"
  613. _defcard="1"
  614. # prepare cards mount points
  615. mkdir /mnt1 > /dev/null 2>&1
  616. mkdir /mnt2 > /dev/null 2>&1
  617. umount /mnt1 > /dev/null 2>&1
  618. umount /mnt2 > /dev/null 2>&1
  619. umount /mnt > /dev/null 2>&1
  620. clear
  621. # Detect new partitions after install
  622. blkid > /dev/null 2>&1
  623. # ================================
  624. # Mount available cards
  625. # ================================
  626. mount -t vfat /dev/mmcblk${BOOT_CARDDEV}p1 /mnt1 > /dev/null 2>&1
  627. if [ $? -eq 0 ]; then
  628. if [ "${NUMCARDS}" = "2" ]; then
  629. mount -t vfat /dev/mmcblk${OTHER_CARDDEV}p1 /mnt2 > /dev/null 2>&1
  630. if [ $? -ne 0 ]; then
  631. OTHER_CARDDEV="9"
  632. fi
  633. fi
  634. else
  635. # === SOMETHING IS VERY WRONG ===
  636. do_halt "BOOT CARD NOT MOUNTABLE"
  637. fi
  638. clear
  639. printf "\n"
  640. printf "\033[36m\033[1m\n"
  641. if [ ! "${O_BOARD}" = "XU" ]; then
  642. printf " ============================\n"
  643. printf " = ODROID %s BOOT MENU %s =\n" "${O_BOARD}" "${SCRIPT_VERSION}"
  644. printf " ============================\n"
  645. else
  646. printf " =================================\n"
  647. printf " = ODROID XU3/XU4 BOOT MENU %s =\n" "${SCRIPT_VERSION}"
  648. printf " =================================\n"
  649. fi
  650. if [ "${NUMCARDS}" = "2" ]; then
  651. printf "\033[22m Two cards detected, booted from \033[1m%s\033[22m\033[37m\n\n" "${BOOT_CARDTYPE}"
  652. else
  653. printf "\033[22m Booted from \033[1m%s\033[22m\033[37m\n\n" "${BOOT_CARDTYPE}"
  654. fi
  655. #===================================================
  656. # === Detect available OS's and print menu items ===
  657. #===================================================
  658. _menu_no=49
  659. # Scan boot card first
  660. _actmount="mnt1"
  661. if [ -b /dev/disk/by-label/sduserdata ] || [ -b /dev/disk/by-label/emuserdata ]; then
  662. get_menu_items
  663. if [ "${NUMCARDS}" = "2" ]; then
  664. _actmount="mnt2"
  665. [ ! ${_numos} -eq 0 ] && printf "\n"
  666. get_menu_items
  667. fi
  668. [ ${_numos} -eq 0 ] && printf "\033[36m \033[36m\033[1m!\033[22m NO OS DETECTED\033[36m\n"
  669. else
  670. [ ${_numos} -eq 0 ] && printf "\033[36m \033[36m\033[1m!\033[22m NO MULTIBOOT CARD DETECTED\033[36m\n"
  671. fi
  672. printf "\n"
  673. printf " \033[36m\033[1mB\033[22m Backup Android/Linux/OpenElec\033[36m\n"
  674. printf " \033[36m\033[1mU\033[22m Update Android\033[36m\n"
  675. printf " \033[33m\033[1mI\033[22m Prepare the card for MultiBoot, Install OS's\033[36m\n"
  676. printf "\n"
  677. printf " \033[36m\033[1mX\033[22m Exit to busybox shell\033[36m\n"
  678. printf " \033[33m\033[1mR\033[22m Reboot\033[36m\n"
  679. printf "\n"
  680. printf "\n"
  681. # === Get default boot ===
  682. if [ "${DEFAULTBOOT}" = "1" ] && [ ! "${_menuitem_1}" = "none" ]; then
  683. _defboot="${_menuitem_1}"
  684. _defdescr="${_mndscr_1}"
  685. _defcard="${_mncrd_1}"
  686. elif [ "${DEFAULTBOOT}" = "2" ] && [ ! "${_menuitem_2}" = "none" ]; then
  687. _defboot="${_menuitem_2}"
  688. _defdescr="${_mndscr_2}"
  689. _defcard="${_mncrd_2}"
  690. elif [ "${DEFAULTBOOT}" = "3" ] && [ ! "${_menuitem_3}" = "none" ]; then
  691. _defboot="${_menuitem_3}"
  692. _defdescr="${_mndscr_3}"
  693. _defcard="${_mncrd_3}"
  694. elif [ "${DEFAULTBOOT}" = "4" ] && [ ! "${_menuitem_4}" = "none" ]; then
  695. _defboot="${_menuitem_4}"
  696. _defdescr="${_mndscr_4}"
  697. _defcard="${_mncrd_4}"
  698. elif [ "${DEFAULTBOOT}" = "5" ] && [ ! "${_menuitem_5}" = "none" ]; then
  699. _defboot="${_menuitem_5}"
  700. _defdescr="${_mndscr_5}"
  701. _defcard="${_mncrd_5}"
  702. elif [ "${DEFAULTBOOT}" = "6" ] && [ ! "${_menuitem_6}" = "none" ]; then
  703. _defboot="${_menuitem_6}"
  704. _defdescr="${_mndscr_6}"
  705. _defcard="${_mncrd_6}"
  706. elif [ "${DEFAULTBOOT}" = "7" ] && [ ! "${_menuitem_7}" = "none" ]; then
  707. _defboot="${_menuitem_7}"
  708. _defdescr="${_mndscr_7}"
  709. _defcard="${_mncrd_7}"
  710. elif [ "${DEFAULTBOOT}" = "8" ] && [ ! "${_menuitem_8}" = "none" ]; then
  711. _defboot="${_menuitem_8}"
  712. _defdescr="${_mndscr_8}"
  713. _defcard="${_mncrd_8}"
  714. fi
  715. if [ "${_defboot}" = "none" ]; then
  716. if [ ! "${_menuitem_1}" = "none" ]; then
  717. _defboot="${_menuitem_1}"
  718. _defdescr="${_mndscr_1}"
  719. _defcard="${_mncrd_1}"
  720. DEFAULTBOOT="1"
  721. elif [ ! "${_menuitem_2}" = "none" ]; then
  722. _defboot="${_menuitem_2}"
  723. _defdescr="${_mndscr_2}"
  724. _defcard="${_mncrd_2}"
  725. DEFAULTBOOT="2"
  726. elif [ ! "${_menuitem_3}" = "none" ]; then
  727. _defboot="${_menuitem_3}"
  728. _defdescr="${_mndscr_3}"
  729. _defcard="${_mncrd_3}"
  730. DEFAULTBOOT="3"
  731. elif [ ! "${_menuitem_4}" = "none" ]; then
  732. _defboot="${_menuitem_4}"
  733. _defdescr="${_mndscr_4}"
  734. _defcard="${_mncrd_4}"
  735. DEFAULTBOOT="4"
  736. elif [ ! "${_menuitem_5}" = "none" ]; then
  737. _defboot="${_menuitem_5}"
  738. _defdescr="${_mndscr_5}"
  739. _defcard="${_mncrd_5}"
  740. DEFAULTBOOT="5"
  741. elif [ ! "${_menuitem_6}" = "none" ]; then
  742. _defboot="${_menuitem_6}"
  743. _defdescr="${_mndscr_6}"
  744. _defcard="${_mncrd_6}"
  745. DEFAULTBOOT="6"
  746. elif [ ! "${_menuitem_7}" = "none" ]; then
  747. _defboot="${_menuitem_7}"
  748. _defdescr="${_mndscr_7}"
  749. _defcard="${_mncrd_7}"
  750. DEFAULTBOOT="7"
  751. elif [ ! "${_menuitem_8}" = "none" ]; then
  752. _defboot="${_menuitem_8}"
  753. _defdescr="${_mndscr_8}"
  754. _defcard="${_mncrd_8}"
  755. DEFAULTBOOT="8"
  756. fi
  757. fi
  758. }
  759. #-----------------------------------------------------------------------------------------------------------------
  760. os_detect
  761. # ======================================
  762. # === Main loop, never exit ===
  763. # === Wait for user OS/action select ===
  764. # ======================================
  765. _boot_delay=$BOOTDELAY
  766. # === Detect available Operating Systems ===
  767. while true; do
  768. printf "\r\033[2K"
  769. printf "\033[37m Select an option or boot to menu item \033[36m\033[1m%s\033[22m in\033[31m\033[1m %s \033[22m\033[37mseconds" "${DEFAULTBOOT}" "${_boot_delay}"
  770. A="Z"
  771. if read -n 1 -t 1 -s A; then
  772. _boot_delay=$BOOTDELAY
  773. if [ "${A}" = "B" ]; then
  774. # === BACKUP ===
  775. if [ -f /backup.script ]; then
  776. umount /mnt1 > /dev/null 2>&1
  777. umount /mnt2 > /dev/null 2>&1
  778. sleep 1
  779. # =========================
  780. # Execute the backup script
  781. /backup.script
  782. # =========================
  783. A="Z"
  784. os_detect
  785. _boot_delay=$BOOTDELAY
  786. else
  787. printf "\r\033[2K"
  788. printf " BACKUP SCRIPT NOT FOUND!"
  789. sleep 4
  790. fi
  791. elif [ "${A}" = "I" ]; then
  792. # === UNIVERSAL INSTALLER ===
  793. if [ -f /install.script ]; then
  794. umount /mnt1 > /dev/null 2>&1
  795. umount /mnt2 > /dev/null 2>&1
  796. sleep 1
  797. # ============================
  798. # Execute the installer script
  799. UPGRADE_ANDROID="no"
  800. /install.script
  801. # ============================
  802. A="Z"
  803. os_detect
  804. _boot_delay=$BOOTDELAY
  805. else
  806. printf "\r\033[2K"
  807. printf " INSTALL SCRIPT NOT FOUND!"
  808. sleep 4
  809. fi
  810. elif [ "${A}" = "U" ]; then
  811. # === ANDROID UPGRADE ====
  812. if [ -f /install.script ]; then
  813. umount /mnt1 > /dev/null 2>&1
  814. umount /mnt2 > /dev/null 2>&1
  815. sleep 1
  816. # =========================
  817. # Execute the backup script
  818. UPGRADE_ANDROID="yes"
  819. /install.script
  820. # =========================
  821. A="Z"
  822. os_detect
  823. _boot_delay=$BOOTDELAY
  824. else
  825. printf "\r\033[2K"
  826. printf " BACKUP SCRIPT NOT FOUND!"
  827. sleep 4
  828. fi
  829. elif [ "${A}" = "X" ]; then
  830. # === ENTER BUSYBOX ===
  831. clear
  832. printf "\n\n\n Entering \033[32mBusybox\033[37m shell\n"
  833. printf " Execute \033[32mexit\033[37m to return to menu\n\n"
  834. umount /mnt1 > /dev/null 2>&1
  835. umount /mnt2 > /dev/null 2>&1
  836. sleep 1
  837. #For C2 show cursor
  838. [ ! "${O_BOARD}" = "XU" ] && tput cnorm
  839. #===============
  840. break="bbox"
  841. maybe_break bbox
  842. #===============
  843. printf "\n \033[32mBusybox exited\033[37m\n"
  844. sleep 2
  845. #For C2 hide cursor
  846. [ ! "${O_BOARD}" = "XU" ] && tput civis
  847. A="Z"
  848. os_detect
  849. _boot_delay=$BOOTDELAY
  850. elif [ "${A}" = "R" ]; then
  851. # REBOOT ===
  852. _reboot_delay=10
  853. B="X"
  854. while [ $_reboot_delay -gt 0 ]; do
  855. printf "\r\033[2K"
  856. printf " \033[33m\033[1mREBOOT in %s sec, press \033[22ma\033[1m to abort, \033[22mr\033[1m to reboot \033[22m\033[37m\r" "$_reboot_delay"
  857. if read -n 1 -t 1 -s B; then
  858. _reboot_delay=10
  859. if [ "${B}" = "a" ] || [ "${B}" = "A" ]; then
  860. printf "\r\033[2K"
  861. break
  862. elif [ "${B}" = "r" ] || [ "${B}" = "R" ]; then
  863. _reboot_delay=0
  864. break
  865. fi
  866. else
  867. let _reboot_delay=_reboot_delay-1
  868. fi
  869. done
  870. if [ $_reboot_delay -eq 0 ]; then
  871. cp -f /*.ppm /mnt1 > /dev/null 2>&1
  872. umount /mnt1 > /dev/null 2>&1
  873. umount /mnt2 > /dev/null 2>&1
  874. reboot
  875. fi
  876. elif [ "${A}" = "s" ]; then
  877. # SCREENSHOT ===
  878. fbcat > /mb_menu.ppm
  879. elif [ $_numos -gt 0 ]; then
  880. # === BOOT to selected OS
  881. boot_fail="no"
  882. [ "${A}" = "1" ] && [ ! "${_menuitem_1}" = "none" ] && do_boot "${_menuitem_1}" "${_mndscr_1}" "${_mncrd_1}"
  883. [ "${A}" = "2" ] && [ ! "${_menuitem_2}" = "none" ] && do_boot "${_menuitem_2}" "${_mndscr_2}" "${_mncrd_2}"
  884. [ "${A}" = "3" ] && [ ! "${_menuitem_3}" = "none" ] && do_boot "${_menuitem_3}" "${_mndscr_3}" "${_mncrd_3}"
  885. [ "${A}" = "4" ] && [ ! "${_menuitem_4}" = "none" ] && do_boot "${_menuitem_4}" "${_mndscr_4}" "${_mncrd_4}"
  886. [ "${A}" = "5" ] && [ ! "${_menuitem_5}" = "none" ] && do_boot "${_menuitem_5}" "${_mndscr_5}" "${_mncrd_5}"
  887. [ "${A}" = "6" ] && [ ! "${_menuitem_6}" = "none" ] && do_boot "${_menuitem_6}" "${_mndscr_6}" "${_mncrd_6}"
  888. [ "${A}" = "7" ] && [ ! "${_menuitem_7}" = "none" ] && do_boot "${_menuitem_7}" "${_mndscr_7}" "${_mncrd_7}"
  889. [ "${A}" = "8" ] && [ ! "${_menuitem_8}" = "none" ] && do_boot "${_menuitem_8}" "${_mndscr_8}" "${_mncrd_8}"
  890. if [ "${boot_fail}" = "yes" ]; then
  891. # === BOOT ERROR ===
  892. sleep 4
  893. os_detect
  894. _boot_delay=$BOOTDELAY
  895. fi
  896. fi
  897. else
  898. let _boot_delay=_boot_delay-1
  899. if [ $_boot_delay -eq 0 ]; then
  900. # Default boot
  901. [ $_numos -gt 0 ] && [ ! "${_defboot}" = "none" ] && do_boot "${_defboot}" "${_defdescr}" "${_defcard}"
  902. # === BOOT ERROR ===
  903. sleep 4
  904. os_detect
  905. _boot_delay=$BOOTDELAY
  906. fi
  907. fi
  908. printf "\r"
  909. done
  910. # Just in case...
  911. printf "\n\n"
  912. umount /mnt1 > /dev/null 2>&1
  913. umount /mnt2 > /dev/null 2>&1
  914. printf "\033[36m REBOOT ...\n"
  915. reboot
  916. #---------------------------------------------------------------------------