aboutsummaryrefslogtreecommitdiff
path: root/rc.shutdown
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2011-08-02 22:11:23 +0200
committerTom Gundersen <teg@jklm.no>2011-08-02 22:11:23 +0200
commit1fa7b4b453e96533ae1db3630031285e5fc302b3 (patch)
tree72dc7805462ca9f2061bad2bc66f11e15fe7872a /rc.shutdown
parent880e68141f27ea3295509bc51fee5179cdfa7695 (diff)
parentb7432d25cba680c785269509245f394dfa6b9dd0 (diff)
downloadinitscripts-1fa7b4b453e96533ae1db3630031285e5fc302b3.tar.xz
Merge branch 'pivot-shutdown'
Diffstat (limited to 'rc.shutdown')
-rwxr-xr-xrc.shutdown51
1 files changed, 39 insertions, 12 deletions
diff --git a/rc.shutdown b/rc.shutdown
index ebfc22c..72f2edd 100755
--- a/rc.shutdown
+++ b/rc.shutdown
@@ -78,21 +78,48 @@ fi
[[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) && -d /sys/block ]] &&
status "Deactivating LVM2 groups" vgchange --sysinit -a n &>/dev/null
-status "Remounting Root Filesystem Read-only" \
+if [[ -x /run/initramfs/shutdown ]]; then
+ # make /run/initrafs a mount
+ mount --bind /run/initramfs /run/initramfs
+
+ # in case someone has shared our mountpoints, unshare them
+ mount --make-private /run/initramfs
+ mount --make-private /
+
+ # bind all api mounts
+ mkdir -p /run/initramfs/{sys,proc,dev,run,oldroot}
+ mount --bind /sys /run/initramfs/sys
+ mount --bind /proc /run/initramfs/proc
+ mount --bind /dev /run/initramfs/dev
+ mount --bind /run /run/initramfs/run
+
+ # enter shutdownramfs
+ cd /run/initramfs
+ pivot_root . oldroot
+
+ #reexec init
+ cp /oldroot/sbin/init /sbin
+ /oldroot/sbin/init u
+
+ # run /shutdown in the new root
+ exec chroot . /shutdown </dev/console >/dev/console 2>&1
+else
+ status "Remounting Root Filesystem Read-only" \
mount -n -o remount,ro /
-run_hook shutdown_poweroff
+ run_hook shutdown_poweroff
-# Power off or reboot
-printsep
-if [[ $RUNLEVEL = 0 ]]; then
- printhl "${C_H2}POWER OFF"
- poweroff -d -f -h -i
-else
- printhl "${C_H2}REBOOTING"
- # if kexec is installed and a kernel is loaded, use it
- [[ -x $(type -P kexec) ]] && kexec -e &>/dev/null
- reboot -d -f -i
+ # Power off or reboot
+ printsep
+ if [[ $RUNLEVEL = 0 ]]; then
+ printhl "${C_H2}POWER OFF"
+ poweroff -d -f -h -i
+ else
+ printhl "${C_H2}REBOOTING"
+ # if kexec is installed and a kernel is loaded, use it
+ [[ -x $(type -P kexec) ]] && kexec -e &>/dev/null
+ reboot -d -f -i
+ fi
fi
# End of file