install.script 63 KB

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