base-files: sysupgrade cleanup
authorMatthias Schiffer <mschiffer@universe-factory.net>
Sun, 23 Apr 2017 21:33:14 +0000 (23:33 +0200)
committerMatthias Schiffer <mschiffer@universe-factory.net>
Mon, 29 May 2017 21:50:33 +0000 (23:50 +0200)
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>
package/base-files/files/lib/upgrade/common.sh
package/base-files/files/lib/upgrade/stage2
package/base-files/files/sbin/sysupgrade

index 17248c2..fc59bf2 100644 (file)
@@ -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
index 4e2aa3a..cc8047d 100755 (executable)
@@ -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"
index 2d67371..200a0e5 100755 (executable)
@@ -1,7 +1,5 @@
 #!/bin/sh
 
-[ "$1" = "nand" ] && exec /lib/upgrade/stage2 "$2" "$3"
-
 . /lib/functions.sh
 . /lib/functions/system.sh