loboris 9 anni fa
commit
a7a272f86e
100 ha cambiato i file con 598 aggiunte e 0 eliminazioni
  1. 1 0
      .gitignore
  2. 25 0
      C2/initramfs/pack
  3. 0 0
      C2/initramfs/ramfs/ODROID_C2
  4. 572 0
      C2/initramfs/ramfs/backup.script
  5. BIN
      C2/initramfs/ramfs/bin/[
  6. BIN
      C2/initramfs/ramfs/bin/[[
  7. BIN
      C2/initramfs/ramfs/bin/acpid
  8. BIN
      C2/initramfs/ramfs/bin/ash
  9. BIN
      C2/initramfs/ramfs/bin/awk
  10. BIN
      C2/initramfs/ramfs/bin/basename
  11. BIN
      C2/initramfs/ramfs/bin/bash
  12. BIN
      C2/initramfs/ramfs/bin/blockdev
  13. BIN
      C2/initramfs/ramfs/bin/btrfs
  14. BIN
      C2/initramfs/ramfs/bin/btrfs-zero-log
  15. BIN
      C2/initramfs/ramfs/bin/busybox
  16. BIN
      C2/initramfs/ramfs/bin/cat
  17. BIN
      C2/initramfs/ramfs/bin/chmod
  18. BIN
      C2/initramfs/ramfs/bin/chown
  19. BIN
      C2/initramfs/ramfs/bin/chroot
  20. BIN
      C2/initramfs/ramfs/bin/chvt
  21. BIN
      C2/initramfs/ramfs/bin/clear
  22. BIN
      C2/initramfs/ramfs/bin/cmp
  23. BIN
      C2/initramfs/ramfs/bin/cp
  24. BIN
      C2/initramfs/ramfs/bin/cpio
  25. BIN
      C2/initramfs/ramfs/bin/cut
  26. BIN
      C2/initramfs/ramfs/bin/date
  27. BIN
      C2/initramfs/ramfs/bin/dd
  28. BIN
      C2/initramfs/ramfs/bin/deallocvt
  29. BIN
      C2/initramfs/ramfs/bin/devmem
  30. BIN
      C2/initramfs/ramfs/bin/df
  31. BIN
      C2/initramfs/ramfs/bin/dmesg
  32. BIN
      C2/initramfs/ramfs/bin/dnsdomainname
  33. BIN
      C2/initramfs/ramfs/bin/du
  34. BIN
      C2/initramfs/ramfs/bin/dumpkmap
  35. BIN
      C2/initramfs/ramfs/bin/dux
  36. BIN
      C2/initramfs/ramfs/bin/echo
  37. BIN
      C2/initramfs/ramfs/bin/egrep
  38. BIN
      C2/initramfs/ramfs/bin/env
  39. BIN
      C2/initramfs/ramfs/bin/expr
  40. BIN
      C2/initramfs/ramfs/bin/false
  41. BIN
      C2/initramfs/ramfs/bin/fbset
  42. BIN
      C2/initramfs/ramfs/bin/fdflush
  43. BIN
      C2/initramfs/ramfs/bin/fdisk
  44. BIN
      C2/initramfs/ramfs/bin/fgrep
  45. BIN
      C2/initramfs/ramfs/bin/find
  46. BIN
      C2/initramfs/ramfs/bin/fstrim
  47. BIN
      C2/initramfs/ramfs/bin/fstype
  48. BIN
      C2/initramfs/ramfs/bin/grep
  49. BIN
      C2/initramfs/ramfs/bin/gunzip
  50. BIN
      C2/initramfs/ramfs/bin/gzip
  51. BIN
      C2/initramfs/ramfs/bin/halt
  52. BIN
      C2/initramfs/ramfs/bin/hostname
  53. BIN
      C2/initramfs/ramfs/bin/hwclock
  54. BIN
      C2/initramfs/ramfs/bin/ifconfig
  55. BIN
      C2/initramfs/ramfs/bin/img2simg
  56. BIN
      C2/initramfs/ramfs/bin/ip
  57. BIN
      C2/initramfs/ramfs/bin/ipconfig
  58. BIN
      C2/initramfs/ramfs/bin/kbd_mode
  59. BIN
      C2/initramfs/ramfs/bin/kill
  60. BIN
      C2/initramfs/ramfs/bin/kmod
  61. BIN
      C2/initramfs/ramfs/bin/ln
  62. BIN
      C2/initramfs/ramfs/bin/loadfont
  63. BIN
      C2/initramfs/ramfs/bin/loadkeys
  64. BIN
      C2/initramfs/ramfs/bin/loadkmap
  65. BIN
      C2/initramfs/ramfs/bin/losetup
  66. BIN
      C2/initramfs/ramfs/bin/ls
  67. BIN
      C2/initramfs/ramfs/bin/lsx
  68. BIN
      C2/initramfs/ramfs/bin/lzop
  69. BIN
      C2/initramfs/ramfs/bin/lzopcat
  70. BIN
      C2/initramfs/ramfs/bin/make_ext4fs
  71. BIN
      C2/initramfs/ramfs/bin/minips
  72. BIN
      C2/initramfs/ramfs/bin/mkdir
  73. BIN
      C2/initramfs/ramfs/bin/mkfifo
  74. BIN
      C2/initramfs/ramfs/bin/mkfs
  75. BIN
      C2/initramfs/ramfs/bin/mkfs.btrfs
  76. BIN
      C2/initramfs/ramfs/bin/mkfs.ext4
  77. BIN
      C2/initramfs/ramfs/bin/mkfs.fat
  78. BIN
      C2/initramfs/ramfs/bin/mkfs.vfat
  79. BIN
      C2/initramfs/ramfs/bin/mknod
  80. BIN
      C2/initramfs/ramfs/bin/mkswap
  81. BIN
      C2/initramfs/ramfs/bin/mktemp
  82. BIN
      C2/initramfs/ramfs/bin/modinfo
  83. BIN
      C2/initramfs/ramfs/bin/more
  84. BIN
      C2/initramfs/ramfs/bin/mount
  85. BIN
      C2/initramfs/ramfs/bin/mountx
  86. BIN
      C2/initramfs/ramfs/bin/mv
  87. BIN
      C2/initramfs/ramfs/bin/nano
  88. BIN
      C2/initramfs/ramfs/bin/nfsmount
  89. BIN
      C2/initramfs/ramfs/bin/ntfs-3g
  90. BIN
      C2/initramfs/ramfs/bin/nuke
  91. BIN
      C2/initramfs/ramfs/bin/openvt
  92. BIN
      C2/initramfs/ramfs/bin/partprobe
  93. BIN
      C2/initramfs/ramfs/bin/pidof
  94. BIN
      C2/initramfs/ramfs/bin/pivot_root
  95. BIN
      C2/initramfs/ramfs/bin/plymouth
  96. BIN
      C2/initramfs/ramfs/bin/poweroff
  97. BIN
      C2/initramfs/ramfs/bin/printf
  98. BIN
      C2/initramfs/ramfs/bin/ps
  99. BIN
      C2/initramfs/ramfs/bin/pwd
  100. BIN
      C2/initramfs/ramfs/bin/readlink

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+images/**

+ 25 - 0
C2/initramfs/pack

@@ -0,0 +1,25 @@
+#!/bin/bash
+
+if [ ! -d ramfs ]; then
+  exit 1
+fi
+
+rm initrd.new > /dev/null 2>&1
+rm initrd.new.gz > /dev/null 2>&1
+
+cd ramfs
+# Create and compress the cpio archive:
+
+find | cpio -H newc -o > ../initrd.new
+cd ..
+gzip initrd.new
+
+#Wrap up in a u-boot header:
+
+mkimage -A arm64 -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d initrd.new.gz uInitrd.multi
+
+mv uInitrd.multi ../multiboot/uInitrd.multi
+
+rm initrd.new > /dev/null 2>&1
+rm initrd.new.gz > /dev/null 2>&1
+

+ 0 - 0
C2/initramfs/ramfs/ODROID_C2


+ 572 - 0
C2/initramfs/ramfs/backup.script

@@ -0,0 +1,572 @@
+#!/bin/bash
+
+sd_multi="no"
+card_no="0"
+
+#--------------------------------------------------
+disp_header() {
+	clear
+	printf "\n"
+	printf "\n"
+	printf "\033[36m\033[1m\n"
+	if [ "${O_BOARD}" = "C2" ]; then
+		printf "    =================================\n"
+		printf "    = Odroid C2 Backup utility %s =\n" "${SCRIPT_VERSION}"
+		printf "    =================================\n"
+	else
+		printf "    ======================================\n"
+		printf "    = Odroid XU3/XU4 Backup utility %s =\n" "${SCRIPT_VERSION}"
+		printf "    ======================================\n"
+	fi
+	printf "\033[22m\033[37m\n\n"
+	sleep 1
+}
+#--------------------------------------------------
+
+#------------------------------------------------------------------------------------------------------------
+make_image() {
+	# source partition is mounted on /mnt1
+	mkdir /imgmnt >> ${log_file} 2>&1
+
+	printf "    Backup: \033[32m%s\033[37m ... preparing image... " "${2}"
+	# Get size
+	_size_=$(du -s /mnt1 | awk '{print $1}')
+	_size=$(( ($_size_  / 1024) + 128 ))
+	# add 5% ext4 fs overhead
+	_ovhd=$(( ($_size * 6) / 100 ))
+	_size=$(( $_size + $_ovhd ))
+
+    rm -f ${1} >> ${log_file} 2>&1
+	printf " (%sM)... " "${_size}"
+	# create sparse image file
+	dd if=/dev/zero of=${1} bs=1 count=0 seek=${_size}M >> ${log_file} 2>&1
+	#dd if=/dev/zero of=${1} bs=1M count=${_size} >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR\n"
+		return 1
+	fi
+	sync
+
+	printf "mkfs... "
+	mkfs.ext4 ${1} >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR\n"
+		return 1
+	fi
+	sync
+
+	printf "mount... "
+	mountx ${1} /imgmnt >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR\n"
+		return 1
+	fi
+
+	# Copy partition to image
+	printf "copy... "
+	if [ "${3}" = "andro" ]; then
+		rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s -A -X --no-specials /mnt1/ /imgmnt/ >> ${log_file} 2>&1
+	else
+		rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s --stats /mnt1/ /imgmnt/ >> ${log_file} 2>&1
+	fi
+	if [ $? -ne 0 ]; then
+		umount /imgmnt >> ${log_file} 2>&1
+		printf "ERROR\n"
+		return 1
+    fi
+	sync
+
+	umount /imgmnt >> ${log_file} 2>&1
+
+	printf "OK\n"
+	return 0
+}
+#------------------------------------------------------------------------------------------------------------
+
+
+#--------------------------------------------------------------------------------------------------------------
+backup_android() {
+	printf "\n    Backup: \033[32m\033[1mAndroid\033[22m\033[37m\n"
+
+	# backup system partition, allready mounted on /mnt1
+	mkdir /mnt2/${BKP_PREFIX}_backup >> ${log_file} 2>&1
+	mkdir /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
+	rm -rf /mnt2/${BKP_PREFIX}_backup/android/* >> ${log_file} 2>&1
+
+	make_image "/mnt2/${BKP_PREFIX}_backup/android/system.raw.img" "Android system" "andro"
+	if [ $? -eq 0 ]; then
+		umount /mnt1 >> ${log_file} 2>&1
+
+		# backup data partition
+		if [ "${sd_multi}" = "yes" ]; then
+			/bin/mountx /dev/mmcblk${card_no}p5 /mnt1 >> ${log_file} 2>&1
+		else
+			/bin/mountx /dev/mmcblk${card_no}p4 /mnt1 >> ${log_file} 2>&1
+		fi
+		if [ $? -ne 0 ]; then
+			umount /mnt1 >> ${log_file} 2>&1
+			printf "    ERROR mounting data partition\n"
+			return 1
+		fi
+
+		make_image "/mnt2/${BKP_PREFIX}_backup/android/data.raw.img" "Android data" "andro"
+		if [ $? -eq 0 ]; then
+			umount /mnt1 >> ${log_file} 2>&1
+
+			# backup cache partition
+			/bin/mountx /dev/mmcblk${card_no}p3 /mnt1 >> ${log_file} 2>&1
+			if [ $? -ne 0 ]; then
+				umount /mnt1 >> ${log_file} 2>&1
+				printf "    ERROR mounting cache partition\n"
+				return 1
+			fi
+
+			make_image "/mnt2/${BKP_PREFIX}_backup/android/cache.raw.img" "Android cache" "andro"
+			if [ $? -ne 0 ]; then
+				umount /mnt1 >> ${log_file} 2>&1
+				return 1
+			fi
+		else
+			umount /mnt1 >> ${log_file} 2>&1
+			return 1
+		fi
+	else
+		umount /mnt1 >> ${log_file} 2>&1
+		return 1
+	fi
+
+	umount /mnt1 >> ${log_file} 2>&1
+
+	# Mount boot card and copy android boot files
+	printf "    Backup: \033[32mCopy boot files\033[37m ... "
+	mount -t vfat /dev/mmcblk${card_no}p1 /mnt1 >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR mounting boot card\n"
+		return 1
+	fi
+
+	cp -rf /mnt1/* /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
+	rm -f /mnt2/${BKP_PREFIX}_backup/android/${ODROID_IMAGE} >> ${log_file} 2>&1
+	rm -f /mnt2/${BKP_PREFIX}_backup/android/${ODROID_DTB} >> ${log_file} 2>&1
+	rm -rf /mnt2/${BKP_PREFIX}_backup/android/multiboot/* >> ${log_file} 2>&1
+	rmdir /mnt2/${BKP_PREFIX}_backup/android/multiboot >> ${log_file} 2>&1
+
+	if [ "${sd_multi}" = "yes" ]; then
+		cp /mnt1/multiboot/${ODROID_IMAGE}.android /mnt2/${BKP_PREFIX}_backup/android/${ODROID_IMAGE} >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: Image\n"
+			return 1
+		fi
+		cp /mnt1/multiboot/${ODROID_DTB}.android /mnt2/${BKP_PREFIX}_backup/android/${ODROID_DTB} >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: dtb\n"
+			return 1
+		fi
+	else
+		cp /mnt1/${ODROID_IMAGE} /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: Image\n"
+			return 1
+		fi
+		cp /mnt1/${ODROID_DTB} /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: dtb\n"
+			return 1
+		fi
+	fi
+	umount /mnt1 >> ${log_file} 2>&1
+	sync
+	sleep 1
+	printf "OK\n"
+
+	return 0
+}
+#--------------------------------------------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------------------------------------------
+backup_linux() {
+	printf "\n    Backup: \033[32m\033[1mLinux%s\033[22m\033[37m\n" "${1}"
+
+	# backup Linux partition, allready mounted on /mnt1
+	mkdir /mnt2/${BKP_PREFIX}_backup >> ${log_file} 2>&1
+	mkdir /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
+	rm -rf /mnt2/${BKP_PREFIX}_backup/linux${1}/* >> ${log_file} 2>&1
+
+	make_image "/mnt2/${BKP_PREFIX}_backup/linux${1}/linux.img" "Linux root" "linux"
+	if [ $? -ne 0 ]; then
+		umount /mnt1 >> ${log_file} 2>&1
+		return 1
+	fi
+
+	umount /mnt1 >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR unmounting Linux partition\n"
+		return 1
+	fi
+
+	# Mount boot card and copy Linux boot files
+	printf "    Backup: \033[32mCopy boot files\033[37m ... "
+	mount -t vfat /dev/mmcblk${card_no}p1 /mnt1 >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR mounting boot partition\n"
+		return 1
+	fi
+
+	if [ "${sd_multi}" = "yes" ]; then
+		cp /mnt1/multiboot/${ODROID_IMAGE}.linux /mnt2/${BKP_PREFIX}_backup/linux${1}/${ODROID_IMAGE} >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: Image\n"
+			return 1
+		fi
+		cp /mnt1/multiboot/${ODROID_DTB}.linux /mnt2/${BKP_PREFIX}_backup/linux${1}/${ODROID_DTB} >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: dtb\n"
+			return 1
+		fi
+		cp /mnt1/multiboot/uInitrd.linux /mnt2/${BKP_PREFIX}_backup/linux${1}/uInitrd >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: uInitrd\n"
+			return 1
+		fi
+	else
+		cp /mnt1/${ODROID_IMAGE} /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: Image "
+		fi
+		cp /mnt1/${ODROID_DTB} /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: dtb "
+		fi
+		cp /mnt1/uInitrd /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: uInitrd "
+		fi
+	fi
+	sync
+	sleep 1
+	umount /mnt1 >> ${log_file} 2>&1
+	printf "OK\n"
+
+	return 0
+}
+#----------------------------------------------------------------------------------------------------------------
+
+backup_oelec() {
+	printf "\n    Backup: \033[32m\033[1mOpenElec\033[22m\033[37m\n"
+
+	# backup oelec partition, allready mounted on /mnt1
+	mkdir /mnt2/${BKP_PREFIX}_backup >> ${log_file} 2>&1
+	mkdir /mnt2/${BKP_PREFIX}_backup/oelec >> ${log_file} 2>&1
+	rm -rf /mnt2/${BKP_PREFIX}_backup/oelec/* >> ${log_file} 2>&1
+	mkdir /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
+	mkdir /mnt2/${BKP_PREFIX}_backup/oelec/3rdparty >> ${log_file} 2>&1
+	mkdir /mnt2/${BKP_PREFIX}_backup/oelec/3rdparty/bootloader >> ${log_file} 2>&1
+
+	make_image "/mnt2/${BKP_PREFIX}_backup/oelec/oelec.img" "OpenElec" "linux"
+	if [ $? -ne 0 ]; then
+		umount /mnt1 >> ${log_file} 2>&1
+		return 1
+	fi
+
+	umount /mnt1 >> ${log_file} 2>&1
+
+	# Mount boot card and copy OpenElec boot files
+	printf "    Backup: \033[32mCopy OpenElec files\033[37m ... "
+	mount -t vfat /dev/mmcblk${card_no}p1 /mnt1 >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR mounting boot card\n"
+		return 1
+	fi
+
+	cp /mnt1/SYSTEM /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR: SYSTEM\n"
+		return 1
+	fi
+	cp /mnt1/multiboot/KERNEL /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR: KERNEL\n"
+		return 1
+	fi
+	cp /mnt1/multiboot/${ODROID_DTB}.oelec /mnt2/${BKP_PREFIX}_backup/oelec/3rdparty/bootloader/${ODROID_DTB} >> ${log_file} 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR: dtb\n"
+		return 1
+	fi
+	if [ ! "${O_BOARD}" = "C2" ]; then
+		cp /mnt1/multiboot/INITRD /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "ERROR: INITRD\n"
+			return 1
+		fi
+	fi
+	umount /mnt1 >> ${log_file} 2>&1
+	printf "OK\n"
+
+	return 0
+}
+
+#----------------------------------------------------------------------------------------------------
+exit_script() {
+	local _delay=30
+	local B="X"
+	echo ""
+	while [ $_delay -gt 0 ]; do
+		printf "    \033[33mPress \033[1mE\033[22m to exit to main menu (%s)  \033[37m\r" "${_delay}"
+		if read -n 1 -t 1 -s B; then
+			_delay=30
+			if [ "${B}" = "E" ] || [ "${B}" = "e" ]; then
+				break
+			fi
+		else
+			let _delay=_delay-1
+		fi
+	done
+
+	printf "\r\033[2K"
+	umount /mnt1 > /dev/null 2>&1
+	umount /mnt2 > /dev/null 2>&1
+	exit 0
+}
+#----------------------------------------------------------------------------------------------------
+
+
+#=====================================================================================
+
+mkdir /mnt1 > /dev/null 2>&1
+mkdir /mnt2 > /dev/null 2>&1
+mkdir /multiboot > /dev/null 2>&1
+umount /mnt1 > /dev/null 2>&1
+umount /mnt2 > /dev/null 2>&1
+
+disp_header
+
+
+# ===============
+# Check USB drive
+# ===============
+
+if [ ! -b /dev/sda ]; then
+	printf "    ERROR: USB drive not found\n"
+	exit_script
+fi
+
+usb_part="0"
+max_usbpart=0
+
+#------------------------------------------------------------------------------------
+check_usbpart() {
+	local usbpart_free=0
+	if [ -b /dev/sda${1} ]; then
+		let max_usbpart=max_usbpart+1
+		printf "    \033[32m\033[1m%s\033[22m partition #%s \033[37m (" "${1}" "${1}"
+		/bin/mountx /dev/sda${1} /mnt2 > /dev/null 2>&1
+		if [ $? -ne 0 ]; then
+			printf "NOT MOUNTABLE)\n"
+		else
+			[ "${usb_part}" = "0" ] && usb_part="1"
+			usbpart_free=$(df | grep /dev/sda${1} | awk '{print $4}')
+			usbpart_free=$(( $usbpart_free / 1024 ))
+			printf "%sM free)\n" "${usbpart_free}"
+		fi
+		umount /mnt2 > /dev/null 2>&1
+	fi
+}
+#------------------------------------------------------------------------------------
+
+
+printf "    \033[33mMore than one partition on USB drive detected, select which one to use for backup\033[37m\n\n"
+check_usbpart "1"
+check_usbpart "2"
+check_usbpart "3"
+check_usbpart "4"
+check_usbpart "5"
+check_usbpart "6"
+printf "\n"
+
+if [ $max_usbpart -eq 0 ] || [ "${usb_part}" = "0" ]; then
+	printf "    ERROR: no usable USB partition found!\n"
+	exit_script
+fi
+
+
+_delay=30
+usb_part="1"
+while [ $_delay -gt 0 ]; do
+	printf "    \033[33mSelect the backup partition, default is \033[1m#1\033[22m %s\033[37m  \r" "${_delay}"
+	B="X"
+	if read -n 1 -t 1 -s B; then
+		_delay=30
+		if [ "${B}" = "1" ] && [ $max_usbpart -ge 1 ]; then
+			usb_part="1"
+			break
+		elif [ "${B}" = "2" ] && [ $max_usbpart -ge 2 ]; then
+			usb_part="2"
+			break
+		elif [ "${B}" = "3" ] && [ $max_usbpart -ge 3 ]; then
+			usb_part="3"
+			break
+		elif [ "${B}" = "4" ] && [ $max_usbpart -ge 4 ]; then
+			usb_part="4"
+			break
+		elif [ "${B}" = "5" ] && [ $max_usbpart -ge 5 ]; then
+			usb_part="5"
+			break
+		elif [ "${B}" = "6" ] && [ $max_usbpart -ge 6 ]; then
+			usb_part="6"
+			break
+		fi
+	else
+		let _delay=_delay-1
+	fi
+done
+disp_header
+
+# Mount backup partition
+/bin/mountx /dev/sda${usb_part} /mnt2 > /dev/null 2>&1
+if [ $? -ne 0 ]; then
+	printf "    ERROR mounting USB partition #%s\n" "${usb_part}"
+	exit_script
+fi
+
+#==========================================================================================
+rm /mnt2/backup.log > /dev/null 2>&1
+log_file="/mnt2/backup.log"
+#log_file="ls/dev/null"
+
+# Check source drive
+if [ -b /dev/mmcblk1 ]; then
+	printf "    \033[33mTwo cards detected, select which one to use for backup\033[37m\n\n"
+	printf "    \033[32m\033[1m0\033[22m EMMC Card\033[37m\n"
+	printf "    \033[32m\033[1m1\033[22m SD Card\033[37m\n\n"
+
+	_delay=30
+	while [ $_delay -gt 0 ]; do
+		printf "    \033[33mSelect the card, default is \033[1mEMMC\033[22m %s\033[37m  \r" "${_delay}"
+		B="X"
+		if read -n 1 -t 1 -s B; then
+			_delay=30
+			if [ "${B}" = "0" ]; then
+				break
+			elif [ "${B}" = "1" ]; then
+				card_no="1"
+				break
+			fi
+		else
+			let _delay=_delay-1
+		fi
+	done
+	disp_header
+fi
+
+# Display backup info
+printf "    \033[32mBackup from "
+
+card_type="SD"
+if [ -b /dev/disk/by-label/sduserdata ] || [ -b /dev/disk/by-label/emuserdata ]; then
+	sd_multi="yes"
+	# shellcheck disable=SC2010
+	tmp_crdtype=`ls -l /dev/disk/by-label | grep mmcblk${card_no}p1 | awk '{print $4}'`
+	[ "${tmp_crdtype}" = "emuserdata" ] && card_type="EMMC"
+	printf "\033[1mMultiBoot\033[22m %s card " "${card_type}"
+else
+	if [ -b /dev/mmcblk1 ] && [ "${card_no}" = "0" ]; then
+		card_type="EMMC"
+	elif [ -b /dev/mmcblk1 ] && [ "${card_no}" = "1" ]; then
+		card_type="SD"
+	else
+		card_type="SD/EMMC"
+	fi
+	printf "\033[1mOriginal Odroid\033[22m %s card " "${card_type}"
+fi
+
+printf " to \033[1mUSB partition #%s\033[22m\033[37m\n\n" "${usb_part}"
+
+
+# Mount partition 2 (Android system or Linux)
+/bin/mountx /dev/mmcblk${card_no}p2 /mnt1 >> ${log_file} 2>&1
+if [ $? -ne 0 ]; then
+	umount /mnt2 > /dev/null 2>&1
+	printf "    ERROR mounting source card\n"
+	exit_script
+fi
+
+# Wait for confirmation
+_delay=30
+while [ $_delay -gt 0 ]; do
+	printf "    \033[33mReady for backup, press \033[1mY\033[22m to continue, \033[1mE\033[22m to exit (%s)  \033[37m\r" "${_delay}"
+	B="X"
+	if read -n 1 -t 1 -s B; then
+		_delay=30
+		if [ "${B}" = "Y" ]; then
+			printf "\r\033[2K"
+			break
+		elif [ "${B}" = "E" ] || [ "${B}" = "e" ]; then
+			_delay=0
+			break
+		fi
+	else
+		let _delay=_delay-1
+	fi
+done
+if [ $_delay -eq 0 ]; then
+	printf "\r\033[2K"
+	exit_script
+fi
+
+# Ckeck if it is Android partition
+if [ -f /mnt1/${ODROID_FSTAB} ]; then
+	backup_android
+else
+	if [ ! "${sd_multi}" = "yes" ]; then
+		# backup single linux card
+		if [ -f /mnt1/etc/fstab ]; then
+			backup_linux ""
+		fi
+	fi
+fi
+
+umount /mnt1 >> ${log_file} 2>&1
+if [ "${sd_multi}" = "yes" ]; then
+	if [ -b /dev/disk/by-label/sdlinux ] || [ -b /dev/disk/by-label/emlinux ]; then
+		printf "\n"
+		# Backup multiboot Linux
+		/bin/mountx /dev/mmcblk${card_no}p7 /mnt1 >> ${log_file} 2>&1
+		if [ $? -ne 0 ]; then
+			printf "    ERROR mounting Linux partition\n"
+			exit_script
+		fi
+		if [ -f /mnt1/etc/fstab ]; then
+			backup_linux ""
+		fi
+	fi
+	umount /mnt1 >> ${log_file} 2>&1
+
+	if [ -b /dev/disk/by-label/sdlinux2 ] || [ -b /dev/disk/by-label/emlinux2 ]; then
+		printf "\n"
+		# Backup multiboot Linux2
+		/bin/mountx /dev/mmcblk${card_no}p8 /mnt1 >> ${log_file} 2>&1
+		if [ $? -eq 0 ]; then
+			if [ -f /mnt1/etc/fstab ]; then
+				backup_linux "2"
+			fi
+		fi
+	fi
+
+	if [ -b /dev/disk/by-label/sdaux ] || [ -b /dev/disk/by-label/emaux ]; then
+		printf "\n"
+		# Backup multiboot OpenElec
+		/bin/mountx /dev/mmcblk${card_no}p6 /mnt1 >> ${log_file} 2>&1
+		if [ $? -eq 0 ]; then
+			backup_oelec
+		fi
+	fi
+fi
+
+umount /mnt1 >> ${log_file} 2>&1
+umount /mnt2 > /dev/null 2>&1
+
+printf "\n    FINISHED.\n"
+exit_script
+
+#=====================================================================================

BIN
C2/initramfs/ramfs/bin/[


BIN
C2/initramfs/ramfs/bin/[[


BIN
C2/initramfs/ramfs/bin/acpid


BIN
C2/initramfs/ramfs/bin/ash


BIN
C2/initramfs/ramfs/bin/awk


BIN
C2/initramfs/ramfs/bin/basename


BIN
C2/initramfs/ramfs/bin/bash


BIN
C2/initramfs/ramfs/bin/blockdev


BIN
C2/initramfs/ramfs/bin/btrfs


BIN
C2/initramfs/ramfs/bin/btrfs-zero-log


BIN
C2/initramfs/ramfs/bin/busybox


BIN
C2/initramfs/ramfs/bin/cat


BIN
C2/initramfs/ramfs/bin/chmod


BIN
C2/initramfs/ramfs/bin/chown


BIN
C2/initramfs/ramfs/bin/chroot


BIN
C2/initramfs/ramfs/bin/chvt


BIN
C2/initramfs/ramfs/bin/clear


BIN
C2/initramfs/ramfs/bin/cmp


BIN
C2/initramfs/ramfs/bin/cp


BIN
C2/initramfs/ramfs/bin/cpio


BIN
C2/initramfs/ramfs/bin/cut


BIN
C2/initramfs/ramfs/bin/date


BIN
C2/initramfs/ramfs/bin/dd


BIN
C2/initramfs/ramfs/bin/deallocvt


BIN
C2/initramfs/ramfs/bin/devmem


BIN
C2/initramfs/ramfs/bin/df


BIN
C2/initramfs/ramfs/bin/dmesg


BIN
C2/initramfs/ramfs/bin/dnsdomainname


BIN
C2/initramfs/ramfs/bin/du


BIN
C2/initramfs/ramfs/bin/dumpkmap


BIN
C2/initramfs/ramfs/bin/dux


BIN
C2/initramfs/ramfs/bin/echo


BIN
C2/initramfs/ramfs/bin/egrep


BIN
C2/initramfs/ramfs/bin/env


BIN
C2/initramfs/ramfs/bin/expr


BIN
C2/initramfs/ramfs/bin/false


BIN
C2/initramfs/ramfs/bin/fbset


BIN
C2/initramfs/ramfs/bin/fdflush


BIN
C2/initramfs/ramfs/bin/fdisk


BIN
C2/initramfs/ramfs/bin/fgrep


BIN
C2/initramfs/ramfs/bin/find


BIN
C2/initramfs/ramfs/bin/fstrim


BIN
C2/initramfs/ramfs/bin/fstype


BIN
C2/initramfs/ramfs/bin/grep


BIN
C2/initramfs/ramfs/bin/gunzip


BIN
C2/initramfs/ramfs/bin/gzip


BIN
C2/initramfs/ramfs/bin/halt


BIN
C2/initramfs/ramfs/bin/hostname


BIN
C2/initramfs/ramfs/bin/hwclock


BIN
C2/initramfs/ramfs/bin/ifconfig


BIN
C2/initramfs/ramfs/bin/img2simg


BIN
C2/initramfs/ramfs/bin/ip


BIN
C2/initramfs/ramfs/bin/ipconfig


BIN
C2/initramfs/ramfs/bin/kbd_mode


BIN
C2/initramfs/ramfs/bin/kill


BIN
C2/initramfs/ramfs/bin/kmod


BIN
C2/initramfs/ramfs/bin/ln


BIN
C2/initramfs/ramfs/bin/loadfont


BIN
C2/initramfs/ramfs/bin/loadkeys


BIN
C2/initramfs/ramfs/bin/loadkmap


BIN
C2/initramfs/ramfs/bin/losetup


BIN
C2/initramfs/ramfs/bin/ls


BIN
C2/initramfs/ramfs/bin/lsx


BIN
C2/initramfs/ramfs/bin/lzop


BIN
C2/initramfs/ramfs/bin/lzopcat


BIN
C2/initramfs/ramfs/bin/make_ext4fs


BIN
C2/initramfs/ramfs/bin/minips


BIN
C2/initramfs/ramfs/bin/mkdir


BIN
C2/initramfs/ramfs/bin/mkfifo


BIN
C2/initramfs/ramfs/bin/mkfs


BIN
C2/initramfs/ramfs/bin/mkfs.btrfs


BIN
C2/initramfs/ramfs/bin/mkfs.ext4


BIN
C2/initramfs/ramfs/bin/mkfs.fat


BIN
C2/initramfs/ramfs/bin/mkfs.vfat


BIN
C2/initramfs/ramfs/bin/mknod


BIN
C2/initramfs/ramfs/bin/mkswap


BIN
C2/initramfs/ramfs/bin/mktemp


BIN
C2/initramfs/ramfs/bin/modinfo


BIN
C2/initramfs/ramfs/bin/more


BIN
C2/initramfs/ramfs/bin/mount


BIN
C2/initramfs/ramfs/bin/mountx


BIN
C2/initramfs/ramfs/bin/mv


BIN
C2/initramfs/ramfs/bin/nano


BIN
C2/initramfs/ramfs/bin/nfsmount


BIN
C2/initramfs/ramfs/bin/ntfs-3g


BIN
C2/initramfs/ramfs/bin/nuke


BIN
C2/initramfs/ramfs/bin/openvt


BIN
C2/initramfs/ramfs/bin/partprobe


BIN
C2/initramfs/ramfs/bin/pidof


BIN
C2/initramfs/ramfs/bin/pivot_root


BIN
C2/initramfs/ramfs/bin/plymouth


BIN
C2/initramfs/ramfs/bin/poweroff


BIN
C2/initramfs/ramfs/bin/printf


BIN
C2/initramfs/ramfs/bin/ps


BIN
C2/initramfs/ramfs/bin/pwd


BIN
C2/initramfs/ramfs/bin/readlink


Some files were not shown because too many files changed in this diff