W dniu 24.04.2019 o 21:14, Klaus Kudielka pisze: > Recently, upgrade device autodetection has been added to the mvebu target. > This exposes some shortcomings of the generic export_bootdevice function, > e.g. on the Turris Omnia: export_bootdevice silently reports the root > partition to be the boot device. This makes the sysupgrade process > fail at several places. > > Fix this by clearly distinguishing between /proc/cmdline arguments which > specify the boot disk, and those which specify the root partition. Only > in the latter case, strip off the partition, and do it consistently. > Include /dev/mmcblk* and /dev/sd* as potential arguments to "root=". > > Remove workarounds for the old, inconsistent behaviour from the following > targets: apm821xx, brcm2708, omap, sunxi. > > Fixes: 4e8345ff68 ("mvebu: base-files: autodetect upgrade device") > > Signed-off-by: Klaus Kudielka <klaus.kudie...@gmail.com>
Acked-by: Tomasz Maciej Nowak <tome...@o2.pl> Thanks. > --- > .../base-files/files/lib/upgrade/common.sh | 27 +++++++++++++------ > .../apm821xx/base-files/lib/upgrade/wdbook.sh | 11 +++----- > .../base-files/lib/upgrade/platform.sh | 11 +++----- > .../base-files/lib/preinit/79_move_config | 2 +- > .../omap/base-files/lib/upgrade/platform.sh | 7 +++-- > .../base-files/lib/preinit/79_move_config | 2 +- > .../sunxi/base-files/lib/upgrade/platform.sh | 7 +++-- > 7 files changed, 33 insertions(+), 34 deletions(-) > > diff --git a/package/base-files/files/lib/upgrade/common.sh > b/package/base-files/files/lib/upgrade/common.sh > index b3a29fb32e..d906023dab 100644 > --- a/package/base-files/files/lib/upgrade/common.sh > +++ b/package/base-files/files/lib/upgrade/common.sh > @@ -101,24 +101,30 @@ get_magic_long() { > } > > export_bootdevice() { > - local cmdline uuid disk uevent line > + local cmdline bootdisk rootpart uuid disk uevent line > local MAJOR MINOR DEVNAME DEVTYPE > > if read cmdline < /proc/cmdline; then > case "$cmdline" in > *block2mtd=*) > - disk="${cmdline##*block2mtd=}" > - disk="${disk%%,*}" > + bootdisk="${cmdline##*block2mtd=}" > + bootdisk="${bootdisk%%,*}" > ;; > *root=*) > - disk="${cmdline##*root=}" > - disk="${disk%% *}" > + rootpart="${cmdline##*root=}" > + rootpart="${rootpart%% *}" > ;; > esac > > - case "$disk" in > + case "$bootdisk" in > + /dev/*) > + uevent="/sys/class/block/${bootdisk##*/}/uevent" > + ;; > + esac > + > + case "$rootpart" in > > PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02) > - uuid="${disk#PARTUUID=}" > + uuid="${rootpart#PARTUUID=}" > uuid="${uuid%-02}" > for disk in $(find /dev -type b); do > set -- $(dd if=$disk bs=1 skip=440 > count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "') > @@ -128,7 +134,12 @@ export_bootdevice() { > fi > done > ;; > - /dev/*) > + /dev/mmcblk[0-9]p2) > + disk="${rootpart%p2}" > + uevent="/sys/class/block/${disk##*/}/uevent" > + ;; > + /dev/sd[a-z]2) > + disk="${rootpart%2}" > uevent="/sys/class/block/${disk##*/}/uevent" > ;; > esac > diff --git a/target/linux/apm821xx/base-files/lib/upgrade/wdbook.sh > b/target/linux/apm821xx/base-files/lib/upgrade/wdbook.sh > index 2287e0619d..c191271149 100644 > --- a/target/linux/apm821xx/base-files/lib/upgrade/wdbook.sh > +++ b/target/linux/apm821xx/base-files/lib/upgrade/wdbook.sh > @@ -7,7 +7,7 @@ mbl_do_platform_check() { > > [ "$#" -gt 1 ] && return 1 > > - export_bootdevice && export_partdevice diskdev -2 || { > + export_bootdevice && export_partdevice diskdev 0 || { > echo "Unable to determine upgrade device" > return 1 > } > @@ -36,7 +36,7 @@ mbl_do_platform_check() { > mbl_do_upgrade() { > local diskdev partdev diff > > - export_bootdevice && export_partdevice diskdev -2 || { > + export_bootdevice && export_partdevice diskdev 0 || { > echo "Unable to determine upgrade device" > return 1 > } > @@ -70,10 +70,6 @@ mbl_do_upgrade() { > > #iterate over each partition from the image and write it to the boot > disk > while read part start size; do > - # root is /dev/sd[a|b]2 and not /dev/sd[a|b] this causes some > problem > - # one of which is this offset, I'm not sure what's the best > fix, so > - # here's a WA. > - let part=$((part - 2)) > if export_partdevice partdev $part; then > echo "Writing image to /dev/$partdev..." > get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M > skip="$start" count="$size" conv=fsync > @@ -90,8 +86,7 @@ mbl_do_upgrade() { > mbl_copy_config() { > local partdev > > - # Same as above /dev/sd[a|b]2 is root, so /boot is -1 > - if export_partdevice partdev -1; then > + if export_partdevice partdev 1; then > mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt > cp -af "$CONF_TAR" /mnt/ > umount /mnt > diff --git a/target/linux/brcm2708/base-files/lib/upgrade/platform.sh > b/target/linux/brcm2708/base-files/lib/upgrade/platform.sh > index 62eede53d3..37e479272b 100644 > --- a/target/linux/brcm2708/base-files/lib/upgrade/platform.sh > +++ b/target/linux/brcm2708/base-files/lib/upgrade/platform.sh > @@ -9,7 +9,7 @@ platform_check_image() { > > [ "$#" -gt 1 ] && return 1 > > - export_bootdevice && export_partdevice diskdev -2 || { > + export_bootdevice && export_partdevice diskdev 0 || { > echo "Unable to determine upgrade device" > return 1 > } > @@ -38,7 +38,7 @@ platform_check_image() { > platform_do_upgrade() { > local diskdev partdev diff > > - export_bootdevice && export_partdevice diskdev -2 || { > + export_bootdevice && export_partdevice diskdev 0 || { > echo "Unable to determine upgrade device" > return 1 > } > @@ -72,10 +72,6 @@ platform_do_upgrade() { > > #iterate over each partition from the image and write it to the boot > disk > while read part start size; do > - # root is /dev/sd[a|b]2 and not /dev/sd[a|b] this causes some > problem > - # one of which is this offset, I'm not sure what's the best > fix, so > - # here's a WA. > - let part=$((part - 2)) > if export_partdevice partdev $part; then > echo "Writing image to /dev/$partdev..." > get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M > skip="$start" count="$size" conv=fsync > @@ -92,8 +88,7 @@ platform_do_upgrade() { > platform_copy_config() { > local partdev > > - # Same as above /dev/sd[a|b]2 is root, so /boot is -1 > - if export_partdevice partdev -1; then > + if export_partdevice partdev 1; then > mkdir -p /boot > [ -f /boot/kernel.img ] || mount -t vfat -o rw,noatime > "/dev/$partdev" /boot > cp -af "$CONF_TAR" /boot/ > diff --git a/target/linux/omap/base-files/lib/preinit/79_move_config > b/target/linux/omap/base-files/lib/preinit/79_move_config > index c112588689..83171b3ba9 100644 > --- a/target/linux/omap/base-files/lib/preinit/79_move_config > +++ b/target/linux/omap/base-files/lib/preinit/79_move_config > @@ -6,7 +6,7 @@ move_config() { > > . /lib/upgrade/common.sh > > - if export_bootdevice && export_partdevice partdev -1; then > + if export_bootdevice && export_partdevice partdev 1; then > if mount -t vfat -o rw,noatime "/dev/$partdev" /mnt; then > if [ -f /mnt/sysupgrade.tgz ]; then > mv -f /mnt/sysupgrade.tgz / > diff --git a/target/linux/omap/base-files/lib/upgrade/platform.sh > b/target/linux/omap/base-files/lib/upgrade/platform.sh > index 88ef4790e9..abe910b154 100644 > --- a/target/linux/omap/base-files/lib/upgrade/platform.sh > +++ b/target/linux/omap/base-files/lib/upgrade/platform.sh > @@ -1,7 +1,7 @@ > platform_check_image() { > local diskdev partdev diff > > - export_bootdevice && export_partdevice diskdev -2 || { > + export_bootdevice && export_partdevice diskdev 0 || { > echo "Unable to determine upgrade device" > return 1 > } > @@ -28,7 +28,7 @@ platform_check_image() { > platform_copy_config() { > local partdev > > - if export_partdevice partdev -1; then > + if export_partdevice partdev 1; then > mount -t vfat -o rw,noatime "/dev/$partdev" /mnt > cp -af "$CONF_TAR" /mnt/ > umount /mnt > @@ -38,7 +38,7 @@ platform_copy_config() { > platform_do_upgrade() { > local diskdev partdev diff > > - export_bootdevice && export_partdevice diskdev -2 || { > + export_bootdevice && export_partdevice diskdev 0 || { > echo "Unable to determine upgrade device" > return 1 > } > @@ -74,7 +74,6 @@ platform_do_upgrade() { > get_image "$@" | dd of="$diskdev" bs=1024 skip=8 seek=8 count=1016 > conv=fsync > #iterate over each partition from the image and write it to the boot > disk > while read part start size; do > - part="$(($part - 2))" > if export_partdevice partdev $part; then > echo "Writing image to /dev/$partdev..." > get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M > skip="$start" count="$size" conv=fsync > diff --git a/target/linux/sunxi/base-files/lib/preinit/79_move_config > b/target/linux/sunxi/base-files/lib/preinit/79_move_config > index c112588689..83171b3ba9 100644 > --- a/target/linux/sunxi/base-files/lib/preinit/79_move_config > +++ b/target/linux/sunxi/base-files/lib/preinit/79_move_config > @@ -6,7 +6,7 @@ move_config() { > > . /lib/upgrade/common.sh > > - if export_bootdevice && export_partdevice partdev -1; then > + if export_bootdevice && export_partdevice partdev 1; then > if mount -t vfat -o rw,noatime "/dev/$partdev" /mnt; then > if [ -f /mnt/sysupgrade.tgz ]; then > mv -f /mnt/sysupgrade.tgz / > diff --git a/target/linux/sunxi/base-files/lib/upgrade/platform.sh > b/target/linux/sunxi/base-files/lib/upgrade/platform.sh > index 88ef4790e9..abe910b154 100644 > --- a/target/linux/sunxi/base-files/lib/upgrade/platform.sh > +++ b/target/linux/sunxi/base-files/lib/upgrade/platform.sh > @@ -1,7 +1,7 @@ > platform_check_image() { > local diskdev partdev diff > > - export_bootdevice && export_partdevice diskdev -2 || { > + export_bootdevice && export_partdevice diskdev 0 || { > echo "Unable to determine upgrade device" > return 1 > } > @@ -28,7 +28,7 @@ platform_check_image() { > platform_copy_config() { > local partdev > > - if export_partdevice partdev -1; then > + if export_partdevice partdev 1; then > mount -t vfat -o rw,noatime "/dev/$partdev" /mnt > cp -af "$CONF_TAR" /mnt/ > umount /mnt > @@ -38,7 +38,7 @@ platform_copy_config() { > platform_do_upgrade() { > local diskdev partdev diff > > - export_bootdevice && export_partdevice diskdev -2 || { > + export_bootdevice && export_partdevice diskdev 0 || { > echo "Unable to determine upgrade device" > return 1 > } > @@ -74,7 +74,6 @@ platform_do_upgrade() { > get_image "$@" | dd of="$diskdev" bs=1024 skip=8 seek=8 count=1016 > conv=fsync > #iterate over each partition from the image and write it to the boot > disk > while read part start size; do > - part="$(($part - 2))" > if export_partdevice partdev $part; then > echo "Writing image to /dev/$partdev..." > get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M > skip="$start" count="$size" conv=fsync > -- TMN _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel