52d28c1140
The staged sysupgrade allows to properly unmount the rootfs before writing the new partitions. This will fix upgrades losing configuration when parition sizes change on x86 and similar image types.
259 lines
7.6 KiB
Diff
259 lines
7.6 KiB
Diff
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
|
Date: Sun, 23 Apr 2017 23:33:14 +0200
|
|
Subject: base-files: sysupgrade cleanup
|
|
|
|
Some functions only used by stage2 are moved there from common.sh.
|
|
|
|
One piece that could still use more cleanup is platform_pre_upgrade: many
|
|
targets reference files from there are aren't available in the ramfs, so
|
|
we need to evaluate it before the switch; conversely, flash writes happen
|
|
in that function on some targets. Targets that do the latter should be
|
|
fixed eventually to use platform_do_upgrade for that purpose.
|
|
|
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
|
|
|
diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh
|
|
index 17248c2b1decd6f92558fb89601238b55fd0f0d6..fc59bf2323498d332159b00eb7ab443bfe6b147e 100644
|
|
--- a/package/base-files/files/lib/upgrade/common.sh
|
|
+++ b/package/base-files/files/lib/upgrade/common.sh
|
|
@@ -30,106 +30,6 @@ install_bin() { # <file> [ <symlink> ... ]
|
|
}; done
|
|
}
|
|
|
|
-supivot() { # <new_root> <old_root>
|
|
- /bin/mount | grep "on $1 type" 2>&- 1>&- || /bin/mount -o bind $1 $1
|
|
- mkdir -p $1$2 $1/proc $1/sys $1/dev $1/tmp $1/overlay && \
|
|
- /bin/mount -o noatime,move /proc $1/proc && \
|
|
- pivot_root $1 $1$2 || {
|
|
- /bin/umount -l $1 $1
|
|
- return 1
|
|
- }
|
|
-
|
|
- /bin/mount -o noatime,move $2/sys /sys
|
|
- /bin/mount -o noatime,move $2/dev /dev
|
|
- /bin/mount -o noatime,move $2/tmp /tmp
|
|
- /bin/mount -o noatime,move $2/overlay /overlay 2>&-
|
|
- return 0
|
|
-}
|
|
-
|
|
-run_ramfs() { # <command> [...]
|
|
- install_bin /bin/busybox /bin/ash /bin/sh /bin/mount /bin/umount \
|
|
- /sbin/pivot_root /sbin/reboot /bin/sync /bin/dd /bin/grep \
|
|
- /bin/cp /bin/mv /bin/tar /usr/bin/md5sum "/usr/bin/[" /bin/dd \
|
|
- /bin/vi /bin/ls /bin/cat /usr/bin/awk /usr/bin/hexdump \
|
|
- /bin/sleep /bin/zcat /usr/bin/bzcat /usr/bin/printf /usr/bin/wc \
|
|
- /bin/cut /usr/bin/printf /bin/sync /bin/mkdir /bin/rmdir \
|
|
- /bin/rm /usr/bin/basename /bin/kill /bin/chmod /usr/bin/find \
|
|
- /bin/mknod
|
|
-
|
|
- install_bin /sbin/mtd
|
|
- install_bin /sbin/mount_root
|
|
- install_bin /sbin/snapshot
|
|
- install_bin /sbin/snapshot_tool
|
|
- install_bin /usr/sbin/ubiupdatevol
|
|
- install_bin /usr/sbin/ubiattach
|
|
- install_bin /usr/sbin/ubiblock
|
|
- install_bin /usr/sbin/ubiformat
|
|
- install_bin /usr/sbin/ubidetach
|
|
- install_bin /usr/sbin/ubirsvol
|
|
- install_bin /usr/sbin/ubirmvol
|
|
- install_bin /usr/sbin/ubimkvol
|
|
- install_bin /usr/sbin/partx
|
|
- install_bin /usr/sbin/losetup
|
|
- install_bin /usr/sbin/mkfs.ext4
|
|
- for file in $RAMFS_COPY_BIN; do
|
|
- install_bin ${file//:/ }
|
|
- done
|
|
- install_file /etc/resolv.conf /lib/*.sh /lib/functions/*.sh /lib/upgrade/*.sh $RAMFS_COPY_DATA
|
|
-
|
|
- [ -L "/lib64" ] && ln -s /lib $RAM_ROOT/lib64
|
|
-
|
|
- supivot $RAM_ROOT /mnt || {
|
|
- echo "Failed to switch over to ramfs. Please reboot."
|
|
- exit 1
|
|
- }
|
|
-
|
|
- /bin/mount -o remount,ro /mnt
|
|
- /bin/umount -l /mnt
|
|
-
|
|
- grep /overlay /proc/mounts > /dev/null && {
|
|
- /bin/mount -o noatime,remount,ro /overlay
|
|
- /bin/umount -l /overlay
|
|
- }
|
|
-
|
|
- # spawn a new shell from ramdisk to reduce the probability of cache issues
|
|
- exec /bin/busybox ash -c "$*"
|
|
-}
|
|
-
|
|
-kill_remaining() { # [ <signal> [ <loop> ] ]
|
|
- local sig="${1:-TERM}"
|
|
- local loop="${2:-0}"
|
|
- local run=true
|
|
- local stat
|
|
-
|
|
- echo -n "Sending $sig to remaining processes ... "
|
|
-
|
|
- while $run; do
|
|
- run=false
|
|
- for stat in /proc/[0-9]*/stat; do
|
|
- [ -f "$stat" ] || continue
|
|
-
|
|
- local pid name state ppid rest
|
|
- read pid name state ppid rest < $stat
|
|
- name="${name#(}"; name="${name%)}"
|
|
-
|
|
- # Skip PID1, ourself and our children
|
|
- [ $pid -ne 1 -a $pid -ne $$ -a $ppid -ne $$ ] || continue
|
|
-
|
|
- local cmdline
|
|
- read cmdline < /proc/$pid/cmdline
|
|
-
|
|
- # Skip kernel threads
|
|
- [ -n "$cmdline" ] || continue
|
|
-
|
|
- echo -n "$name "
|
|
- kill -$sig $pid 2>/dev/null
|
|
-
|
|
- [ $loop -eq 1 ] && run=true
|
|
- done
|
|
- done
|
|
- echo ""
|
|
-}
|
|
-
|
|
run_hooks() {
|
|
local arg="$1"; shift
|
|
for func in "$@"; do
|
|
diff --git a/package/base-files/files/lib/upgrade/stage2 b/package/base-files/files/lib/upgrade/stage2
|
|
index 4e2aa3a23c3bab07a795762a30a4d4f701081934..cc8047d988e39ca9ba27d2588744aad469d1d978 100755
|
|
--- a/package/base-files/files/lib/upgrade/stage2
|
|
+++ b/package/base-files/files/lib/upgrade/stage2
|
|
@@ -24,6 +24,104 @@ export CONF_TAR=/tmp/sysupgrade.tgz
|
|
include /lib/upgrade
|
|
|
|
|
|
+supivot() { # <new_root> <old_root>
|
|
+ /bin/mount | grep "on $1 type" 2>&- 1>&- || /bin/mount -o bind $1 $1
|
|
+ mkdir -p $1$2 $1/proc $1/sys $1/dev $1/tmp $1/overlay && \
|
|
+ /bin/mount -o noatime,move /proc $1/proc && \
|
|
+ pivot_root $1 $1$2 || {
|
|
+ /bin/umount -l $1 $1
|
|
+ return 1
|
|
+ }
|
|
+
|
|
+ /bin/mount -o noatime,move $2/sys /sys
|
|
+ /bin/mount -o noatime,move $2/dev /dev
|
|
+ /bin/mount -o noatime,move $2/tmp /tmp
|
|
+ /bin/mount -o noatime,move $2/overlay /overlay 2>&-
|
|
+ return 0
|
|
+}
|
|
+
|
|
+switch_to_ramfs() {
|
|
+ install_bin /bin/busybox /bin/ash /bin/sh /bin/mount /bin/umount \
|
|
+ /sbin/pivot_root /sbin/reboot /bin/sync /bin/dd /bin/grep \
|
|
+ /bin/cp /bin/mv /bin/tar /usr/bin/md5sum "/usr/bin/[" /bin/dd \
|
|
+ /bin/vi /bin/ls /bin/cat /usr/bin/awk /usr/bin/hexdump \
|
|
+ /bin/sleep /bin/zcat /usr/bin/bzcat /usr/bin/printf /usr/bin/wc \
|
|
+ /bin/cut /usr/bin/printf /bin/sync /bin/mkdir /bin/rmdir \
|
|
+ /bin/rm /usr/bin/basename /bin/kill /bin/chmod /usr/bin/find \
|
|
+ /bin/mknod
|
|
+
|
|
+ install_bin /sbin/mtd
|
|
+ install_bin /sbin/mount_root
|
|
+ install_bin /sbin/snapshot
|
|
+ install_bin /sbin/snapshot_tool
|
|
+ install_bin /usr/sbin/ubiupdatevol
|
|
+ install_bin /usr/sbin/ubiattach
|
|
+ install_bin /usr/sbin/ubiblock
|
|
+ install_bin /usr/sbin/ubiformat
|
|
+ install_bin /usr/sbin/ubidetach
|
|
+ install_bin /usr/sbin/ubirsvol
|
|
+ install_bin /usr/sbin/ubirmvol
|
|
+ install_bin /usr/sbin/ubimkvol
|
|
+ install_bin /usr/sbin/partx
|
|
+ install_bin /usr/sbin/losetup
|
|
+ install_bin /usr/sbin/mkfs.ext4
|
|
+ for file in $RAMFS_COPY_BIN; do
|
|
+ install_bin ${file//:/ }
|
|
+ done
|
|
+ install_file /etc/resolv.conf /lib/*.sh /lib/functions/*.sh /lib/upgrade/*.sh $RAMFS_COPY_DATA
|
|
+
|
|
+ [ -L "/lib64" ] && ln -s /lib $RAM_ROOT/lib64
|
|
+
|
|
+ supivot $RAM_ROOT /mnt || {
|
|
+ echo "Failed to switch over to ramfs. Please reboot."
|
|
+ exit 1
|
|
+ }
|
|
+
|
|
+ /bin/mount -o remount,ro /mnt
|
|
+ /bin/umount -l /mnt
|
|
+
|
|
+ grep /overlay /proc/mounts > /dev/null && {
|
|
+ /bin/mount -o noatime,remount,ro /overlay
|
|
+ /bin/umount -l /overlay
|
|
+ }
|
|
+}
|
|
+
|
|
+kill_remaining() { # [ <signal> [ <loop> ] ]
|
|
+ local sig="${1:-TERM}"
|
|
+ local loop="${2:-0}"
|
|
+ local run=true
|
|
+ local stat
|
|
+
|
|
+ echo -n "Sending $sig to remaining processes ... "
|
|
+
|
|
+ while $run; do
|
|
+ run=false
|
|
+ for stat in /proc/[0-9]*/stat; do
|
|
+ [ -f "$stat" ] || continue
|
|
+
|
|
+ local pid name state ppid rest
|
|
+ read pid name state ppid rest < $stat
|
|
+ name="${name#(}"; name="${name%)}"
|
|
+
|
|
+ # Skip PID1, ourself and our children
|
|
+ [ $pid -ne 1 -a $pid -ne $$ -a $ppid -ne $$ ] || continue
|
|
+
|
|
+ local cmdline
|
|
+ read cmdline < /proc/$pid/cmdline
|
|
+
|
|
+ # Skip kernel threads
|
|
+ [ -n "$cmdline" ] || continue
|
|
+
|
|
+ echo -n "$name "
|
|
+ kill -$sig $pid 2>/dev/null
|
|
+
|
|
+ [ $loop -eq 1 ] && run=true
|
|
+ done
|
|
+ done
|
|
+ echo ""
|
|
+}
|
|
+
|
|
+
|
|
killall -9 telnetd
|
|
killall -9 dropbear
|
|
killall -9 ash
|
|
@@ -44,7 +142,8 @@ fi
|
|
|
|
if [ -n "$(rootfs_type)" ]; then
|
|
echo "Switching to ramdisk..."
|
|
- run_ramfs "$COMMAND"
|
|
-else
|
|
- exec /bin/busybox ash -c "$COMMAND"
|
|
+ switch_to_ramfs
|
|
fi
|
|
+
|
|
+# Exec new shell from ramfs
|
|
+exec /bin/busybox ash -c "$COMMAND"
|
|
diff --git a/package/base-files/files/sbin/sysupgrade b/package/base-files/files/sbin/sysupgrade
|
|
index 2d67371ef74b4b970076a069e97f4fd6a1e0bc95..200a0e520b5df8bcc208f4d8fd731756e94294fb 100755
|
|
--- a/package/base-files/files/sbin/sysupgrade
|
|
+++ b/package/base-files/files/sbin/sysupgrade
|
|
@@ -1,7 +1,5 @@
|
|
#!/bin/sh
|
|
|
|
-[ "$1" = "nand" ] && exec /lib/upgrade/stage2 "$2" "$3"
|
|
-
|
|
. /lib/functions.sh
|
|
. /lib/functions/system.sh
|
|
|