From e99add4a34459654609147c8989d41cb450d0117 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 16 Sep 2008 10:23:22 +0200 Subject: https://bugzilla.redhat.com/show_bug.cgi?id=433702 Changes to init scripts to better support stateless: --rc.sysinit-- - don't update mtab in a r/o root - mount on sys and /dev/pts returns EBUSY on a readonly root - [ -n $CLIENTSTATE ] is always returning true, causing an unnecessary timeout --network-- - /etc/mtab may not have any mount information in the readonly-root cause, but the root mount is likely to be a network mount. Without this, nfs hangs the reboot process. --halt-- - don't try and update a read-only mtab --rwtab-- - /var/empty/sshd/etc/localtime needs to be overwritten by sshd at startup - /var/lib/random-seed is written to at shutdown; this fixes the error but doesn't return the functionality lost in a r/o /var/lib. --- rc.d/init.d/halt | 9 ++++++--- rc.d/init.d/network | 2 +- rc.d/rc.sysinit | 30 ++++++++++++++++++------------ 3 files changed, 25 insertions(+), 16 deletions(-) (limited to 'rc.d') diff --git a/rc.d/init.d/halt b/rc.d/init.d/halt index fc9a6f27..f0353ca3 100755 --- a/rc.d/init.d/halt +++ b/rc.d/init.d/halt @@ -11,6 +11,9 @@ NOLOCALE=1 . /etc/init.d/functions +UMOUNT="umount" +[ ! -w /etc ] && UMOUNT="umount -n" + action() { echo -n "$1 " shift @@ -88,7 +91,7 @@ action $"Saving random seed: " dd if=/dev/urandom of=/var/lib/random-seed count= # Try to unmount tmpfs filesystems to avoid swapping them in. Ignore failures. tmpfs=$(awk '$2 ~ /^\/($|proc|dev)/ { next; } $3 == "tmpfs" { print $2; }' /proc/mounts | sort -r) -[ -n "$tmpfs" ] && fstab-decode umount $tmpfs 2>/dev/null +[ -n "$tmpfs" ] && fstab-decode $UMOUNT $tmpfs 2>/dev/null # Turn off swap, then unmount file systems. [ -f /proc/swaps ] && SWAPS=`awk '! /^Filename/ { print $1 }' /proc/swaps` @@ -127,7 +130,7 @@ LANG=C __umount_loop '$2 ~ /^\/$|^\/proc|^\/dev/{next} $"Unmounting file systems (retry): " \ -f -[ -f /proc/bus/usb/devices ] && umount /proc/bus/usb +[ -f /proc/bus/usb/devices ] && $UMOUNT /proc/bus/usb [ -f /etc/crypttab ] && halt_crypto @@ -139,7 +142,7 @@ rm -f /.autofsck awk '$2 !~ /\/(|dev|proc|selinux|sys)$/ && $1 !~ /^\/dev\/ram/ { print $2 }' \ /proc/mounts | sort -r | \ while read line; do - fstab-decode umount -f $line + fstab-decode $UMOUNT -f $line done if [ -x /sbin/halt.local ]; then diff --git a/rc.d/init.d/network b/rc.d/init.d/network index b1b15592..a72a92f1 100755 --- a/rc.d/init.d/network +++ b/rc.d/init.d/network @@ -168,7 +168,7 @@ case "$1" in stop) # Don't shut the network down if root is on NFS or a network # block device. - rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' /etc/mtab) + rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/" && $3 != "rootfs") { print $3; }}' /proc/mounts) rootopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}' /etc/mtab) if [[ "$rootfs" =~ ^nfs ]] || [[ "$rootopts" =~ "_netdev|_rnetdev" ]] ; then diff --git a/rc.d/rc.sysinit b/rc.d/rc.sysinit index 8e274c7c..52e1ca5a 100755 --- a/rc.d/rc.sysinit +++ b/rc.d/rc.sysinit @@ -514,7 +514,7 @@ if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then /bin/true elif [ x$state_mount_dev != x ] && mount $state_mount_dev $mountopts "$STATE_MOUNT" > /dev/null 2>&1; then /bin/true - elif [ -n "$CLIENTSTATE" ]; then + elif [ ! -z "$CLIENTSTATE" ]; then # No local storage was found. Make a final attempt to find # state on an NFS server. @@ -642,23 +642,29 @@ if [ -n "$SELINUX_STATE" -a "$READONLY" != "yes" ]; then fi fi -# Clear mtab -(> /etc/mtab) &> /dev/null +if [ "$READONLY" != "yes" ] ; then + # Clear mtab + (> /etc/mtab) &> /dev/null -# Remove stale backups -rm -f /etc/mtab~ /etc/mtab~~ + # Remove stale backups + rm -f /etc/mtab~ /etc/mtab~~ -# Enter mounted filesystems into /etc/mtab -mount -f / -mount -f /proc >/dev/null 2>&1 -mount -f /sys >/dev/null 2>&1 -mount -f /dev/pts >/dev/null 2>&1 -mount -f /proc/bus/usb >/dev/null 2>&1 + # Enter mounted filesystems into /etc/mtab + mount -f / + mount -f /proc >/dev/null 2>&1 + mount -f /sys >/dev/null 2>&1 + mount -f /dev/pts >/dev/null 2>&1 + mount -f /proc/bus/usb >/dev/null 2>&1 +fi # Mount all other filesystems (except for NFS and /proc, which is already # mounted). Contrary to standard usage, # filesystems are NOT unmounted in single user mode. -action $"Mounting local filesystems: " mount -a -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev +if [ "$READONLY" != "yes" ] ; then + action $"Mounting local filesystems: " mount -a -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev +else + action $"Mounting local filesystems: " mount -a -n -t nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev +fi # Update quotas if necessary if [ X"$_RUN_QUOTACHECK" = X1 -a -x /sbin/quotacheck ]; then -- cgit v1.2.1