lede/target/linux/amlogic/mesongx/base-files/usr/sbin/install-to-emmc.sh
2024-05-06 05:53:58 +08:00

145 lines
3.6 KiB
Bash
Executable File

#!/bin/sh
# Copy running OpenWrt to eMMC for amlogic
. /lib/functions.sh
. /lib/functions/system.sh
include /lib/upgrade
NEWLINE="
"
function umount_disk() {
local mounted
local to="${1#/dev/}"
umount "/dev/$to"* 2>/dev/null
mounted="`mount | cut -d' ' -f1 | grep -Fm1 "/dev/$to"`"
if [ -n "$mounted" ] ; then
echo "can not umount $mounted" >&2
return 1
fi
return 0
}
function part_disk() {
local to="${1#/dev/}"
dd if=/dev/zero of="/dev/$to" bs=512 count=1 conv=notrunc 2>/dev/null
parted --script "/dev/$to" \
mktable msdos \
mkpart primary 68MiB 132MiB \
mkpart primary 132MiB 388MiB \
mkpart primary 764MiB 2812MiB
}
function get_bootdisk() {
local var=$1
local diskdev
export_bootdevice && export_partdevice diskdev 0 || {
echo "Unable to determine upgrade device" >&2
return 1
}
export "$var=$diskdev"
return 0
}
function get_emmcs() {
local disk index disks
local bootdisk=$1
index=1
for disk in `cd /sys/block && ls | grep '^mmcblk' | grep -Ev 'mmcblk\d+boot\d+'`; do
[[ "$bootdisk" = "$disk" ]] && continue
[ -b /dev/$disk ] && [ "`cat /sys/block/$disk/size`" -gt 0 ] || continue
local diskinfo="`parted -ms "/dev/$disk" unit GiB print 2>/dev/null | grep -m1 "^/dev/$disk:"`"
[ -z "$diskinfo" ] && continue
local size="`echo "$diskinfo" | cut -d: -f2`"
# check disk greater than 2.8GB
[ $(( `echo "${size%%GiB}" | sed 's/\.\(.\).*/ * 10 + \1/'` )) -ge 28 ] || continue
local model="`echo "$diskinfo" | cut -d: -f7 | sed 's/"/_/g'`"
disks="${disks}$index. $disk $size \"$model\"$NEWLINE"
index=$(($index + 1))
done
echo "$disks"
return 0
}
function get_emmc() {
local index
local var=$2
local emmcs="$(get_emmcs $1)"
[ -z "$emmcs" ] && {
echo "Get eMMC list failed! (Maybe already running on eMMC? Current boot disk is $1)" >&2
return 1
}
local count=$(echo "$emmcs" | wc -l)
if [ "$count" -gt 1 ]; then
while true; do
echo "Found these eMMC devices:"
echo "Index. device size model"
echo "$emmcs"
echo -n "Select a disk to install (input index then press Enter): "
read index || {
echo "No input!" >&2
exit 1
}
if [ -z "$index" ]; then
echo "Empty input!"
else
echo "$emmcs" | grep -q "^${index}. " && break
echo "Wrong index!"
fi
done
else
echo "Found eMMC device:"
echo "Index. device size model"
echo "$emmcs"
index=1
fi
local value=$(echo "$emmcs" | grep "^${index}. " | cut -d' ' -f 2)
export "$var=$value"
}
function main() {
local bootdisk yn partdev part partdevto to
get_bootdisk bootdisk
[ -z "$bootdisk" ] && return 1
get_emmc $bootdisk to
[ -n "$to" ] || return 1
echo -ne "Will install to $to, confirm? y/N [n]\b\b"
read yn
if [ "$yn" = Y -o "$yn" = y ]; then
echo ""
echo "umount /dev/$to*"
umount_disk "$to" || return 1
echo "part /dev/$to"
part_disk "$to" || return 1
partprobe "/dev/$to"
if export_partdevice partdev 1; then
# umount /boot
echo "try umount /boot"
/bin/mount -o noatime,remount,ro /dev/$partdev
/usr/bin/umount -R -d -l /dev/$partdev 2>/dev/null || /bin/umount -l /dev/$partdev
fi
sleep 1
echo "copy rom data from /dev/$bootdisk to /dev/$to"
for part in 1 2; do
# copy boot and rootfs partitions
export_partdevice partdev $part
partdevto=${to}p$part
echo "copy /dev/$partdev to /dev/$partdevto"
dd if=/dev/$partdev of=/dev/$partdevto bs=1M conv=notrunc
done
# mark RESET overlay partition
partdevto=${to}p3
echo "mark /dev/$partdevto as RESET"
echo "RESET000" | dd of="/dev/$partdevto" bs=512 count=1 conv=sync,fsync
echo "All Done!"
else
echo "Bye!"
fi
}
echo "Copy running OpenWrt to eMMC for amlogic"
echo ""
main