Ver código fonte

more bug fixes and updates

loboris 9 anos atrás
pai
commit
1b8ab267dc
100 arquivos alterados com 641 adições e 1 exclusões
  1. 0 1
      C2
  2. 25 0
      C2/initramfs/pack
  3. 0 0
      C2/initramfs/ramfs/ODROID_C2
  4. 616 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

+ 0 - 1
C2

@@ -1 +0,0 @@
-/home/LoBo2_Razno/Odroid/Multiboot_install/C2

+ 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


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

@@ -0,0 +1,616 @@
+#!/bin/bash
+
+sd_multi="no"
+card_no="0"
+multiboot_label="sd"
+
+#--------------------------------------------------
+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
+}
+#--------------------------------------------------
+
+#------------------------------------------------------------------------------------------------------------
+# arg1: full path to image file
+# arg2: description
+# arg3: backup type, 'andro' or 'linux'
+# source partition is mounted on /mnt1
+
+make_image() {
+	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, already 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
+	mkdir /mnt2/${BKP_PREFIX}_backup/android/userdir >> ${log_file} 2>&1
+
+	make_image "/mnt2/${BKP_PREFIX}_backup/android/system.raw.img" "Android system" "andro"
+	if [ $? -ne 0 ]; then
+		umount /mnt1 >> ${log_file} 2>&1
+		return 1
+	fi
+
+	umount /mnt1 >> ${log_file} 2>&1
+	# === backup data partition ===
+	if [ "${sd_multi}" = "yes" ]; then
+		/bin/mountx /dev/disk/by-label/${multiboot_label}data /mnt1 >> ${log_file} 2>&1
+	else
+		# Original Odroid android
+		/bin/mountx /dev/mmcblk${card_no}p${ADATA_PART_ORIG} /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 [ $? -ne 0 ]; then
+		umount /mnt1 >> ${log_file} 2>&1
+		return 1
+	fi
+
+	umount /mnt1 >> ${log_file} 2>&1
+	# === backup cache partition ===
+	if [ "${sd_multi}" = "yes" ]; then
+		/bin/mountx /dev/disk/by-label/${multiboot_label}cache /mnt1 >> ${log_file} 2>&1
+	else
+		# Original Odroid android
+		/bin/mountx /dev/mmcblk${card_no}p${ACACHE_PART_ORIG} /mnt1 >> ${log_file} 2>&1
+	fi
+	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
+
+	umount /mnt1 >> ${log_file} 2>&1
+	# === Mount boot card and copy android user data and 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/userdir >> ${log_file} 2>&1
+	rm -rf /mnt2/${BKP_PREFIX}_backup/android/userdir/multiboot/* >> ${log_file} 2>&1
+	rmdir /mnt2/${BKP_PREFIX}_backup/android/userdir/multiboot >> ${log_file} 2>&1
+	rm -f /mnt2/${BKP_PREFIX}_backup/android/userdir/boot.ini >> ${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
+		if [ "${O_BOARD}" = "C2" ]; then
+			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
+		fi
+	else
+		# Original Odroid android, extract kernel/dtp from the card
+		if [ -f /mnt1/${ODROID_IMAGE} ]; then
+			cp /mnt1/${ODROID_IMAGE} /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
+			if [ $? -ne 0 ]; then
+				printf "ERROR: Kernel\n"
+				return 1
+			fi
+		else
+			if [ "${O_BOARD}" = "C2" ]; then
+				dd if=/dev/mmcblk${card_no} of=/mnt2/${BKP_PREFIX}_backup/android/${ODROID_IMAGE} bs=512 skip=1632 count=32768 >> ${log_file} 2>&1
+			else
+				dd if=/dev/mmcblk${card_no} of=/mnt2/${BKP_PREFIX}_backup/android/${ODROID_IMAGE} bs=512 skip=1263 count=16384 >> ${log_file} 2>&1
+			fi
+			if [ $? -ne 0 ]; then
+				printf "ERROR: Kernel\n"
+				return 1
+			fi
+			sync
+		fi
+		if [ -f /mnt1/${ODROID_DTB} ]; then
+			cp /mnt1/${ODROID_DTB} /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
+			if [ $? -ne 0 ]; then
+				printf "ERROR: dtb\n"
+				return 1
+			fi
+		else
+			if [ "${O_BOARD}" = "C2" ]; then
+				dd if=/dev/mmcblk${card_no} of=/mnt2/${BKP_PREFIX}_backup/android/${ODROID_DTB} bs=512 skip=1504 count=128 >> ${log_file} 2>&1
+				if [ $? -ne 0 ]; then
+					printf "ERROR: dtb\n"
+					return 1
+				fi
+				sync
+			fi
+		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, already 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
+			elif [ "${B}" = "s" ]; then
+				# SCREENSHOT ===
+				fbcat > /backup_exit.ppm
+			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 [ "${NUMCARDS}" = "2" ]; then
+	printf "    \033[33mTwo cards detected, select which one to use for backup\033[37m\n\n"
+	printf "    \033[32m\033[1m0\033[22m Boot card (%s)\033[37m\n" "${BOOT_CARDTYPE}"
+	printf "    \033[32m\033[1m1\033[22m Other card (%s)\033[37m\n\n" "${OTHER_CARDTYPE}"
+
+	_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
+				card_no="${BOOT_CARDDEV}"
+				card_type="${BOOT_CARDTYPE}"
+				break
+			elif [ "${B}" = "1" ]; then
+				card_no="${OTHER_CARDDEV}"
+				card_type="${OTHER_CARDTYPE}"
+				break
+			fi
+		else
+			let _delay=_delay-1
+		fi
+	done
+	disp_header
+fi
+
+# === Display backup info ===
+printf "    \033[32mBackup from "
+
+if [ "${card_type}" = "SD" ]; then
+	multiboot_label="sd"
+else
+	multiboot_label="em"
+fi
+
+# === Check if the backup is from multiboot card ===
+# shellcheck disable=SC2010
+tmp_crdtype=`ls -l /dev/disk/by-label | grep mmcblk${card_no}p1 | awk '{print $4}'`
+if [ "${tmp_crdtype}" = "${multiboot_label}userdata" ]; then
+	sd_multi="yes"
+	printf "\033[1mMultiBoot\033[22m %s card " "${card_type}"
+else
+	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 backup 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
+		elif [ "${B}" = "s" ]; then
+			# SCREENSHOT ===
+			fbcat > /backup.ppm
+		fi
+	else
+		let _delay=_delay-1
+	fi
+done
+if [ $_delay -eq 0 ]; then
+	printf "\r\033[2K"
+	umount /mnt2 > /dev/null 2>&1
+	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
+
+# === For multiboot card backup, continue to backup other operating systems ===
+if [ "${sd_multi}" = "yes" ]; then
+	if [ -b /dev/disk/by-label/${multiboot_label}linux ]; then
+		printf "\n"
+		# === Backup multiboot Linux ===
+		/bin/mountx /dev/disk/by-label/${multiboot_label}linux /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/${multiboot_label}linux2 ]; then
+		printf "\n"
+		# === Backup multiboot Linux2 ===
+		/bin/mountx /dev/disk/by-label/${multiboot_label}linux2 /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/${multiboot_label}aux ]; then
+		printf "\n"
+		# === Backup multiboot OpenElec ===
+		/bin/mountx /dev/disk/by-label/${multiboot_label}aux /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


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff