diff options
Diffstat (limited to 'source/ap/lxc/scripts/rc.6.lxc')
-rw-r--r-- | source/ap/lxc/scripts/rc.6.lxc | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/source/ap/lxc/scripts/rc.6.lxc b/source/ap/lxc/scripts/rc.6.lxc new file mode 100644 index 000000000..5dde949a8 --- /dev/null +++ b/source/ap/lxc/scripts/rc.6.lxc @@ -0,0 +1,316 @@ +#! /bin/sh +# +# rc.6 This file is executed by init when it goes into runlevel +# 0 (halt) or runlevel 6 (reboot). It kills all processes, +# unmounts file systems and then either halts or reboots. +# +# Version: @(#)/etc/rc.d/rc.6 2.47 Sat Jan 13 13:37:26 PST 2001 +# +# Author: Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org> +# Modified by: Patrick J. Volkerding, <volkerdi@slackware.com> +# + +# Set the path. +PATH=/sbin:/etc:/bin:/usr/bin + +# Set $container variable since this is a modified version of rc.6 with +# changes for running in an lxc container. A check to see if this variable +# is set will be used to skip parts of the script that we don't want to run +# in a container. Thanks to Matteo Bernardini <ponce@slackbuilds.org> and +# Chris Willing for the initial work making this script lxc compatible. +container="lxc" + +# If there are SystemV init scripts for this runlevel, run them. +if [ -x /etc/rc.d/rc.sysvinit ]; then + . /etc/rc.d/rc.sysvinit +fi + +# Set linefeed mode to avoid staircase effect. +/bin/stty onlcr + +echo "Running shutdown script $0:" + +# Find out how we were called. +case "$0" in + *0) + shutdown_command="halt" + ;; + *6) + shutdown_command=reboot + ;; + *) + echo "$0: call me as \"rc.0\" or \"rc.6\" please!" + exit 1 + ;; +esac + +# Save the system time to the hardware clock using hwclock --systohc. +# This will also create or update the timestamps in /etc/adjtime. +if [ -x /sbin/hwclock -a -z "$container" ]; then + # Check for a broken motherboard RTC clock (where ioports for rtc are + # unknown) to prevent hwclock causing a hang: + if ! grep -q " : rtc" /proc/ioports ; then + CLOCK_OPT="--directisa" + fi + if [ /etc/adjtime -nt /etc/hardwareclock ]; then + if grep -q "^LOCAL" /etc/adjtime ; then + echo "Saving system time to the hardware clock (localtime)." + else + echo "Saving system time to the hardware clock (UTC)." + fi + /sbin/hwclock $CLOCK_OPT --systohc + elif grep -q "^UTC" /etc/hardwareclock 2> /dev/null ; then + echo "Saving system time to the hardware clock (UTC)." + if [ ! -r /etc/adjtime ]; then + echo "Creating system time correction file /etc/adjtime." + fi + /sbin/hwclock $CLOCK_OPT --utc --systohc + else + echo "Saving system time to the hardware clock (localtime)." + if [ ! -r /etc/adjtime ]; then + echo "Creating system time correction file /etc/adjtime." + fi + /sbin/hwclock $CLOCK_OPT --localtime --systohc + fi +fi + +# Run any local shutdown scripts: +if [ -x /etc/rc.d/rc.local_shutdown ]; then + /etc/rc.d/rc.local_shutdown stop +fi + +# Stop the Apache web server: +if [ -x /etc/rc.d/rc.httpd ]; then + /etc/rc.d/rc.httpd stop +fi + +# Stop the MySQL database: +if [ -r /var/run/mysql/mysql.pid ]; then + . /etc/rc.d/rc.mysqld stop +fi + +# Stop the Samba server: +if [ -x /etc/rc.d/rc.samba ]; then + . /etc/rc.d/rc.samba stop +fi + +# Shut down the NFS server: +if [ -x /etc/rc.d/rc.nfsd ]; then + /etc/rc.d/rc.nfsd stop +fi + +# Shut down the SSH server: +if [ -x /etc/rc.d/rc.sshd ]; then + /etc/rc.d/rc.sshd stop +fi + +# Shut down the SASL authentication daemon: +if [ -x /etc/rc.d/rc.saslauthd ]; then + /etc/rc.d/rc.saslauthd stop +fi + +# Shut down OpenLDAP: +if [ -x /etc/rc.d/rc.openldap ]; then + /etc/rc.d/rc.openldap stop +fi + +# Stop D-Bus: +if [ -x /etc/rc.d/rc.messagebus ]; then + sh /etc/rc.d/rc.messagebus stop +fi + +# Kill any processes (typically gam) that would otherwise prevent +# unmounting NFS volumes: +unset FUSER_DELAY +for dir in $(/bin/mount | grep 'type nfs ' | cut -d ' ' -f 3 ) ; do + echo "Killing processes holding NFS mount $dir open..." + # Background this to prevent fuser from also blocking shutdown: + /usr/bin/fuser -k -m $dir & + FUSER_DELAY=5 +done +# If fuser was run, let it have some delay: +if [ ! -z "$FUSER_DELAY" ]; then + sleep $FUSER_DELAY +fi + +# Unmount any NFS, SMB, or CIFS filesystems: +echo "Unmounting remote filesystems:" +/bin/umount -v -a -l -f -r -t nfs,smbfs,cifs | tr -d ' ' | grep successfully | sed "s/:successfullyunmounted/ has been successfully unmounted./g" + +# Try to shut down pppd: +PS="$(ps ax)" +if echo "$PS" | /bin/grep -q -w pppd ; then + if [ -x /usr/sbin/ppp-off ]; then + /usr/sbin/ppp-off + fi +fi + +# Shut down YP services: +if [ -x /etc/rc.d/rc.yp ]; then + if grep -wq stop /etc/rc.d/rc.yp ; then + /etc/rc.d/rc.yp stop + fi +fi + +# Bring down the networking system, but first make sure that this +# isn't a diskless client with the / partition mounted via NFS: +if ! /bin/mount | /bin/grep -q 'on / type nfs' ; then + if [ -x /etc/rc.d/rc.inet1 ]; then + . /etc/rc.d/rc.inet1 stop + fi +fi + +# In case dhcpcd might have been manually started on the command line, +# look for the .pid file, and shut dhcpcd down if it's found: +if /bin/ls /etc/dhcpc/*.pid 1> /dev/null 2> /dev/null ; then + /sbin/dhcpcd -k 1> /dev/null 2> /dev/null + # A little time for /etc/resolv.conf and/or other files to + # restore themselves. + sleep 2 +fi + +# Shut down PCMCIA devices: +if [ -x /etc/rc.d/rc.pcmcia -a -z "$container" ]; then + . /etc/rc.d/rc.pcmcia stop + # The cards might need a little extra time here to deactivate: + /bin/sleep 5 +fi + +# Turn off process accounting: +if [ -x /sbin/accton -a -r /var/log/pacct ]; then + /sbin/accton off +fi + +# Terminate acpid before syslog: +if [ -x /etc/rc.d/rc.acpid -a -r /var/run/acpid.pid -a -z "$container" ]; then # quit + . /etc/rc.d/rc.acpid stop +fi + +# Stop udev: +if [ -x /etc/rc.d/rc.udev -a -z "$container" ]; then + sh /etc/rc.d/rc.udev force-stop +fi + +# Kill all remaining processes. +OMITPIDS="$(for p in $(pgrep mdmon); do echo -o $p; done)" # Don't kill mdmon +if [ ! "$1" = "fast" ]; then + echo "Sending all processes the SIGTERM signal." + /sbin/killall5 -15 $OMITPIDS + /bin/sleep 5 + echo "Sending all processes the SIGKILL signal." + /sbin/killall5 -9 $OMITPIDS +fi + +# Try to turn off quota. +if /bin/grep -q quota /etc/fstab ; then + if [ -x /sbin/quotaoff -a -z "$container" ]; then + echo "Turning off filesystem quotas." + /sbin/quotaoff -a + fi +fi + +# Carry a random seed between reboots. +echo "Saving random seed from /dev/urandom in /etc/random-seed." +# Use the pool size from /proc, or 4096 bits: +if [ -r /proc/sys/kernel/random/poolsize ]; then + /bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=$(expr $(cat /proc/sys/kernel/random/poolsize) / 8) 2> /dev/null +else + /bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null +fi +/bin/chmod 600 /etc/random-seed + +# Before unmounting file systems write a reboot or halt record to wtmp. +$shutdown_command -w + +# Turn off swap: +if [ -z "$container" ]; then + echo "Turning off swap." + /sbin/swapoff -a + /bin/sync +fi + +# Stop cgmanager and cgproxy: +if [ -x /etc/rc.d/rc.cgmanager -a -z "$container" ]; then + sh /etc/rc.d/rc.cgmanager stop +fi + +if [ -z "$container" ]; then + echo "Unmounting local file systems:" + /bin/umount -v -a -t no,proc,sysfs | tr -d ' ' | grep successfully | sed "s/:successfullyunmounted/ has been successfully unmounted./g" 2> /dev/null + echo "Remounting root filesystem read-only:" + /bin/mount -v -n -o remount,ro / +fi + +# This never hurts: +/bin/sync + +# Close any volumes opened by cryptsetup: +if [ -f /etc/crypttab -a -x /sbin/cryptsetup ]; then + cat /etc/crypttab | grep -v "^#" | grep -v "^$" | while read line; do + # NOTE: we only support LUKS formatted volumes (except for swap)! + LUKS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f1 -d' ') + DEV=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f2 -d' ') + OPTS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f4 -d' ') + if /sbin/cryptsetup isLuks $DEV 2>/dev/null ; then + echo "Locking LUKS crypt volume '${LUKS}':" + /sbin/cryptsetup luksClose ${LUKS} + elif echo $OPTS | grep -wq swap ; then + # If any of the volumes was used as encrypted swap, + # then run mkswap on the underlying device - + # in case other Linux installations on this computer should use it: + echo "Erasing encrypted swap '${LUKS}' and restoring normal swap on ${DEV}:" + /sbin/cryptsetup remove ${LUKS} + mkswap $DEV + fi + done +fi + +# Deactivate LVM volume groups: +if [ -z "$container" ]; then + if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then + echo "Deactivating LVM volume groups:" + /sbin/vgchange -an --ignorelockingfailure + fi +fi + +# This never hurts again (especially since root-on-LVM always fails +# to deactivate the / logical volume... but at least it was +# remounted as read-only first) +/bin/sync + +# sleep 3 fixes problems with some hard drives that don't +# otherwise finish syncing before reboot or poweroff +/bin/sleep 3 + +# This is to ensure all processes have completed on SMP machines: +wait + +if [ -x /sbin/genpowerd -a -z "$container" ]; then + # See if this is a powerfail situation: + if /bin/egrep -q "FAIL|SCRAM" /etc/upsstatus 2> /dev/null ; then + # Signal UPS to shut off the inverter: + /sbin/genpowerd -k + if [ ! $? = 0 ]; then + echo + echo "There was an error signaling the UPS." + echo "Perhaps you need to edit /etc/genpowerd.conf to configure" + echo "the serial line and UPS type." + # Wasting 15 seconds of precious power: + /bin/sleep 15 + fi + fi +fi + +if [ "$container" = "lxc" ]; then + # confirm successful shutdown of the container + echo "LXC container stopped." +fi + +# Now halt (poweroff with APM or ACPI enabled kernels) or reboot. +if [ "$shutdown_command" = "reboot" ]; then + echo "Rebooting." + /sbin/reboot +else + /sbin/poweroff +fi + |