install.script 67 KB

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