install.script 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158
  1. #!/bin/bash
  2. # === Detect instalation source ===
  3. echo "1 1 1 1" > /proc/sys/kernel/printk
  4. mkdir /mnt > /dev/null 2>&1
  5. mkdir /multiboot > /dev/null 2>&1
  6. mkdir /run/inst > /dev/null 2>&1
  7. #-------------------------------------------------------
  8. print_header() {
  9. clear
  10. printf "\n"
  11. printf "\n"
  12. printf "\033[36m\033[1m\n"
  13. if [ "${O_BOARD}" = "C2" ]; then
  14. printf " ======================================\n"
  15. printf " = Odroid C2 Universal installer %s =\n" "${SCRIPT_VERSION}"
  16. printf " ======================================\n"
  17. else
  18. printf " ===========================================\n"
  19. printf " = Odroid XU3/XU4 Universal installer %s =\n" "${SCRIPT_VERSION}"
  20. printf " ===========================================\n"
  21. fi
  22. printf "\033[22m\033[37m\n"
  23. }
  24. #-------------------------------------------------------
  25. print_header
  26. # Set variables
  27. CARD1=""
  28. CARD2=""
  29. CARD1_EMMC=""
  30. CARD2_EMMC=""
  31. DEST_CARD=""
  32. DEST_EMMC=""
  33. INST_ANDROID=""
  34. INST_OELEC=""
  35. INST_LINUX=""
  36. INST_LINUX2=""
  37. A_FROMDIR=""
  38. L_FROMDIR=""
  39. L2_FROMDIR=""
  40. O_FROMDIR=""
  41. INST_DELAY=60
  42. SYSTEM_SIZE=1024
  43. SYSTEM_MINSIZE=768
  44. DATA_SIZE=1024
  45. DATA_MINSIZE=1024
  46. CACHE_SIZE=256
  47. CACHE_MINSIZE=128
  48. USERDATA_SIZE=1024
  49. USERDATA_MINSIZE=512
  50. LINUX_SIZE=2048
  51. LINUX_MINSIZE=2048
  52. LINUX2_SIZE=2048
  53. LINUX2_MINSIZE=2048
  54. OELEC_SIZE=512
  55. OELEC_MINSIZE=512
  56. LINUX_FSTYPE="ext4"
  57. #-----------------------------------------------------
  58. # Check card type
  59. #----------------
  60. CARD1="/dev/mmcblk${BOOT_CARDDEV}"
  61. CARD1_EMMC="${BOOT_CARDTYPE}"
  62. if [ "${NUMCARDS}" = "2" ]; then
  63. CARD2="/dev/mmcblk${OTHER_CARDDEV}"
  64. CARD2_EMMC="${OTHER_CARDTYPE}"
  65. fi
  66. #-----------------------------------------------------
  67. #-----------------------------------------------------
  68. # Check where the installation files are located
  69. check_source() {
  70. local _instfound="no"
  71. if [ -b ${1} ]; then
  72. /bin/mountx ${1} /mnt > /dev/null 2>&1
  73. [ $? -ne 0 ] && return 1
  74. else
  75. return 1
  76. fi
  77. sleep 1
  78. # === Source drive found and 1st partition mounted on /mnt ===
  79. # === Check installation files on source drive ===
  80. # ANDROID
  81. if [ -d /mnt/${BKP_PREFIX}_backup/android ]; then
  82. if [ -f /mnt/${BKP_PREFIX}_backup/android/system.raw.img ]; then
  83. INST_ANDROID="yes"
  84. _instfound="yes"
  85. A_FROMDIR="yes"
  86. fi
  87. else
  88. if [ -f /mnt/update.tar.gz ] || [ -f /mnt/update.zip ]; then
  89. INST_ANDROID="yes"
  90. _instfound="yes"
  91. if [ "${1}" = "/dev/mmcblk0p1" ] || [ "${1}" = "/dev/mmcblk1p1" ]; then
  92. return 0
  93. fi
  94. fi
  95. fi
  96. # LINUX
  97. if [ -d /mnt/${BKP_PREFIX}_backup/linux ]; then
  98. if [ -f /mnt/${BKP_PREFIX}_backup/linux/linux.img ]; then
  99. INST_LINUX="yes"
  100. _instfound="yes"
  101. L_FROMDIR="yes"
  102. fi
  103. else
  104. if [ -f /mnt/linux.img ]; then
  105. INST_LINUX="yes"
  106. _instfound="yes"
  107. fi
  108. fi
  109. # LINUX2
  110. if [ "${INST_LINUX}" = "yes" ]; then
  111. if [ -d /mnt/${BKP_PREFIX}_backup/linux2 ]; then
  112. if [ -f /mnt/${BKP_PREFIX}_backup/linux2/linux.img ]; then
  113. INST_LINUX2="yes"
  114. _instfound="yes"
  115. L2_FROMDIR="yes"
  116. fi
  117. else
  118. if [ -f /mnt/linux2.img ]; then
  119. INST_LINUX2="yes"
  120. fi
  121. fi
  122. fi
  123. if [ -d /mnt/${BKP_PREFIX}_backup/oelec/target ] && [ -d /mnt/${BKP_PREFIX}_backup/oelec/3rdparty ]; then
  124. INST_OELEC="yes"
  125. O_FROMDIR="yes"
  126. else
  127. if [ -f /mnt/oelec.tar ]; then
  128. INST_OELEC="yes"
  129. fi
  130. fi
  131. [ "${_instfound}" = "no" ] && return 1
  132. return 0
  133. }
  134. #-----------------------------------------------------
  135. #----------------------------------------------------------------------------------------------------
  136. exit_script() {
  137. local _delay=60
  138. local B="X"
  139. echo ""
  140. while [ $_delay -gt 0 ]; do
  141. printf " \033[33mPress \033[1mE\033[22m to exit to main menu (%s) \033[37m\r" "${_delay}"
  142. if read -n 1 -t 1 -s B; then
  143. _delay=60
  144. if [ "${B}" = "E" ] || [ "${B}" = "e" ]; then
  145. break
  146. elif [ "${B}" = "s" ]; then
  147. # SCREENSHOT ===
  148. fbcat > /install_exit.ppm
  149. fi
  150. else
  151. let _delay=_delay-1
  152. fi
  153. done
  154. printf "\r\033[2K"
  155. umount /mnt1 > /dev/null 2>&1
  156. umount /mnt2 > /dev/null 2>&1
  157. umount /mnt > /dev/null 2>&1
  158. exit 0
  159. }
  160. #----------------------------------------------------------------------------------------------------
  161. print_header
  162. # === Copy multiboot files from boot drive to RAMfs directory ===
  163. mount -t vfat /dev/mmcblk${BOOT_CARDDEV}p1 /mnt > /dev/null 2>&1
  164. if [ $? -ne 0 ]; then
  165. printf " ERROR mounting boot card"
  166. exit_script
  167. fi
  168. cp /mnt/multiboot/*.multi /multiboot > /dev/null 2>&1
  169. if [ $? -ne 0 ]; then
  170. printf " ERROR copying multiboot files"
  171. exit_script
  172. fi
  173. umount /mnt > /dev/null 2>&1
  174. if [ $? -ne 0 ]; then
  175. printf " ERROR unmounting boot card"
  176. exit_script
  177. fi
  178. sleep 1
  179. #=================================================
  180. printf " Searching for installation drive ... "
  181. # === Set default dest card to sdcard if exists ===
  182. DEST_CARD=${CARD1}
  183. DEST_EMMC=${CARD1_EMMC}
  184. if [ "${NUMCARDS}" = "2" ]; then
  185. DEST_CARD=${CARD2}
  186. DEST_EMMC=${CARD2_EMMC}
  187. fi
  188. check_source "/dev/sda1"
  189. if [ $? -ne 0 ]; then
  190. check_source "/dev/sda2"
  191. if [ $? -ne 0 ]; then
  192. check_source "/dev/sda3"
  193. if [ $? -ne 0 ]; then
  194. check_source "/dev/sda4"
  195. if [ $? -ne 0 ]; then
  196. printf " \033[33m\033[1mNOT FOUND\033[22m\033[37m\n"
  197. printf " \033[33m\033[1mInstallation aborted.\033[22m\033[37m\n\n"
  198. exit_script
  199. fi
  200. fi
  201. fi
  202. fi
  203. if [ ! "${INST_ANDROID}" = "yes" ]; then
  204. SYSTEM_MINSIZE=8
  205. DATA_MINSIZE=8
  206. SYSTEM_SIZE=8
  207. DATA_SIZE=8
  208. CACHE_SIZE=8
  209. CACHE_MINSIZE=8
  210. USERDATA_MINSIZE=256
  211. USERDATA_SIZE=256
  212. fi
  213. if [ ! "${INST_OELEC}" = "yes" ]; then
  214. OELEC_MINSIZE=8
  215. OELEC_SIZE=512
  216. fi
  217. if [ ! "${INST_LINUX}" = "yes" ]; then
  218. LINUX_MINSIZE=8
  219. LINUX_SIZE=8
  220. fi
  221. if [ "${INST_LINUX2}" = "yes" ]; then
  222. let LINUX_MINSIZE=LINUX_MINSIZE+LINUX_MINSIZE
  223. let LINUX_SIZE=LINUX_SIZE+LINUX_SIZE
  224. else
  225. LINUX2_MINSIZE=0
  226. LINUX2_SIZE=0
  227. fi
  228. #=================================================
  229. #=================================================
  230. if [ "${O_BOARD}" = "C2" ]; then
  231. part_start=65536 # RESERVE 32M AT CARD START
  232. else
  233. part_start=131072 # RESERVE 64MB AT CARD START
  234. fi
  235. PARTSIZE_INC=128
  236. export CARD_SIZE=8000
  237. export ONLY_ANDROID="no"
  238. export ONLY_LINUX="no"
  239. export MULTI_BOOT="yes"
  240. export source_mount="/mnt"
  241. export TWO_CARDS="no"
  242. rm /mnt/install.log > /dev/null 2>&1
  243. log_file="/mnt/install.log"
  244. #log_file="ls/dev/null"
  245. #--------------------------------------------------------------------------------------------------------------------------------------
  246. if [ "${INST_LINUX}" = "yes" ] && [ "${INST_ANDROID}" != "yes" ] && [ "${INST_OELEC}" != "yes" ] && [ "${INST_LINUX2}" != "yes" ]; then
  247. ONLY_LINUX="yes"
  248. MULTI_BOOT="no"
  249. fi
  250. if [ "${INST_ANDROID}" = "yes" ] && [ "${INST_LINUX}" != "yes" ] && [ "${INST_OELEC}" != "yes" ]; then
  251. ONLY_ANDROID="yes"
  252. MULTI_BOOT="no"
  253. fi
  254. if [ "${CARD1}" != "" ] && [ "${CARD1}" != "" ]; then
  255. TWO_CARDS="yes"
  256. fi
  257. #-----------------------------------------------------------------------------------------------------
  258. #---------------------------------------------------------------------------------
  259. # Detect and set installation card size, leave 32M at end unused
  260. set_cardsize() {
  261. _card_sectno=`fdisk -l ${DEST_CARD} | grep "Disk ${DEST_CARD}" | awk '{print $7}'`
  262. CARD_SIZE=$(( ( $_card_sectno - $part_start - 65536 ) / 2048))
  263. }
  264. #---------------------------------------------------------------------------------
  265. #--------------------------------------------------------------------------------------------------------
  266. # Set linux or userdata partition size to fill card size
  267. set_auto_partsize() {
  268. if [ "${INST_LINUX}" = "yes" ]; then
  269. LINUX_SIZE=$(( $CARD_SIZE - $USERDATA_SIZE - $SYSTEM_SIZE - $DATA_SIZE -$CACHE_SIZE - $OELEC_SIZE))
  270. if [ "${LINUX_SIZE}" -lt "${LINUX_MINSIZE}" ]; then
  271. LINUX_SIZE=${LINUX_MINSIZE}
  272. return 1
  273. else
  274. return 0
  275. fi
  276. else
  277. USERDATA_SIZE=$(( $CARD_SIZE - $SYSTEM_SIZE - $DATA_SIZE -$CACHE_SIZE - $OELEC_SIZE - $LINUX_SIZE))
  278. if [ "${USERDATA_SIZE}" -lt "${USERDATA_MINSIZE}" ]; then
  279. USERDATA_SIZE=${USERDATA_MINSIZE}
  280. return 1
  281. else
  282. return 0
  283. fi
  284. fi
  285. }
  286. #--------------------------------------------------------------------------------------------------------
  287. #---------------------------------------------------------------------------------------------------------------------------
  288. # shellcheck disable=SC2059
  289. print_settings() {
  290. set_auto_partsize
  291. printf " Install:"
  292. if [ "${INST_ANDROID}" = "yes" ]; then
  293. printf " \033[36mAndroid\033[37m from "
  294. if [ "${A_FROMDIR}" = "yes" ]; then
  295. printf "backup"
  296. else
  297. printf "image"
  298. fi
  299. if [ "${MULTI_BOOT}" = "yes" ]; then
  300. printf "\033[32m &\033[37m"
  301. fi
  302. fi
  303. if [ "${INST_LINUX}" = "yes" ]; then
  304. printf " \033[36mLinux\033[37m from "
  305. if [ "${L_FROMDIR}" = "yes" ]; then
  306. printf "backup"
  307. else
  308. printf "image"
  309. fi
  310. if [ "${MULTI_BOOT}" = "yes" ] && [ "${INST_OELEC}" = "yes" ]; then
  311. printf "\033[32m &\033[37m"
  312. fi
  313. if [ "${INST_LINUX2}" = "yes" ]; then
  314. printf " \033[36mLinux2\033[37m from "
  315. if [ "${L2_FROMDIR}" = "yes" ]; then
  316. printf "backup"
  317. else
  318. printf "image"
  319. fi
  320. if [ "${MULTI_BOOT}" = "yes" ] && [ "${INST_OELEC}" = "yes" ]; then
  321. printf "\033[32m &\033[37m"
  322. fi
  323. fi
  324. fi
  325. if [ "${INST_OELEC}" = "yes" ]; then
  326. printf " \033[36mOpenElec\033[37m from "
  327. if [ "${O_FROMDIR}" = "yes" ]; then
  328. printf "backup"
  329. else
  330. printf "image"
  331. fi
  332. fi
  333. printf "\033[37m\n"
  334. printf " Install to: \033[36m${DEST_EMMC} Card (${DEST_CARD})\033[37m (${CARD_SIZE}M)\n"
  335. printf " Installation type: \033[36m"
  336. if [ "${ONLY_LINUX}" = "yes" ]; then
  337. printf "Linux"
  338. elif [ "${ONLY_ANDROID}" = "yes" ]; then
  339. printf "Android"
  340. else
  341. printf "Multi Boot"
  342. fi
  343. printf "\033[37m\n\n"
  344. printf " Card size: \033[36m${CARD_SIZE}M\033[37m\n"
  345. if [ "${ONLY_LINUX}" = "yes" ]; then
  346. printf " boot partition size: \033[36m${USERDATA_SIZE}M\033[37m\n"
  347. else
  348. printf " userdata partition size: \033[36m${USERDATA_SIZE}M\033[37m\n"
  349. fi
  350. [ "${ONLY_LINUX}" != "yes" ] && printf " system partition size: \033[36m${SYSTEM_SIZE}M\033[37m\n"
  351. [ "${ONLY_LINUX}" != "yes" ] && printf " data partition size: \033[36m${DATA_SIZE}M\033[37m\n"
  352. [ "${INST_ANDROID}" = "yes" ] && printf " cache partition size: \033[36m${CACHE_SIZE}M\033[37m\n"
  353. if [ "${INST_OELEC}" = "yes" ]; then
  354. [ "${MULTI_BOOT}" = "yes" ] && printf " openELEC partition size: \033[36m${OELEC_SIZE}M\033[37m\n"
  355. else
  356. [ "${MULTI_BOOT}" = "yes" ] && printf " swap/aux partition size: \033[36m${OELEC_SIZE}M\033[37m\n"
  357. fi
  358. if [ "${INST_LINUX}" = "yes" ]; then
  359. if [ "${INST_LINUX2}" = "yes" ]; then
  360. printf " linux 1&2 partition size: \033[36m${LINUX_SIZE}M\033[37m\n"
  361. else
  362. printf " linux partition size: \033[36m${LINUX_SIZE}M\033[37m\n"
  363. fi
  364. fi
  365. [ "${INST_LINUX}" = "yes" ] && printf " linux file system type: \033[36m${LINUX_FSTYPE}\033[37m\n"
  366. printf "\033[36m\n"
  367. [ "${TWO_CARDS}" = "yes" ] && printf " \033[32m\033[1m1\033[22m Change installation \033[1mcard\033[22m\033[36m\n"
  368. if [ "${INST_LINUX}" = "yes" ]; then
  369. printf " \033[32m\033[1m2\033[22m Change \033[1m"
  370. if [ "${ONLY_LINUX}" = "yes" ]; then
  371. printf "boot"
  372. else
  373. printf "userdata"
  374. fi
  375. printf "\033[22m partition size\033[36m\n"
  376. fi
  377. [ "${INST_ANDROID}" = "yes" ] && printf " \033[32m\033[1m3\033[22m Change \033[1msystem\033[22m partition size\033[36m\n"
  378. [ "${INST_ANDROID}" = "yes" ] && printf " \033[32m\033[1m4\033[22m Change \033[1mdata\033[22m partition size\033[36m\n"
  379. [ "${INST_ANDROID}" = "yes" ] && printf " \033[32m\033[1m5\033[22m Change \033[1mcache\033[22m partition size\033[36m\n"
  380. if [ "${INST_OELEC}" = "yes" ]; then
  381. [ "${MULTI_BOOT}" = "yes" ] && printf " \033[32m\033[1m6\033[22m Change \033[1moElec\033[22m partition size\033[36m\n"
  382. else
  383. [ "${MULTI_BOOT}" = "yes" ] && printf " \033[32m\033[1m6\033[22m Change \033[1mswap/aux\033[22m partition size\033[36m\n"
  384. fi
  385. if [ "${INST_LINUX}" = "yes" ]; then
  386. if [ "${INST_LINUX2}" = "yes" ]; then
  387. printf " \033[32m\033[1mL\033[22m Change \033[1mLinux 2\033[22m partition size\033[36m\n"
  388. fi
  389. printf "\n"
  390. printf " \033[32m\033[1mt\033[22m Change Linux \033[1mfile system type\033[22m\033[36m\n"
  391. printf "\n"
  392. else
  393. printf "\n"
  394. fi
  395. printf " \033[35m\033[1mI\033[22m Start installation\033[36m\n"
  396. printf "\n"
  397. printf " \033[33m\033[1mE\033[22m EXIT\033[36m\n"
  398. printf "\033[37m\n"
  399. if [ "${LINUX_FSTYPE}" = "btrfs" ]; then
  400. printf "\033[32m\033[1m WARNING\033[22m: only install to btrfs if Linux install image is prepared for it\n"
  401. printf " if not shure, use ext4\033[36m\n"
  402. fi
  403. }
  404. #---------------------------------------------------------------------------------------------------------------------------
  405. #---- Select destination card -------------------------------------------------------------------------
  406. # shellcheck disable=SC2059
  407. set_dest() {
  408. printf " Press \033[35m+\033[37m key to change installation card, \033[35m9\033[37m to select\n\n"
  409. _wait_delay=30
  410. while [ $_wait_delay -gt 0 ]; do
  411. printf " Install to: \033[36m${DEST_EMMC} Card (${DEST_CARD})\033[37m \r"
  412. if read -n 1 -t 1 -s A; then
  413. _wait_delay=30
  414. if [ "${A}" = "+" ]; then
  415. if [ "${NUMCARDS}" = "2" ]; then
  416. if [ "${DEST_CARD}" = "${CARD1}" ]; then
  417. if [ ! "${CARD2}" = "" ]; then
  418. DEST_CARD=${CARD2}
  419. DEST_EMMC=${CARD2_EMMC}
  420. fi
  421. elif [ "${DEST_CARD}" = "${CARD2}" ]; then
  422. if [ ! "${CARD1}" = "" ]; then
  423. DEST_CARD=${CARD1}
  424. DEST_EMMC=${CARD1_EMMC}
  425. fi
  426. fi
  427. elif [ "${O_BOARD}" = "C2" ]; then
  428. if [ "${DEST_EMMC}" = "SD" ]; then
  429. DEST_EMMC="EMMC"
  430. else
  431. DEST_EMMC="SD"
  432. fi
  433. fi
  434. elif [ "${A}" = "9" ]; then
  435. set_cardsize
  436. break
  437. fi
  438. else
  439. let _wait_delay=_wait_delay-1
  440. fi
  441. printf "\r"
  442. done
  443. }
  444. #-----------------------------------------------------------------------------
  445. #---- Set Linux fs type -------------------------------------------------------------------------
  446. # shellcheck disable=SC2059
  447. set_linfstype() {
  448. printf " Press \033[35m+\033[37m key to change Linux filesystem type, \033[35m9\033[37m to select\n\n"
  449. _wait_delay=30
  450. while [ $_wait_delay -gt 0 ]; do
  451. printf " Linux fs type: \033[36m${LINUX_FSTYPE}\033[37m \r"
  452. if read -n 1 -t 1 -s A; then
  453. _wait_delay=30
  454. if [ "${A}" = "+" ]; then
  455. if [ "${LINUX_FSTYPE}" = "btrfs" ]; then
  456. LINUX_FSTYPE="ext4"
  457. else
  458. LINUX_FSTYPE="btrfs"
  459. fi
  460. elif [ "${A}" = "9" ]; then
  461. break
  462. fi
  463. else
  464. let _wait_delay=_wait_delay-1
  465. fi
  466. printf "\r"
  467. done
  468. }
  469. #-----------------------------------------------------------------------------
  470. #----------------------------------------------------------------------------------------------------------------------------
  471. # shellcheck disable=SC2059
  472. set_systemsize() {
  473. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change system partition size, \033[35m9\033[37m to select\n\n"
  474. _wait_delay=30
  475. while [ $_wait_delay -gt 0 ]; do
  476. printf " system partition size: \033[36m${SYSTEM_SIZE}M\033[37m \r"
  477. if read -n 1 -t 1 -s A; then
  478. _wait_delay=30
  479. if [ "${A}" = "+" ]; then
  480. let SYSTEM_SIZE=SYSTEM_SIZE+PARTSIZE_INC
  481. set_auto_partsize
  482. if [ $? -ne 0 ]; then
  483. let SYSTEM_SIZE=SYSTEM_SIZE-PARTSIZE_INC
  484. set_auto_partsize
  485. fi
  486. elif [ "${A}" = "-" ]; then
  487. let SYSTEM_SIZE=SYSTEM_SIZE-${PARTSIZE_INC}
  488. [ $SYSTEM_SIZE -lt $SYSTEM_MINSIZE ] && SYSTEM_SIZE=$SYSTEM_MINSIZE
  489. set_auto_partsize
  490. elif [ "${A}" = "9" ]; then
  491. break
  492. fi
  493. else
  494. let _wait_delay=_wait_delay-1
  495. fi
  496. printf "\r"
  497. done
  498. }
  499. #----------------------------------------------------------------------------------------------------------------------------
  500. #--------------------------------------------------------------------------------------------------------------------------
  501. # shellcheck disable=SC2059
  502. set_datasize() {
  503. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change data partition size, \033[35m9\033[37m to select\n\n"
  504. _wait_delay=30
  505. while [ $_wait_delay -gt 0 ]; do
  506. printf " data partition size: \033[36m${DATA_SIZE}M\033[37m \r"
  507. if read -n 1 -t 1 -s A; then
  508. _wait_delay=30
  509. if [ "${A}" = "+" ]; then
  510. let DATA_SIZE=DATA_SIZE+PARTSIZE_INC
  511. set_auto_partsize
  512. if [ $? -ne 0 ]; then
  513. let DATA_SIZE=DATA_SIZE-PARTSIZE_INC
  514. set_auto_partsize
  515. fi
  516. elif [ "${A}" = "-" ]; then
  517. let DATA_SIZE=DATA_SIZE-PARTSIZE_INC
  518. [ $DATA_SIZE -lt $DATA_MINSIZE ] && DATA_SIZE=$DATA_MINSIZE
  519. set_auto_partsize
  520. elif [ "${A}" = "9" ]; then
  521. break
  522. fi
  523. else
  524. let _wait_delay=_wait_delay-1
  525. fi
  526. printf "\r"
  527. done
  528. }
  529. #--------------------------------------------------------------------------------------------------------------------------
  530. #------------------------------------------------------------------------------------------------------------------------------
  531. # shellcheck disable=SC2059
  532. set_userdatasize() {
  533. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change "
  534. if [ "${ONLY_LINUX}" = "yes" ]; then
  535. printf "boot"
  536. else
  537. printf "userdata"
  538. fi
  539. printf " partition size, \033[35m9\033[37m to select\n\n"
  540. _wait_delay=30
  541. while [ $_wait_delay -gt 0 ]; do
  542. if [ "${ONLY_LINUX}" = "yes" ]; then
  543. printf " boot"
  544. else
  545. printf " userdata"
  546. fi
  547. printf " partition size: \033[36m${USERDATA_SIZE}M\033[37m \r"
  548. if read -n 1 -t 1 -s A; then
  549. _wait_delay=30
  550. if [ "${A}" = "+" ]; then
  551. let USERDATA_SIZE=USERDATA_SIZE+PARTSIZE_INC
  552. set_auto_partsize
  553. if [ $? -ne 0 ]; then
  554. let USERDATA_SIZE=USERDATA_SIZE-PARTSIZE_INC
  555. set_auto_partsize
  556. fi
  557. elif [ "${A}" = "-" ]; then
  558. let USERDATA_SIZE=USERDATA_SIZE-PARTSIZE_INC
  559. [ $USERDATA_SIZE -lt $USERDATA_MINSIZE ] && USERDATA_SIZE=$USERDATA_MINSIZE
  560. set_auto_partsize
  561. elif [ "${A}" = "9" ]; then
  562. break
  563. fi
  564. else
  565. let _wait_delay=_wait_delay-1
  566. fi
  567. printf "\r"
  568. done
  569. }
  570. #------------------------------------------------------------------------------------------------------------------------------
  571. #------------------------------------------------------------------------------------------------------------------------------
  572. # shellcheck disable=SC2059
  573. set_cachesize() {
  574. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change cache partition size, \033[35m9\033[37m to select\n\n"
  575. _wait_delay=30
  576. while [ $_wait_delay -gt 0 ]; do
  577. printf " cache partition size: \033[36m${CACHE_SIZE}M\033[37m \r"
  578. if read -n 1 -t 1 -s A; then
  579. _wait_delay=30
  580. if [ "${A}" = "+" ]; then
  581. let CACHE_SIZE=CACHE_SIZE+PARTSIZE_INC
  582. set_auto_partsize
  583. if [ $? -ne 0 ]; then
  584. let CACHE_SIZE=CACHE_SIZE-PARTSIZE_INC
  585. set_auto_partsize
  586. fi
  587. elif [ "${A}" = "-" ]; then
  588. let CACHE_SIZE=CACHE_SIZE-PARTSIZE_INC
  589. [ ${CACHE_SIZE} -lt $CACHE_MINSIZE ] && CACHE_SIZE=$CACHE_MINSIZE
  590. set_auto_partsize
  591. elif [ "${A}" = "9" ]; then
  592. break
  593. fi
  594. else
  595. let _wait_delay=_wait_delay-1
  596. fi
  597. printf "\r"
  598. done
  599. }
  600. #------------------------------------------------------------------------------------------------------------------------------
  601. #------------------------------------------------------------------------------------------------------------------------------
  602. # shellcheck disable=SC2059
  603. set_linuxsize() {
  604. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change Linux 2 partition size, \033[35m9\033[37m to select\n\n"
  605. _wait_delay=30
  606. local _linux1size=1024
  607. while [ $_wait_delay -gt 0 ]; do
  608. printf " Linux 2 partition size: \033[36m${LINUX2_SIZE}M\033[37m \r"
  609. if read -n 1 -t 1 -s A; then
  610. _wait_delay=30
  611. if [ "${A}" = "+" ]; then
  612. let LINUX2_SIZE=LINUX2_SIZE+PARTSIZE_INC
  613. let _linux1size=LINUX_SIZE-LINUX2_SIZE
  614. if [ ${_linux1size} -lt $LINUX2_MINSIZE ]; then
  615. let LINUX2_SIZE=LINUX2_SIZE-PARTSIZE_INC
  616. fi
  617. elif [ "${A}" = "-" ]; then
  618. let LINUX2_SIZE=LINUX2_SIZE-PARTSIZE_INC
  619. [ ${LINUX2_SIZE} -lt $LINUX2_MINSIZE ] && LINUX2_SIZE=$LINUX2_MINSIZE
  620. elif [ "${A}" = "9" ]; then
  621. break
  622. fi
  623. else
  624. let _wait_delay=_wait_delay-1
  625. fi
  626. printf "\r"
  627. done
  628. }
  629. #------------------------------------------------------------------------------------------------------------------------------
  630. #------------------------------------------------------------------------------------------------------------------------------
  631. # shellcheck disable=SC2059
  632. set_oelecsize() {
  633. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change swap/aux partition size, \033[35m9\033[37m to select\n\n"
  634. _wait_delay=30
  635. while [ $_wait_delay -gt 0 ]; do
  636. if [ "${INST_OELEC}" = "yes" ]; then
  637. printf " openElec partition size: \033[36m${OELEC_SIZE}M\033[37m \r"
  638. else
  639. printf " swap/aux partition size: \033[36m${OELEC_SIZE}M\033[37m \r"
  640. fi
  641. if read -n 1 -t 1 -s A; then
  642. _wait_delay=30
  643. if [ "${A}" = "+" ]; then
  644. let OELEC_SIZE=OELEC_SIZE+PARTSIZE_INC
  645. set_auto_partsize
  646. if [ $? -ne 0 ]; then
  647. let OELEC_SIZE=OELEC_SIZE-PARTSIZE_INC
  648. set_auto_partsize
  649. fi
  650. elif [ "${A}" = "-" ]; then
  651. let OELEC_SIZE=OELEC_SIZE-PARTSIZE_INC
  652. [ ${OELEC_SIZE} -lt $OELEC_MINSIZE ] && OELEC_SIZE=$OELEC_MINSIZE
  653. set_auto_partsize
  654. elif [ "${A}" = "9" ]; then
  655. break
  656. fi
  657. else
  658. let _wait_delay=_wait_delay-1
  659. fi
  660. printf "\r"
  661. done
  662. }
  663. #------------------------------------------------------------------------------------------------------------------------------
  664. #-----------------------------------------------------
  665. # caclulate partitions boundaries in block unuts
  666. get_partsizes() {
  667. _userdata_size=$(( $USERDATA_SIZE * 2048))
  668. userpart_end=$(( $_userdata_size + $part_start))
  669. _system_size=$(( $SYSTEM_SIZE * 2048))
  670. _cache_size=$(( $CACHE_SIZE * 2048))
  671. syspart_start=$(( $userpart_end + 1))
  672. syspart_end=$(( $_system_size + $syspart_start))
  673. cachepart_start=$(( $syspart_end + 1))
  674. cachepart_end=$(( $_cache_size + $cachepart_start))
  675. extpart_start=$(( $cachepart_end + 1))
  676. }
  677. #-----------------------------------------------------
  678. #----------------------------------------------------------------------------------------
  679. # Partition and format installation card
  680. prepare_card() {
  681. echo "==== PREPARE CARD ====" >> ${log_file}
  682. if [ "${INST_LINUX}" = "yes" ]; then
  683. if [ "${INST_LINUX2}" = "yes" ]; then
  684. _linux1size=$(( $LINUX_SIZE - $LINUX2_SIZE ))
  685. _linux2size=${LINUX2_SIZE}
  686. else
  687. _linux1size=${LINUX_SIZE}
  688. _linux2size=8
  689. fi
  690. else
  691. _linux1size=8
  692. _linux2size=8
  693. fi
  694. printf " Partitioning the card "
  695. # ---- Erase card -------------------------------------------------------
  696. /bin/dd if=/dev/zero of=${DEST_CARD} bs=512 count=${part_start} >> ${log_file} 2>&1
  697. sync
  698. sleep 1
  699. /bin/partprobe -s ${DEST_CARD} >> ${log_file} 2>&1
  700. sleep 1
  701. #---- Make new partition table --------------------------
  702. echo -e "o\nw" | /bin/fdisk ${DEST_CARD} >> ${log_file} 2>&1
  703. sync
  704. sleep 1
  705. /bin/partprobe -s ${DEST_CARD} >> ${log_file} 2>&1
  706. if [ $? -ne 0 ]; then
  707. echo " ERROR creating partition table."
  708. return 1
  709. fi
  710. sleep 1
  711. # == MULTI BOOT PARTITION LAYOUT ===
  712. # userdata
  713. # android
  714. # system
  715. # extended
  716. # data
  717. # cache
  718. # oelec/swap/aux
  719. # linux
  720. # linux2
  721. echo "n
  722. p
  723. 1
  724. $part_start
  725. $userpart_end
  726. t
  727. c
  728. n
  729. p
  730. 2
  731. $syspart_start
  732. $syspart_end
  733. n
  734. p
  735. 3
  736. $cachepart_start
  737. $cachepart_end
  738. n
  739. e
  740. $extpart_start
  741. n
  742. +${DATA_SIZE}M
  743. n
  744. +${OELEC_SIZE}M
  745. n
  746. +${_linux1size}M
  747. n
  748. +${_linux2size}M
  749. w" | fdisk ${DEST_CARD} >> ${log_file} 2>&1
  750. if [ $? -ne 0 ]; then
  751. printf " fdisk ERROR "
  752. return 1
  753. fi
  754. sleep 2
  755. /bin/partprobe -s ${DEST_CARD} >> ${log_file} 2>&1
  756. if [ $? -ne 0 ]; then
  757. echo " ERROR creating partitions."
  758. return 1
  759. fi
  760. sleep 1
  761. sync
  762. echo "OK"
  763. sleep 1
  764. # *** FORMATING partitions ***************************************
  765. printf " Formating partitions... "
  766. # === USERDATA/BOOT =======================================================
  767. printf "\033[36muserdata\033[37m... "
  768. dd if=/dev/zero of=${DEST_CARD}p1 bs=512 count=2048 >> ${log_file} 2>&1
  769. if [ $? -ne 0 ]; then
  770. echo "ERROR"
  771. return 1
  772. fi
  773. sync
  774. mkfs -t vfat -F 32 -n ${label_pref}userdata ${DEST_CARD}p1 >> ${log_file} 2>&1
  775. if [ $? -ne 0 ]; then
  776. echo "mkfs ERROR"
  777. return 1
  778. fi
  779. sync
  780. sleep 1
  781. if [ "${INST_ANDROID}" = "yes" ]; then
  782. printf "\033[36msystem\033[37m... "
  783. # === system ===================================================
  784. dd if=/dev/zero of=${DEST_CARD}p2 bs=512 count=2048 >> ${log_file} 2>&1
  785. if [ $? -ne 0 ]; then
  786. echo "ERROR"
  787. return 1
  788. fi
  789. sync
  790. mkfs.ext4 -L ${label_pref}system ${DEST_CARD}p2 >> ${log_file} 2>&1
  791. if [ $? -ne 0 ]; then
  792. echo "mkfs ERROR"
  793. return 1
  794. fi
  795. sync
  796. sleep 1
  797. # === data ===================================================
  798. printf "\033[36mdata\033[37m... "
  799. dd if=/dev/zero of=${DEST_CARD}p5 bs=512 count=2048 >> ${log_file} 2>&1
  800. if [ $? -ne 0 ]; then
  801. echo "ERROR"
  802. return 1
  803. fi
  804. sync
  805. mkfs.ext4 -L ${label_pref}data ${DEST_CARD}p5 >> ${log_file} 2>&1
  806. if [ $? -ne 0 ]; then
  807. echo "mkfs ERROR"
  808. return 1
  809. fi
  810. sync
  811. sleep 1
  812. # === cache =================================================================
  813. printf "\033[36mcache\033[37m... "
  814. dd if=/dev/zero of=${DEST_CARD}p3 bs=512 count=2048 >> ${log_file} 2>&1
  815. if [ $? -ne 0 ]; then
  816. echo "ERROR"
  817. return 1
  818. fi
  819. sync
  820. mkfs.ext4 -L ${label_pref}cache ${DEST_CARD}p3 >> ${log_file} 2>&1
  821. if [ $? -ne 0 ]; then
  822. echo "mkfs ERROR"
  823. return 1
  824. fi
  825. sync
  826. sleep 1
  827. fi
  828. if [ "$INST_OELEC" = "yes" ]; then
  829. printf "\033[36moelec\033[37m... "
  830. # === swap/aux ==============================================
  831. dd if=/dev/zero of=${DEST_CARD}p6 bs=512 count=2048 >> ${log_file} 2>&1
  832. if [ $? -ne 0 ]; then
  833. echo "ERROR"
  834. return 1
  835. fi
  836. sync
  837. mkfs.ext4 -L ${label_pref}aux ${DEST_CARD}p6 >> ${log_file} 2>&1
  838. if [ $? -ne 0 ]; then
  839. echo "mkfs ERROR"
  840. return 1
  841. fi
  842. sync
  843. sleep 1
  844. fi
  845. if [ "${INST_LINUX}" = "yes" ]; then
  846. # === linux =========================================================================
  847. printf "\033[36mlinux\033[37m... "
  848. dd if=/dev/zero of=${DEST_CARD}p7 bs=512 count=2048 >> ${log_file} 2>&1
  849. if [ $? -ne 0 ]; then
  850. echo "ERROR"
  851. return 1
  852. fi
  853. sync
  854. if [ "${LINUX_FSTYPE}" = "btrfs" ] ; then
  855. mkfs.btrfs -f -L ${label_pref}linux ${DEST_CARD}p7 >> ${log_file} 2>&1
  856. else
  857. mkfs.ext4 -L ${label_pref}linux ${DEST_CARD}p7 >> ${log_file} 2>&1
  858. fi
  859. if [ $? -ne 0 ]; then
  860. echo "mkfs ERROR"
  861. return 1
  862. fi
  863. sync
  864. sleep 1
  865. fi
  866. if [ "${INST_LINUX2}" = "yes" ]; then
  867. printf "\033[36mlinux2\033[37m... "
  868. # === linux =========================================================================
  869. dd if=/dev/zero of=${DEST_CARD}p8 bs=512 count=2048 >> ${log_file} 2>&1
  870. if [ $? -ne 0 ]; then
  871. echo "ERROR"
  872. return 1
  873. fi
  874. sync
  875. if [ "${LINUX_FSTYPE}" = "btrfs" ] ; then
  876. mkfs.btrfs -f -L ${label_pref}linux ${DEST_CARD}p8 >> ${log_file} 2>&1
  877. else
  878. mkfs.ext4 -L ${label_pref}linux ${DEST_CARD}p8 >> ${log_file} 2>&1
  879. fi
  880. if [ $? -ne 0 ]; then
  881. echo "mkfs ERROR"
  882. return 1
  883. fi
  884. sync
  885. sleep 1
  886. fi
  887. /bin/partprobe -s ${DEST_CARD} >> ${log_file} 2>&1
  888. echo "OK"
  889. return 0
  890. }
  891. #----------------------------------------------------------------------------------------
  892. #----------------------------------------------------------------------------
  893. # copy Odroid boot files to installation card
  894. install_boot_c2() {
  895. echo "==== INSTALL BOOT ====" >> ${log_file}
  896. printf " Installing Odroid boot files ... "
  897. dd if=/multi/bl1.bin of=${DEST_CARD} bs=1 count=442 >> ${log_file} 2>&1
  898. if [ $? -ne 0 ]; then
  899. echo "ERROR installing bl1.bin."
  900. return 1
  901. fi
  902. dd if=/multi/bl1.bin of=${DEST_CARD} bs=512 skip=1 seek=1 >> ${log_file} 2>&1
  903. if [ $? -ne 0 ]; then
  904. echo "ERROR installing bl1.bin."
  905. return 1
  906. fi
  907. sync
  908. dd if=/multi/u-boot.bin of=${DEST_CARD} bs=512 seek=97 >> ${log_file} 2>&1
  909. if [ $? -ne 0 ]; then
  910. echo "ERROR installing u-boot.bin."
  911. return 1
  912. fi
  913. sync
  914. echo "OK"
  915. sleep 1
  916. }
  917. #----------------------------------------------------------------------------
  918. #----------------------------------------------------------------------------
  919. # copy Odroid boot files to installation card
  920. install_boot_xu() {
  921. if [ "${label_pref}" = "sd" ]; then
  922. printf " Installing Odroid boot files to SD Card ... "
  923. dd if=/multi/bl1.bin of=${DEST_CARD} bs=512 seek=1 >> ${log_file} 2>&1
  924. if [ $? -ne 0 ]; then
  925. echo "ERROR installing bl1.bin."
  926. return 1
  927. fi
  928. sync
  929. dd if=/multi/bl2.bin of=${DEST_CARD} seek=31 >> ${log_file} 2>&1
  930. if [ $? -ne 0 ]; then
  931. echo "ERROR installing bl2.bin."
  932. return 1
  933. fi
  934. sync
  935. dd if=/multi/u-boot.bin of=${DEST_CARD} seek=63 >> ${log_file} 2>&1
  936. if [ $? -ne 0 ]; then
  937. echo "ERROR installing u-boot.bin."
  938. return 1
  939. fi
  940. sync
  941. dd if=/multi/tzsw.bin of=${DEST_CARD} seek=2111 >> ${log_file} 2>&1
  942. if [ $? -ne 0 ]; then
  943. echo "ERROR installing tzsw.bin."
  944. return 1
  945. fi
  946. sync
  947. echo "OK"
  948. else
  949. # UNLOCK boot0
  950. _dest_card_=$(basename ${DEST_CARD})
  951. printf " Installing Odroid boot files to EMMC Card (%s [%s])... " "${DEST_CARD}" "${_dest_card_}"
  952. if [ -e /sys/block/${_dest_card_}boot0/force_ro ]; then
  953. echo 0 > /sys/block/${_dest_card_}boot0/force_ro
  954. if [ $? -ne 0 ]; then
  955. echo "ERROR enabling boot0."
  956. return 1
  957. fi
  958. else
  959. echo "ERROR: boot0 not found."
  960. return 1
  961. fi
  962. dd if=/dev/zero of=${DEST_CARD}boot0 count=8192 >> ${log_file} 2>&1
  963. if [ $? -ne 0 ]; then
  964. printf "WARNING: error erasing boot0 "
  965. fi
  966. sync
  967. dd if=/multi/bl1.bin of=${DEST_CARD}boot0 >> ${log_file} 2>&1
  968. if [ $? -ne 0 ]; then
  969. echo "ERROR installing bl1.bin."
  970. return 1
  971. fi
  972. sync
  973. dd if=/multi/bl2.bin of=${DEST_CARD}boot0 seek=30 >> ${log_file} 2>&1
  974. if [ $? -ne 0 ]; then
  975. echo "ERROR installing bl2.bin."
  976. return 1
  977. fi
  978. sync
  979. dd if=/multi/u-boot.bin of=${DEST_CARD}boot0 seek=62 >> ${log_file} 2>&1
  980. if [ $? -ne 0 ]; then
  981. echo "ERROR installing u-boot.bin."
  982. return 1
  983. fi
  984. sync
  985. dd if=/multi/tzsw.bin of=${DEST_CARD}boot0 seek=2110 >> ${log_file} 2>&1
  986. if [ $? -ne 0 ]; then
  987. echo "ERROR installing tzsw.bin."
  988. return 1
  989. fi
  990. sync
  991. echo 1 > /sys/block/${_dest_card_}boot0/force_ro
  992. echo "OK"
  993. fi
  994. sleep 1
  995. }
  996. #----------------------------------------------------------------------------
  997. #---------------------------------------------------------------------------------------------------------
  998. install_multi_sel() {
  999. echo "==== INSTALL MULTIBOOT SUPPORT ====" >> ${log_file}
  1000. # Update userdata partition for multiboot
  1001. /bin/mountx -t vfat ${DEST_CARD}p1 /mnt2 >> ${log_file} 2>&1
  1002. if [ $? -ne 0 ]; then
  1003. echo " ERROR mounting boot partition."
  1004. return 1
  1005. fi
  1006. sleep 1
  1007. mkdir /mnt2/multiboot >> ${log_file} 2>&1
  1008. if [ ! -d /multiboot ]; then
  1009. echo " ERROR: missing multiboot directory."
  1010. return 1
  1011. fi
  1012. if [ "${O_BOARD}" = "XU" ]; then
  1013. cp /multiboot/boot.scr.multi /mnt2/multiboot >> ${log_file} 2>&1
  1014. [ $? -ne 0 ] && return 1
  1015. cp /multiboot/boot.scr.multi /mnt2/boot.scr >> ${log_file} 2>&1
  1016. [ $? -ne 0 ] && return 1
  1017. fi
  1018. cp /multiboot/boot.ini.multi /mnt2/multiboot >> ${log_file} 2>&1
  1019. [ $? -ne 0 ] && return 1
  1020. cp /multiboot/boot.ini.multi /mnt2/boot.ini >> ${log_file} 2>&1
  1021. [ $? -ne 0 ] && return 1
  1022. cp /multiboot/${ODROID_IMAGE}.multi /mnt2/multiboot >> ${log_file} 2>&1
  1023. [ $? -ne 0 ] && return 1
  1024. cp /multiboot/uInitrd.multi /mnt2/multiboot >> ${log_file} 2>&1
  1025. [ $? -ne 0 ] && return 1
  1026. cp /multiboot/*.dtb.multi /mnt2/multiboot >> ${log_file} 2>&1
  1027. [ $? -ne 0 ] && return 1
  1028. return 0
  1029. }
  1030. #---------------------------------------------------------------------------------------------------------
  1031. #------------------------------------------------------------------------------
  1032. set_android_sizes() {
  1033. _img_size=$(/bin/lsx -ls ${andro_dest}/system.raw.img | awk '{print $1}')
  1034. _img_size_=$(( $_img_size / 1024 / $PARTSIZE_INC * $PARTSIZE_INC ))
  1035. while [ $SYSTEM_MINSIZE -lt $_img_size_ ]
  1036. do
  1037. let SYSTEM_MINSIZE=SYSTEM_MINSIZE+PARTSIZE_INC
  1038. done
  1039. let SYSTEM_MINSIZE=SYSTEM_MINSIZE+256
  1040. SYSTEM_SIZE=${SYSTEM_MINSIZE}
  1041. _img_size=$(/bin/lsx -ls ${andro_dest}/cache.raw.img | awk '{print $1}')
  1042. _img_size_=$(( $_img_size / 1024 / $PARTSIZE_INC * $PARTSIZE_INC ))
  1043. while [ $CACHE_MINSIZE -lt $_img_size_ ]
  1044. do
  1045. let CACHE_MINSIZE=CACHE_MINSIZE+PARTSIZE_INC
  1046. done
  1047. CACHE_SIZE=${CACHE_MINSIZE}
  1048. _img_size=$(/bin/lsx -ls ${andro_dest}/data.raw.img | awk '{print $1}')
  1049. _img_size_=$(( $_img_size / 1024 / $PARTSIZE_INC * $PARTSIZE_INC ))
  1050. while [ $DATA_MINSIZE -lt $_img_size_ ]
  1051. do
  1052. let DATA_MINSIZE=DATA_MINSIZE+PARTSIZE_INC
  1053. done
  1054. DATA_SIZE=${DATA_MINSIZE}
  1055. }
  1056. #------------------------------------------------------------------------------
  1057. #--------------------------------------------------------------------------------------------------------------------------------
  1058. check_android_backup() {
  1059. andro_dest="${source_mount}/${BKP_PREFIX}_backup/android"
  1060. if [ ! -f ${andro_dest}/system.raw.img ] || [ ! -f ${andro_dest}/data.raw.img ] || [ ! -f ${andro_dest}/cache.raw.img ]; then
  1061. if [ ! -f ${andro_source}/system.raw.img ]; then
  1062. echo " system.img missing."
  1063. fi
  1064. if [ ! -f ${andro_source}/data.raw.img ]; then
  1065. echo " data.img missing."
  1066. fi
  1067. if [ ! -f ${andro_source}/cache.raw.img ]; then
  1068. echo " cache.img missing."
  1069. fi
  1070. sleep 2
  1071. return 1
  1072. fi
  1073. if [ ! -f ${andro_dest}/${ODROID_IMAGE} ]; then
  1074. echo " KERNEL (%s) not found!" "${ODROID_IMAGE}"
  1075. sleep 2
  1076. return 1
  1077. fi
  1078. if [ "${O_BOARD}" = "C2" ] && [ ! -f ${andro_dest}/${ODROID_DTB} ]; then
  1079. echo " %s not found!" "${ODROID_DTB}"
  1080. sleep 2
  1081. return 1
  1082. fi
  1083. set_android_sizes
  1084. return 0
  1085. }
  1086. #--------------------------------------------------------------------------------------------------------------------------------
  1087. # Extract Android images from tar and expand sparse image files
  1088. #----------------------------------------------------------------------------
  1089. unpack_android() {
  1090. echo "==== UNPACK ANDROID ====" >> ${log_file}
  1091. mkdir /run/inst >> ${log_file} 2>&1
  1092. mkdir /run/inst/android >> ${log_file} 2>&1
  1093. printf " Extracting Android partition images, please wait ... "
  1094. if [ -f ${source_mount}/update.tar.gz ]; then
  1095. mkdir ${source_mount}/android >> ${log_file} 2>&1
  1096. rm -rf ${source_mount}/android/* >> ${log_file} 2>&1
  1097. cp ${source_mount}/update.tar.gz ${source_mount}/android/update.tar.gz
  1098. cd ${source_mount}/android
  1099. tar -xf update.tar.gz --warning=no-timestamp >> ${log_file} 2>&1
  1100. if [ $? -ne 0 ]; then
  1101. echo "ERROR extracting archive."
  1102. cd /
  1103. return 1
  1104. fi
  1105. rm update.tar.gz
  1106. _name=$(ls)
  1107. if [ ! -d "${_name}" ]; then
  1108. echo "install directory not found in archive!"
  1109. cd /
  1110. return 1
  1111. fi
  1112. if [ ! -f ${_name}/${ODROID_ASYSTEMIMAGE} ]; then
  1113. echo "system.img not found!"
  1114. cd /
  1115. return 1
  1116. fi
  1117. andro_source="${source_mount}/android/${_name}"
  1118. cd /
  1119. else
  1120. if [ -f ${source_mount}/update.zip ]; then
  1121. mkdir ${source_mount}/android >> ${log_file} 2>&1
  1122. rm -rf ${source_mount}/android/* >> ${log_file} 2>&1
  1123. # unzip, dont make directories
  1124. unzip -qq -j ${source_mount}/update.zip -d ${source_mount}/android >> ${log_file} 2>&1
  1125. if [ $? -ne 0 ]; then
  1126. echo "ERROR unpacking \"update.zip\"."
  1127. return 1
  1128. fi
  1129. sync
  1130. andro_source="${source_mount}/android"
  1131. else
  1132. echo "ERROR: archive file not found."
  1133. return 1
  1134. fi
  1135. fi
  1136. sync
  1137. echo "OK."
  1138. printf " Preparing Android partition images ...\n"
  1139. if [ ! -f ${andro_source}/${ODROID_IMAGE} ]; then
  1140. echo " KERNEL (%s) not found!" "${ODROID_IMAGE}"
  1141. sleep 2
  1142. return 1
  1143. fi
  1144. if [ "${O_BOARD}" = "C2" ] && [ ! -f ${andro_source}/${ODROID_DTB} ]; then
  1145. echo " %s not found!" "${ODROID_DTB}"
  1146. sleep 2
  1147. return 1
  1148. fi
  1149. if [ ! -f ${andro_source}/${ODROID_ASYSTEMIMAGE} ] || [ ! -f ${andro_source}/userdata.img ] || [ ! -f ${andro_source}/cache.img ]; then
  1150. if [ ! -f ${andro_source}/userdata.img ]; then
  1151. if [ ! "${O_BOARD}" = "C2" ]; then
  1152. # CM for XU3/XU4 can have different userdata.img names
  1153. if [ -f ${andro_source}/userdata_8.img ]; then
  1154. mv ${andro_source}/userdata_8.img ${andro_source}/userdata.img
  1155. else
  1156. if [ -f ${andro_source}/userdata_16.img ]; then
  1157. mv ${andro_source}/userdata_16.img ${andro_source}/userdata.img
  1158. else
  1159. if [ -f ${andro_source}/userdata_32.img ]; then
  1160. mv ${andro_source}/userdata_32.img ${andro_source}/userdata.img
  1161. else
  1162. if [ -f ${andro_source}/userdata_64.img ]; then
  1163. mv ${andro_source}/userdata_64.img ${andro_source}/userdata.img
  1164. fi
  1165. fi
  1166. fi
  1167. fi
  1168. fi
  1169. if [ ! -f ${andro_source}/userdata.img ]; then
  1170. echo " userdata.img missing."
  1171. sleep 2
  1172. return 1
  1173. fi
  1174. fi
  1175. if [ ! -f ${andro_source}/${ODROID_ASYSTEMIMAGE} ]; then
  1176. echo " system.img missing."
  1177. sleep 2
  1178. return 1
  1179. fi
  1180. if [ ! -f ${andro_source}/cache.img ]; then
  1181. echo " cache.img missing."
  1182. sleep 2
  1183. return 1
  1184. fi
  1185. fi
  1186. # All needed images and files are present, get sizes
  1187. _ramfs_free=$(df | grep tmpfs | awk '{print $4}')
  1188. _ramfs_free=$(( $_ramfs_free / 1024 - 100 ))
  1189. _img_size=$(/bin/lsx -ls ${andro_source}/${ODROID_ASYSTEMIMAGE} | awk '{print $1}')
  1190. size_of_images=$_img_size
  1191. _img_size=$(/bin/lsx -ls ${andro_source}/userdata.img | awk '{print $1}')
  1192. size_of_images=$(( $size_of_images + $_img_size))
  1193. _img_size=$(/bin/lsx -ls ${andro_source}/cache.img | awk '{print $1}')
  1194. size_of_images=$(( $size_of_images + $_img_size))
  1195. size_of_images=$(( $size_of_images / 1024 ))
  1196. if [ $size_of_images -gt $_ramfs_free ]; then
  1197. andro_dest="${andro_source}"
  1198. echo " Decompressing to source drive (${size_of_images} MB)"
  1199. else
  1200. andro_dest="/run/inst/android"
  1201. echo " Decompressing to RAMfs (${size_of_images} MB)"
  1202. cp ${andro_source}/${ODROID_DTB} ${andro_dest} >> ${log_file} 2>&1
  1203. cp ${andro_source}/${ODROID_IMAGE} ${andro_dest} >> ${log_file} 2>&1
  1204. sync
  1205. fi
  1206. # === Decompress sparse images ===
  1207. printf " system ... "
  1208. simg2img ${andro_source}/${ODROID_ASYSTEMIMAGE} ${andro_dest}/system.raw.img >> ${log_file} 2>&1
  1209. if [ $? -ne 0 ]; then
  1210. echo "ERROR."
  1211. return 1
  1212. fi
  1213. sync
  1214. rm ${andro_source}/${ODROID_ASYSTEMIMAGE}
  1215. printf "cache... "
  1216. simg2img ${andro_source}/cache.img ${andro_dest}/cache.raw.img >> ${log_file} 2>&1
  1217. if [ $? -ne 0 ]; then
  1218. echo "ERROR."
  1219. return 1
  1220. fi
  1221. sync
  1222. rm ${andro_source}/cache.img
  1223. printf "data... "
  1224. simg2img ${andro_source}/userdata.img ${andro_dest}/data.raw.img >> ${log_file} 2>&1
  1225. if [ $? -ne 0 ]; then
  1226. echo "ERROR."
  1227. return 1
  1228. fi
  1229. sync
  1230. rm ${andro_source}/userdata.img
  1231. echo "OK."
  1232. set_android_sizes
  1233. return 0
  1234. }
  1235. #----------------------------------------------------------------------------
  1236. #---------------------------------------------------------------------------------------------
  1237. change_android_fstab() {
  1238. # Prepare fstab for changed partition layout
  1239. if [ -f /mnt2/${1} ]; then
  1240. if [ "${O_BOARD}" = "C2" ]; then
  1241. # Change data partition number (4 -> 5)
  1242. cat /mnt2/${1} | sed "s/\/dev\/block\/mmcblk0p4/\/dev\/block\/mmcblk0p5/g" > _fstab_
  1243. cp _fstab_ /mnt2/${1}
  1244. rm _fstab_
  1245. else
  1246. # Change data partition number (3 -> 5)
  1247. cat /mnt2/${1} | sed "s/\/dev\/block\/mmcblk0p4/\/dev\/block\/mmcblk0p5/g" > _fstab_
  1248. cp _fstab_ /mnt2/${1}
  1249. rm _fstab_
  1250. # Change cache partition number (4 -> 3)
  1251. cat /mnt2/${1} | sed "s/\/dev\/block\/mmcblk0p4/\/dev\/block\/mmcblk0p3/g" > _fstab_
  1252. cp _fstab_ /mnt2/${1}
  1253. rm _fstab_
  1254. fi
  1255. fi
  1256. }
  1257. #---------------------------------------------------------------------------------------------
  1258. #------------------------------------------------------------
  1259. prepare_android_multi() {
  1260. echo "==== PREPARE ANDROID FOR MULTIBOOT ====" >> ${log_file}
  1261. # Prepare fstab for changed partition layout
  1262. change_android_fstab "${ODROID_FSTAB}"
  1263. if [ -f /mnt2/${ODROID_FSTAB}.sdcard ]; then
  1264. change_android_fstab "${ODROID_FSTAB}.sdcard"
  1265. elif [ -f /mnt2/${ODROID_FSTAB}.sdboot ]; then
  1266. change_android_fstab "${ODROID_FSTAB}.sdboot"
  1267. fi
  1268. return 0
  1269. }
  1270. #------------------------------------------------------------
  1271. #----------------------------------------------------------------------------------------------------------------
  1272. install_android() {
  1273. echo "==== INSTALL ANDROID ====" >> ${log_file}
  1274. printf "\n \033[33mInstalling \033[1mAndroid\033[22m\033[37m"
  1275. if [ -d ${source_mount}/backup/android/system ]; then
  1276. printf " (from backup)\n"
  1277. else
  1278. printf "\n"
  1279. fi
  1280. mkdir /mnt1 >> ${log_file} 2>&1
  1281. mkdir /mnt2 >> ${log_file} 2>&1
  1282. # === Copy system partition ===
  1283. printf " Installing \033[36msystem\033[37m ... "
  1284. # mount source
  1285. mount -t ext4 -o ro,loop ${andro_dest}/system.raw.img /mnt1 >> ${log_file} 2>&1
  1286. if [ $? -ne 0 ]; then
  1287. echo "ERROR mounting system image."
  1288. return 1
  1289. fi
  1290. # mount destination
  1291. mount -t ext4 ${DEST_CARD}p2 /mnt2 >> ${log_file} 2>&1
  1292. if [ $? -ne 0 ]; then
  1293. umount /mnt1 >> ${log_file} 2>&1
  1294. echo "ERROR mounting system partition."
  1295. return 1
  1296. fi
  1297. sleep 1
  1298. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s -A -X --no-specials /mnt1/ /mnt2/ >> ${log_file} 2>&1
  1299. if [ $? -ne 0 ]; then
  1300. umount /mnt1 >> ${log_file} 2>&1
  1301. umount /mnt2 >> ${log_file} 2>&1
  1302. echo "ERROR copying system."
  1303. return 1
  1304. fi
  1305. sync
  1306. prepare_android_multi
  1307. umount /mnt1 >> ${log_file} 2>&1
  1308. umount /mnt2 >> ${log_file} 2>&1
  1309. sleep 1
  1310. printf "OK "
  1311. # === Copy data partition ===
  1312. printf "\033[36mdata\033[37m ... "
  1313. # mount source
  1314. mount -t ext4 -o ro,loop ${andro_dest}/data.raw.img /mnt1 >> ${log_file} 2>&1
  1315. if [ $? -ne 0 ]; then
  1316. echo "ERROR mounting data image."
  1317. return 1
  1318. fi
  1319. # mount destination
  1320. mount -t ext4 ${DEST_CARD}p5 /mnt2 >> ${log_file} 2>&1
  1321. if [ $? -ne 0 ]; then
  1322. umount /mnt1 >> ${log_file} 2>&1
  1323. echo "ERROR mounting data partition."
  1324. return 1
  1325. fi
  1326. sleep 1
  1327. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s -A -X --no-specials /mnt1/ /mnt2/ >> ${log_file} 2>&1
  1328. if [ $? -ne 0 ]; then
  1329. umount /mnt1 >> ${log_file} 2>&1
  1330. umount /mnt2 >> ${log_file} 2>&1
  1331. echo "ERROR copying userdata."
  1332. return 1
  1333. fi
  1334. sync
  1335. umount /mnt1 >> ${log_file} 2>&1
  1336. umount /mnt2 >> ${log_file} 2>&1
  1337. sleep 1
  1338. printf "OK "
  1339. # === Copy cache partition ===
  1340. printf "\033[36mcache\033[37m ... "
  1341. # mount source
  1342. mount -t ext4 -o ro,loop ${andro_dest}/cache.raw.img /mnt1 >> ${log_file} 2>&1
  1343. if [ $? -ne 0 ]; then
  1344. echo "ERROR mounting cache image."
  1345. return 1
  1346. fi
  1347. # mount destination
  1348. mount -t ext4 ${DEST_CARD}p3 /mnt2 >> ${log_file} 2>&1
  1349. if [ $? -ne 0 ]; then
  1350. umount /mnt1 >> ${log_file} 2>&1
  1351. echo "ERROR mounting cache partition."
  1352. return 1
  1353. fi
  1354. sleep 1
  1355. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s -A -X --no-specials /mnt1/ /mnt2/ >> ${log_file} 2>&1
  1356. if [ $? -ne 0 ]; then
  1357. umount /mnt1 >> ${log_file} 2>&1
  1358. umount /mnt2 >> ${log_file} 2>&1
  1359. echo "ERROR copying cache."
  1360. return 1
  1361. fi
  1362. sync
  1363. umount /mnt1 >> ${log_file} 2>&1
  1364. umount /mnt2 >> ${log_file} 2>&1
  1365. sleep 1
  1366. printf "OK "
  1367. # Install kernel
  1368. printf "\033[36mkernel\033[37m ... "
  1369. if [ "${O_BOARD}" = "xC2" ]; then
  1370. dd if=${andro_dest}/${ODROID_DTB} of=${DEST_CARD} seek=1504 >> ${log_file} 2>&1
  1371. if [ $? -ne 0 ]; then
  1372. echo "ERROR installing Android kernel (DTB)."
  1373. return 1
  1374. else
  1375. dd if=${andro_dest}/${ODROID_IMAGE} of=${DEST_CARD} seek=1632 >> ${log_file} 2>&1
  1376. fi
  1377. elif [ "${O_BOARD}" = "xXU" ]; then
  1378. dd if=${andro_dest}/${ODROID_IMAGE} of=${DEST_CARD} seek=1263 >> ${log_file} 2>&1
  1379. else
  1380. printf "not needed "
  1381. fi
  1382. if [ $? -ne 0 ]; then
  1383. echo "ERROR installing Android kernel."
  1384. return 1
  1385. fi
  1386. echo "OK"
  1387. sync
  1388. sleep 1
  1389. # Prepare for multiboot
  1390. printf " Preparing for multi boot ... "
  1391. /bin/mountx -t vfat ${DEST_CARD}p1 /mnt2 >> ${log_file} 2>&1
  1392. if [ $? -ne 0 ]; then
  1393. echo "ERROR mounting userdata partition."
  1394. return 1
  1395. fi
  1396. sleep 1
  1397. mkdir /mnt2/multiboot >> ${log_file} 2>&1
  1398. if [ "${A_FROMDIR}" = "yes" ]; then
  1399. cp -rf ${andro_dest}/* /mnt2 >> ${log_file} 2>&1
  1400. fi
  1401. cp /multi/boot.ini.android /mnt2/multiboot >> ${log_file} 2>&1
  1402. [ ! -f /mnt2/multiboot/boot.ini.android ] && print "ini file? "
  1403. cp ${andro_dest}/${ODROID_DTB} /mnt2/multiboot/${ODROID_DTB}.android >> ${log_file} 2>&1
  1404. cp ${andro_dest}/${ODROID_IMAGE} /mnt2/multiboot/${ODROID_IMAGE}.android >> ${log_file} 2>&1
  1405. sync
  1406. umount /mnt2 >> ${log_file} 2>&1
  1407. sleep 1
  1408. echo "OK."
  1409. return 0
  1410. }
  1411. #----------------------------------------------------------------------------------------------------------------
  1412. #-------------------------------------------------------------------------
  1413. # Calculate partitions offsets and sizes of the linux installation image
  1414. get_lin_partstruct() {
  1415. echo "==== CHECK LINUX IMAGE ====" >> ${log_file}
  1416. printf " Checking Linux image ... "
  1417. _card_sectno=`fdisk -l ${1} | grep "Disk ${1}" | awk '{print $7}'`
  1418. if [ "${_card_sectno}" = "" ]; then
  1419. _card_sectno=`fdisk -l ${1} | grep total | awk '{print $8}'`
  1420. fi
  1421. if [ "${_card_sectno}" = "" ]; then
  1422. echo "ERROR: sectNo?"
  1423. return 1
  1424. fi
  1425. #_card_end=$(( $_card_sectno - 1024))
  1426. _card_sectsize=`fdisk -l ${1} | grep "Sector size" | awk '{print $4}'`
  1427. if [ "${_card_sectsize}" = "" ]; then
  1428. echo "ERROR: sectSize?"
  1429. return 1
  1430. fi
  1431. _partstart=`fdisk -l ${1} | grep ${1}1 | awk '{print $2}'`
  1432. if [ "${_partstart}" = "" ]; then
  1433. echo "ERROR: FATpartStart?"
  1434. return 1
  1435. fi
  1436. _fat_partstart=$(( $_partstart * $_card_sectsize ))
  1437. _partstart=`fdisk -l ${1} | grep ${1}2 | awk '{print $2}'`
  1438. if [ "${_partstart}" = "" ]; then
  1439. echo "ERROR: LINpartStart?"
  1440. return 1
  1441. fi
  1442. _linux_partstart=$(( $_partstart * $_card_sectsize ))
  1443. echo "OK."
  1444. return 0
  1445. }
  1446. #-------------------------------------------------------------------------
  1447. #----------------------------------------------------------------------------------------------------------------------------
  1448. prepare_linux_boot() {
  1449. echo "==== PREPARE LINUX BOOT ====" >> ${log_file}
  1450. # Prepare for multi boot
  1451. if [ -d /mnt2/etc ]; then
  1452. if [ "${LINUX_FSTYPE}" = "btrfs" ] ; then
  1453. echo "LABEL=${label_pref}linux / btrfs noatime,nodiratime,compress=lzo 0 1" > /mnt2/etc/fstab
  1454. else
  1455. echo "LABEL=${label_pref}linux / ext4 errors=remount-ro,noatime,nodiratime 0 1" > /mnt2/etc/fstab
  1456. fi
  1457. echo "LABEL=${label_pref}userdata /media/boot vfat defaults 0 1" >> /mnt2/etc/fstab
  1458. if [ -f /mnt2/etc/rc.local ]; then
  1459. cat /mnt2/etc/rc.local | sed "s/^exit 0//g" > _rcloc_
  1460. if [ -f /mnt2/.first_boot ]; then
  1461. echo "if [ -f /.first_boot ]; then" >> _rcloc_
  1462. echo " rm -f /.first_boot" >> _rcloc_
  1463. echo " [ ! -f /etc/ssh/ssh_host_rsa_key ] && dpkg-reconfigure openssh-server" >> _rcloc_
  1464. echo "fi" >> _rcloc_
  1465. fi
  1466. echo "exit 0" >> _rcloc_
  1467. cp _rcloc_ /mnt2/etc/rc.local
  1468. rm _rcloc_
  1469. chmod 0755 /mnt2/etc/rc.local
  1470. if [ -f /mnt2/aafirstboot ]; then
  1471. rm -f /mnt2/aafirstboot
  1472. fi
  1473. fi
  1474. else
  1475. echo "ERROR: \"etc\" directory not found!"
  1476. return 1
  1477. fi
  1478. if [ -d /mnt2/media/odroid ]; then
  1479. chown 1000:1000 /mnt2/media/odroid >> ${log_file} 2>&1
  1480. chmod 0666 /mnt2/media/odroid >> ${log_file} 2>&1
  1481. fi
  1482. return 0
  1483. }
  1484. #----------------------------------------------------------------------------------------------------------------------------
  1485. #----------------------------------------------------------------------------------------------------------
  1486. # shellcheck disable=SC2050
  1487. install_linux() {
  1488. echo "==== INSTALL LINUX ====" >> ${log_file}
  1489. local lin_fromdir="no"
  1490. if [ "${1}" = "linux.img" ] && [ "${L_FROMDIR}" = "yes" ]; then
  1491. lin_fromdir="yes"
  1492. elif [ "${1}" = "linux2.img" ] && [ "${L2_FROMDIR}" = "yes" ]; then
  1493. lin_fromdir="yes"
  1494. fi
  1495. if [ "${1}" = "linux2.img" ]; then
  1496. printf "\n \033[33mInstalling \033[1mLinux 2\033[22m\033[37m\n"
  1497. else
  1498. printf "\n \033[33mInstalling \033[1mLinux\033[22m\033[37m\n"
  1499. fi
  1500. if [ "${lin_fromdir}" = "no" ]; then
  1501. get_lin_partstruct "/mnt/${1}"
  1502. if [ $? -ne 0 ]; then
  1503. printf " \033[35mWRONG Linux image partition structure!\033[37m\n"
  1504. return 1
  1505. fi
  1506. sleep 1
  1507. fi
  1508. mkdir /mnt1 >> ${log_file} 2>&1
  1509. mkdir /mnt2 >> ${log_file} 2>&1
  1510. local _linpart="p7"
  1511. local _linsufix=""
  1512. if [ "${1}" = "linux2.img" ]; then
  1513. _linpart="p8"
  1514. _linsufix="2"
  1515. fi
  1516. # === Copy Linux partition ===
  1517. printf " \033[35mcopying Linux can take more than 15 min to complete on SDCard!\033[37m\n"
  1518. printf " Installing Linux root file system ... "
  1519. if [ "${lin_fromdir}" = "no" ]; then
  1520. /bin/mountx -t ext4 -o ro,loop,offset=${_linux_partstart} ${source_mount}/${1} /mnt1
  1521. if [ $? -ne 0 ]; then
  1522. echo " ERROR mounting Linux source image."
  1523. return 1
  1524. fi
  1525. else
  1526. /bin/mountx -t ext4 ${source_mount}/${BKP_PREFIX}_backup/linux${_linsufix}/linux.img /mnt1
  1527. if [ $? -ne 0 ]; then
  1528. echo " ERROR mounting Linux backup image."
  1529. return 1
  1530. fi
  1531. fi
  1532. if [ "${LINUX_FSTYPE}" = "btrfs" ] ; then
  1533. /bin/mountx -t btrfs -o compress-force=lzo ${DEST_CARD}${_linpart} /mnt2
  1534. else
  1535. /bin/mountx -t ext4 ${DEST_CARD}${_linpart} /mnt2
  1536. fi
  1537. if [ $? -ne 0 ]; then
  1538. umount /mnt1 >> ${log_file} 2>&1
  1539. echo " ERROR mounting Linux destination partition."
  1540. return 1
  1541. fi
  1542. printf "copying... "
  1543. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s --stats /mnt1/ /mnt2/ >> ${log_file} 2>&1
  1544. if [ $? -ne 0 ]; then
  1545. umount /mnt1 >> ${log_file} 2>&1
  1546. umount /mnt2 >> ${log_file} 2>&1
  1547. echo "ERROR copying Linux."
  1548. return 1
  1549. fi
  1550. sync
  1551. printf "preparing... "
  1552. prepare_linux_boot
  1553. if [ $? -ne 0 ]; then
  1554. umount /mnt1 >> ${log_file} 2>&1
  1555. umount /mnt2 >> ${log_file} 2>&1
  1556. return 1
  1557. fi
  1558. umount /mnt1 >> ${log_file} 2>&1
  1559. umount /mnt2 >> ${log_file} 2>&1
  1560. sleep 1
  1561. echo "OK"
  1562. # === Update userdata partition for Linux multiboot ===
  1563. printf " Copying Linux boot files ... "
  1564. local boot_src="/mnt1"
  1565. if [ "${lin_fromdir}" = "no" ]; then
  1566. /bin/mountx -t vfat -o ro,loop,offset=${_fat_partstart} ${source_mount}/${1} /mnt1
  1567. if [ $? -ne 0 ]; then
  1568. echo "ERROR mounting Linux boot image."
  1569. return 1
  1570. fi
  1571. else
  1572. boot_src="${source_mount}/${BKP_PREFIX}_backup/linux${_linsufix}"
  1573. fi
  1574. /bin/mountx -t vfat ${DEST_CARD}p1 /mnt2 >> ${log_file} 2>&1
  1575. if [ $? -ne 0 ]; then
  1576. umount /mnt1 >> ${log_file} 2>&1
  1577. echo "ERROR mounting boot partition."
  1578. return 1
  1579. fi
  1580. sync
  1581. sleep 1
  1582. # Prepare boot.ini
  1583. if [ -f ${boot_src}/${ODROID_DTB} ] && [ -f ${boot_src}/${ODROID_IMAGE} ] && [ -f ${boot_src}/uInitrd ]; then
  1584. mkdir /mnt2/multiboot >> ${log_file} 2>&1
  1585. cp /multi/boot.ini.linux${_linsufix} /mnt2/multiboot/boot.ini.linux${_linsufix}
  1586. cat /mnt2/multiboot/boot.ini.linux${_linsufix} | sed "s/root=LABEL=XXlinux/root=LABEL=${label_pref}linux/g" > _bini_
  1587. cp _bini_ /mnt2/multiboot/boot.ini.linux${_linsufix}
  1588. cp ${boot_src}/${ODROID_DTB} /mnt2/multiboot/${ODROID_DTB}.linux${_linsufix} >> ${log_file} 2>&1
  1589. cp ${boot_src}/${ODROID_IMAGE} /mnt2/multiboot/${ODROID_IMAGE}.linux${_linsufix} >> ${log_file} 2>&1
  1590. cp ${boot_src}/uInitrd /mnt2/multiboot/uInitrd.linux${_linsufix} >> ${log_file} 2>&1
  1591. rm _bini_ >> ${log_file} 2>&1
  1592. else
  1593. echo "ERROR: not all Linux boot files found! "
  1594. umount /mnt1 >> ${log_file} 2>&1
  1595. umount /mnt2 >> ${log_file} 2>&1
  1596. return 1
  1597. fi
  1598. umount /mnt1 >> ${log_file} 2>&1
  1599. umount /mnt2 >> ${log_file} 2>&1
  1600. sleep 1
  1601. echo "OK"
  1602. }
  1603. #----------------------------------------------------------------------------------------------------------
  1604. #------------------------------------------------------------------------------------------------------------------------------------------------------
  1605. # shellcheck disable=SC2059
  1606. install_oelec() {
  1607. echo "==== INSTALL OpenElec ====" >> ${log_file}
  1608. printf "\n \033[33mInstalling \033[1mOpenELEC\033[22m\033[37m\n"
  1609. _oelec_source="/run/oelec"
  1610. if [ "${O_FROMDIR}" = "yes" ]; then
  1611. _name="${source_mount}/${BKP_PREFIX}_backup/oelec"
  1612. if [ -f ${_name}/oelec.img ]; then
  1613. printf " Restoring oelec partition... "
  1614. mkdir /oelecbkp >> ${log_file} 2>&1
  1615. /bin/mountx -t ext4 ${_name}/oelec.img /oelecbkp >> ${log_file} 2>&1
  1616. if [ $? -eq 0 ]; then
  1617. /bin/mountx ${DEST_CARD}p6 /mnt2 > /dev/null 2>&1
  1618. if [ $? -eq 0 ]; then
  1619. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s --stats /oelecbkp/ /mnt2/ > /dev/null 2>&1
  1620. if [ $? -ne 0 ]; then
  1621. echo "ERROR: copy"
  1622. else
  1623. echo "OK"
  1624. fi
  1625. fi
  1626. else
  1627. echo "ERROR: mount"
  1628. fi
  1629. umount /oelecbkp >> ${log_file} 2>&1
  1630. umount /mnt2 >> ${log_file} 2>&1
  1631. rmdir /oelecbkp >> ${log_file} 2>&1
  1632. fi
  1633. else
  1634. _ramfs_free=$(df | grep tmpfs | awk '{print $4}')
  1635. _ramfs_free=$(( $_ramfs_free / 1024 - 100 ))
  1636. _tarsize_=$(/bin/tar -vtf ${source_mount}/oelec.tar |awk '{SUM += $3} END {print SUM}')
  1637. _tarsize_=$(( $_tarsize_ / 1024 / 1024 ))
  1638. printf " Unpacking archive "
  1639. if [ $_tarsize_ -lt $_ramfs_free ]; then
  1640. mkdir /run/oelec >> ${log_file} 2>&1
  1641. printf "to RAMfs (${_tarsize_}M) ... "
  1642. else
  1643. mkdir ${source_mount}/tmp_oelec >> ${log_file} 2>&1
  1644. _oelec_source="${source_mount}/tmp_oelec"
  1645. printf "to source drive (${_tarsize_}M) ... "
  1646. fi
  1647. rm -rf ${_oelec_source:?}/* >> ${log_file} 2>&1
  1648. cd ${_oelec_source}
  1649. /bin/tar -xf ${source_mount}/oelec.tar --warning=no-timestamp >> ${log_file} 2>&1
  1650. if [ $? -ne 0 ]; then
  1651. echo "ERROR extracting archive."
  1652. cd /
  1653. rm -rf ${_oelec_source:?}/* >> ${log_file} 2>&1
  1654. return 1
  1655. fi
  1656. _name=$(ls)
  1657. echo "OK."
  1658. fi
  1659. printf " Copying files from %s ... " "${_name}"
  1660. if [ ! -f ${_name}/3rdparty/bootloader/${ODROID_DTB} ]; then
  1661. echo "ERROR: ${ODROID_DTB} not found!"
  1662. cd /
  1663. [ ! "${O_FROMDIR}" = "yes" ] && rm -rf ${_oelec_source:?}/* >> ${log_file} 2>&1
  1664. return 1
  1665. fi
  1666. if [ ! -f ${_name}/target/KERNEL ] || [ ! -f ${_name}/target/SYSTEM ]; then
  1667. echo "ERROR SYSTEM or KERNEL not found"
  1668. cd /
  1669. [ ! "${O_FROMDIR}" = "yes" ] && rm -rf ${_oelec_source:?}/* >> ${log_file} 2>&1
  1670. return 1
  1671. fi
  1672. if [ ! "${O_BOARD}" = "C2" ]; then
  1673. if [ ! -f ${_name}/target/INITRD ]; then
  1674. echo "ERROR: INITRD not found!"
  1675. cd /
  1676. [ ! "${O_FROMDIR}" = "yes" ] && rm -rf ${_oelec_source:?}/* >> ${log_file} 2>&1
  1677. return 1
  1678. fi
  1679. fi
  1680. echo "OK."
  1681. # Update userdata partition for OpenELEC multiboot
  1682. printf " Copying OpenELEC files ... "
  1683. /bin/mountx -t vfat ${DEST_CARD}p1 /mnt2 >> ${log_file} 2>&1
  1684. if [ $? -ne 0 ]; then
  1685. echo "ERROR mounting boot partition."
  1686. [ ! "${O_FROMDIR}" = "yes" ] && rm -rf ${_oelec_source:?}/* >> ${log_file} 2>&1
  1687. return 1
  1688. fi
  1689. sleep 1
  1690. mkdir /mnt2/multiboot >> ${log_file} 2>&1
  1691. #cp /multi/INITRD /mnt2/multiboot
  1692. cp ${_name}/target/KERNEL /mnt2/multiboot
  1693. if [ ! "${O_BOARD}" = "C2" ]; then
  1694. cp ${_name}/target/INITRD /mnt2/multiboot
  1695. fi
  1696. cp ${_name}/target/SYSTEM /mnt2
  1697. cp ${_name}/3rdparty/bootloader/${ODROID_DTB} /mnt2/multiboot/${ODROID_DTB}.oelec
  1698. cd /
  1699. cp /multi/boot.ini.oelec /mnt2/multiboot
  1700. cat /mnt2/multiboot/boot.ini.oelec | sed "s/boot=LABEL=userdata disk=LABEL=oelec/boot=LABEL=${label_pref}userdata disk=LABEL=${label_pref}aux/g" > _bsel_
  1701. cp _bsel_ /mnt2/multiboot/boot.ini.oelec
  1702. rm _bsel_
  1703. sync
  1704. umount /mnt2 >> ${log_file} 2>&1
  1705. echo "OK."
  1706. [ ! "${O_FROMDIR}" = "yes" ] && rm -rf ${_oelec_source:?}/* >> ${log_file} 2>&1
  1707. return 0
  1708. }
  1709. #------------------------------------------------------------------------------------------------------------------------------------------------------
  1710. #-----------------------------------------------------------------------------------------------------------------
  1711. check_inst() {
  1712. # INSTALLATION DRIVE IS MOUNTED ON /MNT
  1713. if [ "${INST_ANDROID}" != "yes" ] && [ "${INST_LINUX}" != "yes" ]; then
  1714. printf " \033[33m\033[1mNo installation file found!\033[22m\033[37m\n"
  1715. printf " \033[33m\033[1mTo install from image\033[22m\033[37m\n"
  1716. printf " \033[33m\033[1m\"update.zip\" and/or \"linux.img\" must be on source drive.\033[22m\033[37m\n"
  1717. printf " \033[33m\033[1mInstallation aborted.\033[22m\033[37m\n"
  1718. umount ${source_mount} > /dev/null 2>&1
  1719. exit_script
  1720. fi
  1721. }
  1722. #-----------------------------------------------------------------------------------------------------------------
  1723. # ====================================================================================================
  1724. # START
  1725. # ====================================================================================================
  1726. set_cardsize
  1727. print_header
  1728. check_inst
  1729. #----------------------------------------------------------------
  1730. if [ "${INST_ANDROID}" = "yes" ]; then
  1731. if [ "${A_FROMDIR}" = "yes" ]; then
  1732. check_android_backup
  1733. if [ $? -ne 0 ]; then
  1734. echo " ANDROID won't be installed!"
  1735. INST_ANDROID="no"
  1736. if [ "${INST_LINUX}" = "yes" ] && [ "${INST_ANDROID}" != "yes" ] && [ "${INST_OELEC}" != "yes" ] && [ "${INST_LINUX2}" != "yes" ]; then
  1737. ONLY_LINUX="yes"
  1738. MULTI_BOOT="no"
  1739. fi
  1740. if [ "${INST_ANDROID}" = "yes" ] && [ "${INST_LINUX}" != "yes" ] && [ "${INST_OELEC}" != "yes" ]; then
  1741. ONLY_ANDROID="yes"
  1742. MULTI_BOOT="no"
  1743. fi
  1744. sleep 1
  1745. fi
  1746. else
  1747. echo "==== UNPACK AND DECOMPRESS ANDROID IMAGES ====" >> ${log_file}
  1748. # Unpack and decompress android install images to RAM or disk
  1749. unpack_android
  1750. if [ $? -ne 0 ]; then
  1751. echo " ANDROID won't be installed!"
  1752. INST_ANDROID="no"
  1753. if [ "${INST_LINUX}" = "yes" ] && [ "${INST_ANDROID}" != "yes" ] && [ "${INST_OELEC}" != "yes" ] && [ "${INST_LINUX2}" != "yes" ]; then
  1754. ONLY_LINUX="yes"
  1755. MULTI_BOOT="no"
  1756. fi
  1757. if [ "${INST_ANDROID}" = "yes" ] && [ "${INST_LINUX}" != "yes" ] && [ "${INST_OELEC}" != "yes" ]; then
  1758. ONLY_ANDROID="yes"
  1759. MULTI_BOOT="no"
  1760. fi
  1761. sleep 1
  1762. fi
  1763. rm -rf rm ${source_mount}/android/* >> ${log_file} 2>&1
  1764. rmdir rm ${source_mount}/android >> ${log_file} 2>&1
  1765. fi
  1766. sleep 2
  1767. fi
  1768. #----------------------------------------------------------------
  1769. print_header
  1770. check_inst
  1771. print_settings
  1772. #---- Main menu -------------------
  1773. _inst_delay=${INST_DELAY}
  1774. # shellcheck disable=SC2059
  1775. while [ $_inst_delay -gt 0 ]; do
  1776. [ $INST_DELAY -lt 60 ] && printf " Auto start install in $_inst_delay sec \r"
  1777. A="z"
  1778. if read -n 1 -t 1 -s A; then
  1779. _inst_delay=${INST_DELAY}
  1780. if [ "${A}" = "1" ] && [ "${TWO_CARDS}" = "yes" ]; then
  1781. print_header
  1782. set_dest
  1783. print_header
  1784. print_settings
  1785. elif [ "${A}" = "2" ] && [ "${INST_LINUX}" = "yes" ]; then
  1786. print_header
  1787. set_userdatasize
  1788. print_header
  1789. print_settings
  1790. elif [ "${A}" = "3" ] && [ "${INST_ANDROID}" = "yes" ]; then
  1791. print_header
  1792. set_systemsize
  1793. print_header
  1794. print_settings
  1795. elif [ "${A}" = "4" ] && [ "${INST_ANDROID}" = "yes" ]; then
  1796. print_header
  1797. set_datasize
  1798. print_header
  1799. print_settings
  1800. elif [ "${A}" = "5" ] && [ "${INST_ANDROID}" = "yes" ]; then
  1801. print_header
  1802. set_cachesize
  1803. print_header
  1804. print_settings
  1805. elif [ "${A}" = "6" ] && [ "${MULTI_BOOT}" = "yes" ]; then
  1806. print_header
  1807. set_oelecsize
  1808. print_header
  1809. print_settings
  1810. elif [ "${A}" = "t" ] && [ "${INST_LINUX}" = "yes" ]; then
  1811. print_header
  1812. set_linfstype
  1813. print_header
  1814. print_settings
  1815. elif [ "${A}" = "E" ]; then
  1816. echo ""
  1817. _reboot_delay=10
  1818. while [ $_reboot_delay -gt 0 ]; do
  1819. printf " \033[33m\033[1mEXIT in $_reboot_delay sec, press \033[22ma\033[1m to abort, \033[22me\033[1m to exit \033[22m\033[37m\r"
  1820. if read -n 1 -t 1 -s B; then
  1821. _reboot_delay=10
  1822. if [ "${B}" = "a" ] || [ "${B}" = "A" ]; then
  1823. break
  1824. elif [ "${B}" = "e" ] || [ "${B}" = "E" ]; then
  1825. _reboot_delay=0
  1826. break
  1827. fi
  1828. else
  1829. let _reboot_delay=_reboot_delay-1
  1830. fi
  1831. done
  1832. if [ $_reboot_delay -eq 0 ]; then
  1833. umount ${source_mount} > /dev/null 2>&1
  1834. exit 0
  1835. else
  1836. print_header
  1837. print_settings
  1838. fi
  1839. elif [ "${A}" = "I" ]; then
  1840. echo ""
  1841. _reboot_delay=15
  1842. while [ $_reboot_delay -gt 0 ]; do
  1843. printf " \033[31m\033[1mWARNING: !! ALL DATA ON ${DEST_EMMC} CARD WILL BE ERASED !!, PRESS Y TO CONTINUE\033[22m\033[37m\r"
  1844. B="Z"
  1845. if read -n 1 -t 1 -s B; then
  1846. break
  1847. else
  1848. let _reboot_delay=_reboot_delay-1
  1849. fi
  1850. done
  1851. if [ "${B}" = "Y" ]; then
  1852. break
  1853. else
  1854. print_header
  1855. print_settings
  1856. fi
  1857. elif [ "${A}" = "s" ]; then
  1858. # SCREENSHOT ===
  1859. fbcat > /install.ppm
  1860. fi
  1861. else
  1862. [ $INST_DELAY -lt 60 ] && let _inst_delay=_inst_delay-1
  1863. fi
  1864. done
  1865. # --- Set partition label prefix ---
  1866. if [ "${DEST_EMMC}" = "EMMC" ]; then
  1867. label_pref="em"
  1868. else
  1869. label_pref="sd"
  1870. fi
  1871. if [ "${INST_ANDROID}" != "yes" ] && [ "${INST_LINUX}" != "yes" ] && [ "${INST_OELEC}" != "yes" ]; then
  1872. printf " \033[33m\033[1mNothing to install!\033[22m\033[37m\n"
  1873. printf " \033[33m\033[1mAndroid or Linux must be installed!\033[22m\033[37m\n"
  1874. printf " \033[33m\033[1mInstallation aborted.\033[22m\033[37m\n"
  1875. umount ${source_mount} > /dev/null 2>&1
  1876. exit_script
  1877. fi
  1878. # --------------------------------------------------------------------------------------------------------------------
  1879. # --- Set partitions sizes ---------
  1880. get_partsizes
  1881. sleep 1
  1882. print_header
  1883. # --- Partition and format the card ----------------------------
  1884. prepare_card
  1885. if [ $? -ne 0 ]; then
  1886. printf " \033[35mERROR PREPARING SD/EMMC CARD!\033[37m\n"
  1887. else
  1888. # shellcheck disable=SC2059
  1889. # install bootloader
  1890. if [ "${O_BOARD}" = "C2" ]; then
  1891. install_boot_c2
  1892. else
  1893. install_boot_xu
  1894. fi
  1895. if [ $? -eq 0 ]; then
  1896. if [ "${INST_ANDROID}" = "yes" ]; then
  1897. # --- Install Android ---
  1898. install_android
  1899. if [ $? -ne 0 ]; then
  1900. printf " \033[35mERROR INSTALLING ANDROID!\033[37m\n"
  1901. else
  1902. printf " \033[36mAndroid PREPARED!\033[37m\n"
  1903. printf " \033[35mFIRST BOOT CAN TAKE MORE THAN 5 MIN TO COMPLETE!\033[37m\n"
  1904. fi
  1905. rm -rf /run/inst/android/* >> ${log_file} 2>&1
  1906. rmdir /run/inst/android >> ${log_file} 2>&1
  1907. fi
  1908. if [ "${INST_LINUX}" = "yes" ]; then
  1909. # --- Install Linux ---
  1910. install_linux "linux.img"
  1911. if [ $? -ne 0 ]; then
  1912. printf " \033[35mERROR INSTALLING LINUX!\033[37m\n"
  1913. else
  1914. printf " \033[36mLinux PREPARED!\033[37m\n"
  1915. fi
  1916. fi
  1917. if [ "${INST_LINUX2}" = "yes" ]; then
  1918. # --- Install Linux ---
  1919. install_linux "linux2.img"
  1920. if [ $? -ne 0 ]; then
  1921. printf " \033[35mERROR INSTALLING LINUX 2!\033[37m\n"
  1922. else
  1923. printf " \033[36mLinux 2 PREPARED!\033[37m\n"
  1924. fi
  1925. fi
  1926. if [ "${INST_OELEC}" = "yes" ]; then
  1927. # --- Install OpenELEC ---
  1928. install_oelec
  1929. if [ $? -ne 0 ]; then
  1930. printf " \033[35mERROR INSTALLING OpenELEC!\033[37m\n"
  1931. else
  1932. printf " \033[36mOpenELEC PREPARED!\033[37m\n"
  1933. fi
  1934. fi
  1935. printf "\n \033[33mInstalling \033[1mMulti Boot support\033[22m\033[37m\n"
  1936. install_multi_sel
  1937. if [ $? -ne 0 ]; then
  1938. printf " \033[35mERROR INSTALLING Multi Boot!\033[37m\n"
  1939. else
  1940. printf " \033[36m%s CARD PREPARED FOR MULTI BOOT!\033[37m\n" "${DEST_EMMC}"
  1941. fi
  1942. umount /mnt2 >> ${log_file} 2>&1
  1943. fi
  1944. fi
  1945. echo ""
  1946. umount ${source_mount} > /dev/null 2>&1
  1947. exit_script
  1948. reboot