backup.script 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. #!/bin/bash
  2. sd_multi="no"
  3. card_no="0"
  4. #--------------------------------------------------
  5. disp_header() {
  6. clear
  7. printf "\n"
  8. printf "\n"
  9. printf "\033[36m\033[1m\n"
  10. if [ "${O_BOARD}" = "C2" ]; then
  11. printf " =================================\n"
  12. printf " = Odroid C2 Backup utility %s =\n" "${SCRIPT_VERSION}"
  13. printf " =================================\n"
  14. else
  15. printf " ======================================\n"
  16. printf " = Odroid XU3/XU4 Backup utility %s =\n" "${SCRIPT_VERSION}"
  17. printf " ======================================\n"
  18. fi
  19. printf "\033[22m\033[37m\n\n"
  20. sleep 1
  21. }
  22. #--------------------------------------------------
  23. #------------------------------------------------------------------------------------------------------------
  24. make_image() {
  25. # source partition is mounted on /mnt1
  26. mkdir /imgmnt >> ${log_file} 2>&1
  27. printf " Backup: \033[32m%s\033[37m ... preparing image... " "${2}"
  28. # Get size
  29. _size_=$(du -s /mnt1 | awk '{print $1}')
  30. _size=$(( ($_size_ / 1024) + 128 ))
  31. # add 5% ext4 fs overhead
  32. _ovhd=$(( ($_size * 6) / 100 ))
  33. _size=$(( $_size + $_ovhd ))
  34. rm -f ${1} >> ${log_file} 2>&1
  35. printf " (%sM)... " "${_size}"
  36. # create sparse image file
  37. dd if=/dev/zero of=${1} bs=1 count=0 seek=${_size}M >> ${log_file} 2>&1
  38. #dd if=/dev/zero of=${1} bs=1M count=${_size} >> ${log_file} 2>&1
  39. if [ $? -ne 0 ]; then
  40. printf "ERROR\n"
  41. return 1
  42. fi
  43. sync
  44. printf "mkfs... "
  45. mkfs.ext4 ${1} >> ${log_file} 2>&1
  46. if [ $? -ne 0 ]; then
  47. printf "ERROR\n"
  48. return 1
  49. fi
  50. sync
  51. printf "mount... "
  52. mountx ${1} /imgmnt >> ${log_file} 2>&1
  53. if [ $? -ne 0 ]; then
  54. printf "ERROR\n"
  55. return 1
  56. fi
  57. # Copy partition to image
  58. printf "copy... "
  59. if [ "${3}" = "andro" ]; then
  60. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s -A -X --no-specials /mnt1/ /imgmnt/ >> ${log_file} 2>&1
  61. else
  62. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s --stats /mnt1/ /imgmnt/ >> ${log_file} 2>&1
  63. fi
  64. if [ $? -ne 0 ]; then
  65. umount /imgmnt >> ${log_file} 2>&1
  66. printf "ERROR\n"
  67. return 1
  68. fi
  69. sync
  70. umount /imgmnt >> ${log_file} 2>&1
  71. printf "OK\n"
  72. return 0
  73. }
  74. #------------------------------------------------------------------------------------------------------------
  75. #--------------------------------------------------------------------------------------------------------------
  76. backup_android() {
  77. printf "\n Backup: \033[32m\033[1mAndroid\033[22m\033[37m\n"
  78. # backup system partition, allready mounted on /mnt1
  79. mkdir /mnt2/${BKP_PREFIX}_backup >> ${log_file} 2>&1
  80. mkdir /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
  81. rm -rf /mnt2/${BKP_PREFIX}_backup/android/* >> ${log_file} 2>&1
  82. make_image "/mnt2/${BKP_PREFIX}_backup/android/system.raw.img" "Android system" "andro"
  83. if [ $? -eq 0 ]; then
  84. umount /mnt1 >> ${log_file} 2>&1
  85. # backup data partition
  86. if [ "${sd_multi}" = "yes" ]; then
  87. /bin/mountx /dev/mmcblk${card_no}p5 /mnt1 >> ${log_file} 2>&1
  88. else
  89. /bin/mountx /dev/mmcblk${card_no}p4 /mnt1 >> ${log_file} 2>&1
  90. fi
  91. if [ $? -ne 0 ]; then
  92. umount /mnt1 >> ${log_file} 2>&1
  93. printf " ERROR mounting data partition\n"
  94. return 1
  95. fi
  96. make_image "/mnt2/${BKP_PREFIX}_backup/android/data.raw.img" "Android data" "andro"
  97. if [ $? -eq 0 ]; then
  98. umount /mnt1 >> ${log_file} 2>&1
  99. # backup cache partition
  100. /bin/mountx /dev/mmcblk${card_no}p3 /mnt1 >> ${log_file} 2>&1
  101. if [ $? -ne 0 ]; then
  102. umount /mnt1 >> ${log_file} 2>&1
  103. printf " ERROR mounting cache partition\n"
  104. return 1
  105. fi
  106. make_image "/mnt2/${BKP_PREFIX}_backup/android/cache.raw.img" "Android cache" "andro"
  107. if [ $? -ne 0 ]; then
  108. umount /mnt1 >> ${log_file} 2>&1
  109. return 1
  110. fi
  111. else
  112. umount /mnt1 >> ${log_file} 2>&1
  113. return 1
  114. fi
  115. else
  116. umount /mnt1 >> ${log_file} 2>&1
  117. return 1
  118. fi
  119. umount /mnt1 >> ${log_file} 2>&1
  120. # Mount boot card and copy android boot files
  121. printf " Backup: \033[32mCopy boot files\033[37m ... "
  122. mount -t vfat /dev/mmcblk${card_no}p1 /mnt1 >> ${log_file} 2>&1
  123. if [ $? -ne 0 ]; then
  124. printf "ERROR mounting boot card\n"
  125. return 1
  126. fi
  127. cp -rf /mnt1/* /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
  128. rm -f /mnt2/${BKP_PREFIX}_backup/android/${ODROID_IMAGE} >> ${log_file} 2>&1
  129. rm -f /mnt2/${BKP_PREFIX}_backup/android/${ODROID_DTB} >> ${log_file} 2>&1
  130. rm -rf /mnt2/${BKP_PREFIX}_backup/android/multiboot/* >> ${log_file} 2>&1
  131. rmdir /mnt2/${BKP_PREFIX}_backup/android/multiboot >> ${log_file} 2>&1
  132. if [ "${sd_multi}" = "yes" ]; then
  133. cp /mnt1/multiboot/${ODROID_IMAGE}.android /mnt2/${BKP_PREFIX}_backup/android/${ODROID_IMAGE} >> ${log_file} 2>&1
  134. if [ $? -ne 0 ]; then
  135. printf "ERROR: Image\n"
  136. return 1
  137. fi
  138. cp /mnt1/multiboot/${ODROID_DTB}.android /mnt2/${BKP_PREFIX}_backup/android/${ODROID_DTB} >> ${log_file} 2>&1
  139. if [ $? -ne 0 ]; then
  140. printf "ERROR: dtb\n"
  141. return 1
  142. fi
  143. else
  144. cp /mnt1/${ODROID_IMAGE} /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
  145. if [ $? -ne 0 ]; then
  146. printf "ERROR: Image\n"
  147. return 1
  148. fi
  149. cp /mnt1/${ODROID_DTB} /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
  150. if [ $? -ne 0 ]; then
  151. printf "ERROR: dtb\n"
  152. return 1
  153. fi
  154. fi
  155. umount /mnt1 >> ${log_file} 2>&1
  156. sync
  157. sleep 1
  158. printf "OK\n"
  159. return 0
  160. }
  161. #--------------------------------------------------------------------------------------------------------------
  162. #----------------------------------------------------------------------------------------------------------------
  163. backup_linux() {
  164. printf "\n Backup: \033[32m\033[1mLinux%s\033[22m\033[37m\n" "${1}"
  165. # backup Linux partition, allready mounted on /mnt1
  166. mkdir /mnt2/${BKP_PREFIX}_backup >> ${log_file} 2>&1
  167. mkdir /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
  168. rm -rf /mnt2/${BKP_PREFIX}_backup/linux${1}/* >> ${log_file} 2>&1
  169. make_image "/mnt2/${BKP_PREFIX}_backup/linux${1}/linux.img" "Linux root" "linux"
  170. if [ $? -ne 0 ]; then
  171. umount /mnt1 >> ${log_file} 2>&1
  172. return 1
  173. fi
  174. umount /mnt1 >> ${log_file} 2>&1
  175. if [ $? -ne 0 ]; then
  176. printf "ERROR unmounting Linux partition\n"
  177. return 1
  178. fi
  179. # Mount boot card and copy Linux boot files
  180. printf " Backup: \033[32mCopy boot files\033[37m ... "
  181. mount -t vfat /dev/mmcblk${card_no}p1 /mnt1 >> ${log_file} 2>&1
  182. if [ $? -ne 0 ]; then
  183. printf "ERROR mounting boot partition\n"
  184. return 1
  185. fi
  186. if [ "${sd_multi}" = "yes" ]; then
  187. cp /mnt1/multiboot/${ODROID_IMAGE}.linux /mnt2/${BKP_PREFIX}_backup/linux${1}/${ODROID_IMAGE} >> ${log_file} 2>&1
  188. if [ $? -ne 0 ]; then
  189. printf "ERROR: Image\n"
  190. return 1
  191. fi
  192. cp /mnt1/multiboot/${ODROID_DTB}.linux /mnt2/${BKP_PREFIX}_backup/linux${1}/${ODROID_DTB} >> ${log_file} 2>&1
  193. if [ $? -ne 0 ]; then
  194. printf "ERROR: dtb\n"
  195. return 1
  196. fi
  197. cp /mnt1/multiboot/uInitrd.linux /mnt2/${BKP_PREFIX}_backup/linux${1}/uInitrd >> ${log_file} 2>&1
  198. if [ $? -ne 0 ]; then
  199. printf "ERROR: uInitrd\n"
  200. return 1
  201. fi
  202. else
  203. cp /mnt1/${ODROID_IMAGE} /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
  204. if [ $? -ne 0 ]; then
  205. printf "ERROR: Image "
  206. fi
  207. cp /mnt1/${ODROID_DTB} /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
  208. if [ $? -ne 0 ]; then
  209. printf "ERROR: dtb "
  210. fi
  211. cp /mnt1/uInitrd /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
  212. if [ $? -ne 0 ]; then
  213. printf "ERROR: uInitrd "
  214. fi
  215. fi
  216. sync
  217. sleep 1
  218. umount /mnt1 >> ${log_file} 2>&1
  219. printf "OK\n"
  220. return 0
  221. }
  222. #----------------------------------------------------------------------------------------------------------------
  223. backup_oelec() {
  224. printf "\n Backup: \033[32m\033[1mOpenElec\033[22m\033[37m\n"
  225. # backup oelec partition, allready mounted on /mnt1
  226. mkdir /mnt2/${BKP_PREFIX}_backup >> ${log_file} 2>&1
  227. mkdir /mnt2/${BKP_PREFIX}_backup/oelec >> ${log_file} 2>&1
  228. rm -rf /mnt2/${BKP_PREFIX}_backup/oelec/* >> ${log_file} 2>&1
  229. mkdir /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
  230. mkdir /mnt2/${BKP_PREFIX}_backup/oelec/3rdparty >> ${log_file} 2>&1
  231. mkdir /mnt2/${BKP_PREFIX}_backup/oelec/3rdparty/bootloader >> ${log_file} 2>&1
  232. make_image "/mnt2/${BKP_PREFIX}_backup/oelec/oelec.img" "OpenElec" "linux"
  233. if [ $? -ne 0 ]; then
  234. umount /mnt1 >> ${log_file} 2>&1
  235. return 1
  236. fi
  237. umount /mnt1 >> ${log_file} 2>&1
  238. # Mount boot card and copy OpenElec boot files
  239. printf " Backup: \033[32mCopy OpenElec files\033[37m ... "
  240. mount -t vfat /dev/mmcblk${card_no}p1 /mnt1 >> ${log_file} 2>&1
  241. if [ $? -ne 0 ]; then
  242. printf "ERROR mounting boot card\n"
  243. return 1
  244. fi
  245. cp /mnt1/SYSTEM /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
  246. if [ $? -ne 0 ]; then
  247. printf "ERROR: SYSTEM\n"
  248. return 1
  249. fi
  250. cp /mnt1/multiboot/KERNEL /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
  251. if [ $? -ne 0 ]; then
  252. printf "ERROR: KERNEL\n"
  253. return 1
  254. fi
  255. cp /mnt1/multiboot/${ODROID_DTB}.oelec /mnt2/${BKP_PREFIX}_backup/oelec/3rdparty/bootloader/${ODROID_DTB} >> ${log_file} 2>&1
  256. if [ $? -ne 0 ]; then
  257. printf "ERROR: dtb\n"
  258. return 1
  259. fi
  260. if [ ! "${O_BOARD}" = "C2" ]; then
  261. cp /mnt1/multiboot/INITRD /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
  262. if [ $? -ne 0 ]; then
  263. printf "ERROR: INITRD\n"
  264. return 1
  265. fi
  266. fi
  267. umount /mnt1 >> ${log_file} 2>&1
  268. printf "OK\n"
  269. return 0
  270. }
  271. #----------------------------------------------------------------------------------------------------
  272. exit_script() {
  273. local _delay=30
  274. local B="X"
  275. echo ""
  276. while [ $_delay -gt 0 ]; do
  277. printf " \033[33mPress \033[1mE\033[22m to exit to main menu (%s) \033[37m\r" "${_delay}"
  278. if read -n 1 -t 1 -s B; then
  279. _delay=30
  280. if [ "${B}" = "E" ] || [ "${B}" = "e" ]; then
  281. break
  282. elif [ "${B}" = "s" ]; then
  283. # SCREENSHOT ===
  284. fbcat > /backup_exit.ppm
  285. fi
  286. else
  287. let _delay=_delay-1
  288. fi
  289. done
  290. printf "\r\033[2K"
  291. umount /mnt1 > /dev/null 2>&1
  292. umount /mnt2 > /dev/null 2>&1
  293. exit 0
  294. }
  295. #----------------------------------------------------------------------------------------------------
  296. #=====================================================================================
  297. mkdir /mnt1 > /dev/null 2>&1
  298. mkdir /mnt2 > /dev/null 2>&1
  299. mkdir /multiboot > /dev/null 2>&1
  300. umount /mnt1 > /dev/null 2>&1
  301. umount /mnt2 > /dev/null 2>&1
  302. disp_header
  303. # ===============
  304. # Check USB drive
  305. # ===============
  306. if [ ! -b /dev/sda ]; then
  307. printf " ERROR: USB drive not found\n"
  308. exit_script
  309. fi
  310. usb_part="0"
  311. max_usbpart=0
  312. #------------------------------------------------------------------------------------
  313. check_usbpart() {
  314. local usbpart_free=0
  315. if [ -b /dev/sda${1} ]; then
  316. let max_usbpart=max_usbpart+1
  317. printf " \033[32m\033[1m%s\033[22m partition #%s \033[37m (" "${1}" "${1}"
  318. /bin/mountx /dev/sda${1} /mnt2 > /dev/null 2>&1
  319. if [ $? -ne 0 ]; then
  320. printf "NOT MOUNTABLE)\n"
  321. else
  322. [ "${usb_part}" = "0" ] && usb_part="1"
  323. usbpart_free=$(df | grep /dev/sda${1} | awk '{print $4}')
  324. usbpart_free=$(( $usbpart_free / 1024 ))
  325. printf "%sM free)\n" "${usbpart_free}"
  326. fi
  327. umount /mnt2 > /dev/null 2>&1
  328. fi
  329. }
  330. #------------------------------------------------------------------------------------
  331. printf " \033[33mMore than one partition on USB drive detected, select which one to use for backup\033[37m\n\n"
  332. check_usbpart "1"
  333. check_usbpart "2"
  334. check_usbpart "3"
  335. check_usbpart "4"
  336. check_usbpart "5"
  337. check_usbpart "6"
  338. printf "\n"
  339. if [ $max_usbpart -eq 0 ] || [ "${usb_part}" = "0" ]; then
  340. printf " ERROR: no usable USB partition found!\n"
  341. exit_script
  342. fi
  343. _delay=30
  344. usb_part="1"
  345. while [ $_delay -gt 0 ]; do
  346. printf " \033[33mSelect the backup partition, default is \033[1m#1\033[22m %s\033[37m \r" "${_delay}"
  347. B="X"
  348. if read -n 1 -t 1 -s B; then
  349. _delay=30
  350. if [ "${B}" = "1" ] && [ $max_usbpart -ge 1 ]; then
  351. usb_part="1"
  352. break
  353. elif [ "${B}" = "2" ] && [ $max_usbpart -ge 2 ]; then
  354. usb_part="2"
  355. break
  356. elif [ "${B}" = "3" ] && [ $max_usbpart -ge 3 ]; then
  357. usb_part="3"
  358. break
  359. elif [ "${B}" = "4" ] && [ $max_usbpart -ge 4 ]; then
  360. usb_part="4"
  361. break
  362. elif [ "${B}" = "5" ] && [ $max_usbpart -ge 5 ]; then
  363. usb_part="5"
  364. break
  365. elif [ "${B}" = "6" ] && [ $max_usbpart -ge 6 ]; then
  366. usb_part="6"
  367. break
  368. fi
  369. else
  370. let _delay=_delay-1
  371. fi
  372. done
  373. disp_header
  374. # Mount backup partition
  375. /bin/mountx /dev/sda${usb_part} /mnt2 > /dev/null 2>&1
  376. if [ $? -ne 0 ]; then
  377. printf " ERROR mounting USB partition #%s\n" "${usb_part}"
  378. exit_script
  379. fi
  380. #==========================================================================================
  381. rm /mnt2/backup.log > /dev/null 2>&1
  382. log_file="/mnt2/backup.log"
  383. #log_file="ls/dev/null"
  384. # Check source drive
  385. if [ -b /dev/mmcblk1 ]; then
  386. printf " \033[33mTwo cards detected, select which one to use for backup\033[37m\n\n"
  387. printf " \033[32m\033[1m0\033[22m EMMC Card\033[37m\n"
  388. printf " \033[32m\033[1m1\033[22m SD Card\033[37m\n\n"
  389. _delay=30
  390. while [ $_delay -gt 0 ]; do
  391. printf " \033[33mSelect the card, default is \033[1mEMMC\033[22m %s\033[37m \r" "${_delay}"
  392. B="X"
  393. if read -n 1 -t 1 -s B; then
  394. _delay=30
  395. if [ "${B}" = "0" ]; then
  396. break
  397. elif [ "${B}" = "1" ]; then
  398. card_no="1"
  399. break
  400. fi
  401. else
  402. let _delay=_delay-1
  403. fi
  404. done
  405. disp_header
  406. fi
  407. # Display backup info
  408. printf " \033[32mBackup from "
  409. card_type="SD"
  410. if [ -b /dev/disk/by-label/sduserdata ] || [ -b /dev/disk/by-label/emuserdata ]; then
  411. sd_multi="yes"
  412. # shellcheck disable=SC2010
  413. tmp_crdtype=`ls -l /dev/disk/by-label | grep mmcblk${card_no}p1 | awk '{print $4}'`
  414. [ "${tmp_crdtype}" = "emuserdata" ] && card_type="EMMC"
  415. printf "\033[1mMultiBoot\033[22m %s card " "${card_type}"
  416. else
  417. if [ -b /dev/mmcblk1 ] && [ "${card_no}" = "0" ]; then
  418. card_type="EMMC"
  419. elif [ -b /dev/mmcblk1 ] && [ "${card_no}" = "1" ]; then
  420. card_type="SD"
  421. else
  422. card_type="SD/EMMC"
  423. fi
  424. printf "\033[1mOriginal Odroid\033[22m %s card " "${card_type}"
  425. fi
  426. printf " to \033[1mUSB partition #%s\033[22m\033[37m\n\n" "${usb_part}"
  427. # Mount partition 2 (Android system or Linux)
  428. /bin/mountx /dev/mmcblk${card_no}p2 /mnt1 >> ${log_file} 2>&1
  429. if [ $? -ne 0 ]; then
  430. umount /mnt2 > /dev/null 2>&1
  431. printf " ERROR mounting source card\n"
  432. exit_script
  433. fi
  434. # Wait for confirmation
  435. _delay=30
  436. while [ $_delay -gt 0 ]; do
  437. printf " \033[33mReady for backup, press \033[1mY\033[22m to continue, \033[1mE\033[22m to exit (%s) \033[37m\r" "${_delay}"
  438. B="X"
  439. if read -n 1 -t 1 -s B; then
  440. _delay=30
  441. if [ "${B}" = "Y" ]; then
  442. printf "\r\033[2K"
  443. break
  444. elif [ "${B}" = "E" ] || [ "${B}" = "e" ]; then
  445. _delay=0
  446. break
  447. elif [ "${B}" = "s" ]; then
  448. # SCREENSHOT ===
  449. fbcat > /backup.ppm
  450. fi
  451. else
  452. let _delay=_delay-1
  453. fi
  454. done
  455. if [ $_delay -eq 0 ]; then
  456. printf "\r\033[2K"
  457. exit_script
  458. fi
  459. # Ckeck if it is Android partition
  460. if [ -f /mnt1/${ODROID_FSTAB} ]; then
  461. backup_android
  462. else
  463. if [ ! "${sd_multi}" = "yes" ]; then
  464. # backup single linux card
  465. if [ -f /mnt1/etc/fstab ]; then
  466. backup_linux ""
  467. fi
  468. fi
  469. fi
  470. umount /mnt1 >> ${log_file} 2>&1
  471. if [ "${sd_multi}" = "yes" ]; then
  472. if [ -b /dev/disk/by-label/sdlinux ] || [ -b /dev/disk/by-label/emlinux ]; then
  473. printf "\n"
  474. # Backup multiboot Linux
  475. /bin/mountx /dev/mmcblk${card_no}p7 /mnt1 >> ${log_file} 2>&1
  476. if [ $? -ne 0 ]; then
  477. printf " ERROR mounting Linux partition\n"
  478. exit_script
  479. fi
  480. if [ -f /mnt1/etc/fstab ]; then
  481. backup_linux ""
  482. fi
  483. fi
  484. umount /mnt1 >> ${log_file} 2>&1
  485. if [ -b /dev/disk/by-label/sdlinux2 ] || [ -b /dev/disk/by-label/emlinux2 ]; then
  486. printf "\n"
  487. # Backup multiboot Linux2
  488. /bin/mountx /dev/mmcblk${card_no}p8 /mnt1 >> ${log_file} 2>&1
  489. if [ $? -eq 0 ]; then
  490. if [ -f /mnt1/etc/fstab ]; then
  491. backup_linux "2"
  492. fi
  493. fi
  494. fi
  495. if [ -b /dev/disk/by-label/sdaux ] || [ -b /dev/disk/by-label/emaux ]; then
  496. printf "\n"
  497. # Backup multiboot OpenElec
  498. /bin/mountx /dev/mmcblk${card_no}p6 /mnt1 >> ${log_file} 2>&1
  499. if [ $? -eq 0 ]; then
  500. backup_oelec
  501. fi
  502. fi
  503. fi
  504. umount /mnt1 >> ${log_file} 2>&1
  505. umount /mnt2 > /dev/null 2>&1
  506. printf "\n FINISHED.\n"
  507. exit_script
  508. #=====================================================================================