#!/bin/bash # # /etc/rc.shutdown # . /etc/rc.conf . /etc/rc.d/functions # don't let all the systemd tools be too verbose export SYSTEMD_LOG_LEVEL="notice" # avoid staircase effect stty onlcr echo " " printhl "Initiating shutdown..." echo " " run_hook shutdown_start [[ -x /etc/rc.local.shutdown ]] && /etc/rc.local.shutdown stop_all_daemons status 'Saving random seed' /usr/lib/systemd/systemd-random-seed save [[ $TIMEZONE ]] && status "Configuring time zone" set_timezone "$TIMEZONE" # Write to wtmp file before unmounting halt -w # stop monitoring of LVM2 groups before unmounting filesystems [[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) ]] && status "Deactivating monitoring of LVM2 groups" vgchange --monitor n # any future uevents can and should be ignored status "Shutting down udev" udevadm control --exit run_hook shutdown_prekillall kill_all run_hook shutdown_postkillall run_hook shutdown_preumount # unmount any non-API partitions that are backed by swap; we don't want to # move their contents into memory (waste of time and might caues OOM). status "Unmounting swap-backed filesystems" umount_all "tmpfs" # almost everything is dead now, so the swap should hopefully be relatively # empty, and quick to switch off status "Deactivating swap" swapoff -a status "Unmounting non-API filesystems" umount_all run_hook shutdown_postumount # Kill non-root encrypted partition mappings if [[ -f /etc/crypttab ]] && type -p cryptsetup >/dev/null; then # Maybe someone has LVM on an encrypted block device # executing an extra vgchange is errorless [[ $USELVM = [Yy][Ee][Ss] ]] && vgchange --sysinit -a n &>/dev/null read_crypttab do_lock fi [[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) ]] && status "Deactivating LVM2 groups" vgchange --sysinit -a n &>/dev/null run_hook shutdown_poweroff if [[ -x /run/initramfs/shutdown ]]; then # decide what we want to do if [[ $RUNLEVEL = 0 ]]; then action="poweroff" else { read kexec_loaded /dev/null if (( kexec_loaded )); then action="kexec" else action="reboot" fi fi # make /run/initramfs 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 /oldroot/usr/bin/init u # run /shutdown in the new root exec chroot . /shutdown $action /dev/console 2>&1 else status "Remounting root filesystem read-only" \ mount -o remount,ro / # 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 # vim: set ts=2 sw=2 noet: