diff options
Diffstat (limited to 'source/a/sysvinit-scripts/scripts/rc.6')
-rw-r--r-- | source/a/sysvinit-scripts/scripts/rc.6 | 189 |
1 files changed, 116 insertions, 73 deletions
diff --git a/source/a/sysvinit-scripts/scripts/rc.6 b/source/a/sysvinit-scripts/scripts/rc.6 index 92338d4d8..5fec619c0 100644 --- a/source/a/sysvinit-scripts/scripts/rc.6 +++ b/source/a/sysvinit-scripts/scripts/rc.6 @@ -4,15 +4,21 @@ # 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 +# Version: @(#)/etc/rc.d/rc.6 15.0 Wed Nov 10 21:19:42 UTC 2021 # # Author: Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org> # Modified by: Patrick J. Volkerding, <volkerdi@slackware.com> -# # Set the path. PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin +# If we are in an lxc container, set $container to skip parts of the script. +# Thanks to Matteo Bernardini <ponce@slackbuilds.org> and Chris Willing for +# the initial work making this script lxc compatible. +if grep -aq container=lxc /proc/1/environ 2> /dev/null ; then + container="lxc" +fi + # If there are SystemV init scripts for this runlevel, run them. if [ -x /etc/rc.d/rc.sysvinit ]; then /etc/rc.d/rc.sysvinit @@ -43,7 +49,7 @@ 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 ]; then +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 @@ -112,15 +118,10 @@ if [ -x /etc/rc.d/rc.openldap ]; then fi # Stop the haveged entropy daemon: -if [ -x /etc/rc.d/rc.haveged ]; then +if [ -x /etc/rc.d/rc.haveged -a -z "$container" ]; then /etc/rc.d/rc.haveged stop fi -# Stop D-Bus: -if [ -x /etc/rc.d/rc.messagebus ]; then - /etc/rc.d/rc.messagebus stop -fi - # Kill any processes (typically gam) that would otherwise prevent # unmounting NFS volumes: unset FUSER_DELAY @@ -138,10 +139,17 @@ fi # Unmount any NFS, SMB, or CIFS filesystems: echo "Unmounting remote filesystems:" /bin/umount -v -a -l -f -r -t nfs,nfs4,smbfs,cifs | tr -d ' ' | grep successfully | sed "s/:successfullyunmounted/ has been successfully unmounted./g" +# Update PATH hashes: +hash -r + +# Stop D-Bus: +if [ -x /etc/rc.d/rc.messagebus ]; then + /etc/rc.d/rc.messagebus stop +fi # Try to shut down pppd: PS="$(ps ax)" -if echo "$PS" | /bin/grep -q -w pppd ; then +if echo "$PS" | grep -q -w pppd ; then if [ -x /usr/sbin/ppp-off ]; then /usr/sbin/ppp-off fi @@ -156,7 +164,7 @@ 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 -e 'on / type nfs' -e 'on / type nfs4' ; then +if ! /bin/mount | grep -q -e 'on / type nfs' -e 'on / type nfs4' ; then if [ -x /etc/rc.d/rc.inet1 ]; then /etc/rc.d/rc.inet1 stop fi @@ -171,8 +179,23 @@ if /bin/ls /etc/dhcpc/*.pid 1> /dev/null 2> /dev/null ; then sleep 2 fi +# If there is a firewall_shutdown script, run it. Most firewall setups +# will not need to be formally shut down, but in case yours needs that +# (perhaps to do some shutdown-time cleanup or to save the state), then +# create an /etc/rc.d/rc.firewall_shutdown script to do these things. +# If your rc.firewall script supports a "stop" parameter, you might only +# need this in your rc.firewall_shutdown script: +# +# /etc/rc.d/rc.firewall stop +# +# Or in that case you could also just make rc.firewall_shutdown a symlink +# to the rc.firewall script, since we also provide the stop parameter here. +if [ -x /etc/rc.d/rc.firewall_shutdown ]; then + /etc/rc.d/rc.firewall_shutdown stop +fi + # Shut down PCMCIA devices: -if [ -x /etc/rc.d/rc.pcmcia ]; then +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 @@ -184,12 +207,12 @@ if [ -x /sbin/accton -a -r /var/log/pacct ]; then fi # Terminate acpid before syslog: -if [ -x /etc/rc.d/rc.acpid -a -r /var/run/acpid.pid ]; then # quit +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 ]; then +if [ -x /etc/rc.d/rc.udev -a -z "$container" ]; then /etc/rc.d/rc.udev force-stop fi @@ -204,78 +227,88 @@ if [ ! "$1" = "fast" ]; then fi # Try to turn off quota. -if /bin/grep -q quota /etc/fstab ; then - if [ -x /sbin/quotaoff ]; then +if 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 +# Doing this properly requires the seedrng utility. +if [ -z "$container" ]; then + # Any old seed that exists here shall be deemed useless: + if [ -f /etc/random-seed ]; then + rm -f /etc/random-seed + sync /etc + fi + if [ -x /usr/sbin/seedrng ]; then + /usr/sbin/seedrng + else # we have to fall back on the old method: + OLD_UMASK="$(umask)" + umask 077 + mkdir -p /var/lib/seedrng + echo "The SeedRNG utility was not found. Generating a non-creditable and" + echo "inferior RNG seed: /var/lib/seedrng/seed.no-credit" + SEED="$(cat /var/lib/seedrng/seed.* 2>/dev/null | base64)" + rm -f /var/lib/seedrng/seed.* + sync /var/lib/seedrng + POOLSIZE=$(expr $(cat /proc/sys/kernel/random/poolsize 2> /dev/null || echo 4096) / 8) + { + head -c $POOLSIZE /dev/urandom + echo "$SEED" | base64 -d + } | sha512sum | cut -d ' ' -f 1 > /var/lib/seedrng/seed.no-credit + umask "$OLD_UMASK" + unset OLD_UMASK + unset SEED + fi 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 [ ! "$(cat /proc/swaps | wc -l)" = "1" ]; then +if [ ! "$(cat /proc/swaps | wc -l)" = "1" -a -z "$container" ]; then echo "Turning off swap." /sbin/swapoff -a /bin/sync fi # Umount all tmpfs mounts except /dev/shm and under /run: -cat /proc/mounts | grep " tmpfs " | grep -v -e " /run " -e " /run/" -e " /dev/shm " | while read mount ; do - umount --recursive -v $(echo $mount | cut -f 2 -d ' ') 2> /dev/null -done +if [ -z "$container" ]; then + cat /proc/mounts | grep " tmpfs " | grep -v -e " /run " -e " /run/" -e " /dev/shm " | while read mount ; do + umount --recursive -v $(echo $mount | cut -f 2 -d ' ') 2> /dev/null + done +fi # Unmount local file systems: -echo "Unmounting local file systems:" -/bin/umount -v -a -t no,proc,sysfs,devtmpfs,fuse.gvfsd-fuse,tmpfs - -# JFS needs a sync here or the / partition cannot be remounted read-only. -# In spite of this, it seems that a JFS root partition will always be checked -# (and found to be clean) at boot: -/bin/sync - -echo "Remounting root filesystem read-only:" -/bin/mount -v -n -o remount,ro / +if [ -z "$container" ]; then + echo "Unmounting local file systems:" + /bin/umount -v -a -t no,proc,sysfs,devtmpfs,fuse.gvfsd-fuse,tmpfs + # Update PATH hashes: + hash -r + # JFS needs a sync here or the / partition cannot be remounted read-only. + # In spite of this, it seems that a JFS root partition will always be checked + # (and found to be clean) at boot: + /bin/sync + 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 +if [ -x /etc/rc.d/rc.luks ]; then + /etc/rc.d/rc.luks stop fi # Deactivate LVM volume groups: -if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then - echo "Deactivating LVM volume groups:" - /sbin/vgchange -an +if [ -z "$container" ]; then + if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then + echo "Deactivating LVM volume groups:" + /sbin/vgchange -an + fi fi # This never hurts again (especially since root-on-LVM always fails @@ -290,20 +323,31 @@ fi # This is to ensure all processes have completed on SMP machines: wait -if [ -x /sbin/genpowerd ]; 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 +if [ "$container" = "lxc" ]; then + # Confirm successful shutdown of the container: + echo "LXC container stopped." +fi + +# NUT UPS inverter shutdown support: +# If we see a file /etc/killpower, that means we want to shut off the UPS +# inverter on the way down. This will save as much battery power as possible +# and avoid unnecessary full-drain/full-recharge cycles. +if [ -e /etc/killpower -a -z "$container" ]; then + # First we need to restart udev or we won't be able to contact the UPS: + echo "Restarting udev to be able to shut the UPS inverter off..." + /etc/rc.d/rc.udev start + # Wasting precious battery power: + sleep 10 + echo "Shutting down UPS inverter..." + upsdrvctl shutdown + # The power should shut off during the following sleep, but we'll give a + # bit of notice otherwise. Also, be sure to set your machine to start when + # the power resumes in the BIOS settings so that it doesn't stay off. + sleep 45 + echo "The UPS power should have stopped by now, but has not." + echo "It's possible that the power came back during the shutdown process." + echo "Otherwise, check communication with the UPS." + sleep 15 fi # Now halt (poweroff with APM or ACPI enabled kernels) or reboot. @@ -313,4 +357,3 @@ if [ "$shutdown_command" = "reboot" ]; then else /sbin/poweroff fi - |