diff options
-rw-r--r-- | init.d.BSD/hostid | 2 | ||||
-rwxr-xr-x | init.d.BSD/savecore | 3 | ||||
-rw-r--r-- | init.d.Linux/mtab | 29 | ||||
-rwxr-xr-x | init.d/checkfs | 77 | ||||
-rwxr-xr-x | init.d/checkroot | 130 | ||||
-rw-r--r-- | init.d/fsck | 37 | ||||
-rwxr-xr-x | init.d/hostname | 5 | ||||
-rwxr-xr-x | init.d/localmount | 3 | ||||
-rw-r--r-- | init.d/root | 25 | ||||
-rw-r--r-- | init.d/swap | 5 | ||||
-rw-r--r-- | runlevels/Makefile | 4 | ||||
-rw-r--r-- | runlevels/Makefile.Linux | 2 |
12 files changed, 98 insertions, 224 deletions
diff --git a/init.d.BSD/hostid b/init.d.BSD/hostid index d8e21237..57fc6001 100644 --- a/init.d.BSD/hostid +++ b/init.d.BSD/hostid @@ -7,7 +7,7 @@ hostid_file=${hostid_file:-/etc/hostid} depend() { - need checkroot + need root before devd net } diff --git a/init.d.BSD/savecore b/init.d.BSD/savecore index 54246a9c..217c0817 100755 --- a/init.d.BSD/savecore +++ b/init.d.BSD/savecore @@ -6,8 +6,7 @@ description="Saves a kernel dump." depend() { - need checkfs - before swap + need localmount } start() diff --git a/init.d.Linux/mtab b/init.d.Linux/mtab new file mode 100644 index 00000000..abb94922 --- /dev/null +++ b/init.d.Linux/mtab @@ -0,0 +1,29 @@ +#!/sbin/runscript +# Copyright 2007-2008 Roy Marples <roy@marples.name> +# All rights reserved. Released under the 2-clause BSD license. + +description="Update /etc/mtab to match what the kernel knows about" + +depend() +{ + need root +} + +start() +{ + ebegin "Updating /etc/mtab" + if ! echo 2>/dev/null >/etc/mtab; then + ewend 1 "/etc/mtab is not updateable" + return 0 + fi + + # With / as tmpfs we cannot umount -at tmpfs in localmount as that + # makes / readonly and dismounts all tmpfs even if in use which is + # not good. Luckily, umount uses /etc/mtab instead of /proc/mounts + # which allows this hack to work. + grep -v "^[^ ]* / tmpfs " /proc/mounts > /etc/mtab + + # Remove stale backups + rm -f /etc/mtab~ /etc/mtab~~ + eend 0 +} diff --git a/init.d/checkfs b/init.d/checkfs deleted file mode 100755 index 4f8004db..00000000 --- a/init.d/checkfs +++ /dev/null @@ -1,77 +0,0 @@ -#!/sbin/runscript -# Copyright 2007-2008 Roy Marples <roy@marples.name> -# All rights reserved. Released under the 2-clause BSD license. - -description="Check filesystems according to /etc/fstab for errors and \ -optionally repair them." - -# Hard return to parse fstabinfo output -_IFS=" -" - -depend() -{ - need checkroot - after modules - keywords notimeout -} - -do_checkfs() -{ - local retval=0 opts= - [ "${RC_UNAME}" = "Linux" ] && opts="-C0 -T" - - ebegin "Checking all filesystems" - - # Load our partitions into $@ - local IFS="$_IFS" - set -- $(fstabinfo --passno ">1") - unset IFS - if [ $# = 0 ]; then - eend 0 - return 0 - fi - - fsck -p ${opts} "$@" - retval=$? - - if [ ${retval} -eq 0 ]; then - eend 0 - elif [ ${retval} -eq 1 ]; then - ewend 1 "Filesystem errors corrected." - retval=0 - elif [ ${retval} -eq 2 ]; then - ewend 1 "System should be rebooted" - elif [ ${retval} -eq 8 ]; then - ewend 1 "Operational error, continuing" - retval=0 - else - if yesno ${rc_force_auto:-${RC_FORCE_AUTO}}; then - eend 2 "Fsck could not correct all errors, rerunning" - fsck -y ${opts} "$@" - retval=$? - eend ${retval} - fi - - if [ ${retval} -gt 3 ]; then - eend 2 "Fsck could not correct all errors, manual repair needed" - exec rc-abort || exit 1 - fi - fi - - return ${retval} -} - -start() -{ - do_checkfs -} - -stop() -{ - # fsck on shutdown if we need to - if yesno "${fsck_shutdown:-${FSCK_SHUTDOWN}}"; then - do_checkfs - fi - return 0 -} diff --git a/init.d/checkroot b/init.d/checkroot deleted file mode 100755 index 05991408..00000000 --- a/init.d/checkroot +++ /dev/null @@ -1,130 +0,0 @@ -#!/sbin/runscript -# Copyright 2007-2008 Roy Marples <roy@marples.name> -# All rights reserved. Released under the 2-clause BSD license. - -description="Check the root filesystem according to /etc/fstab for errors \ -and optionally repair them." - -depend() -{ - keywords notimeout -} - -do_mtab() -{ - # Don't create mtab if /etc is readonly - if ! echo 2>/dev/null >/etc/mtab; then - ewarn "Skipping /etc/mtab initialization (ro root)" - return 0 - fi - ebegin "Updating /etc/mtab" - - # With / as tmpfs we cannot umount -at tmpfs in localmount as that - # makes / readonly and dismounts all tmpfs even if in use which is - # not good. Luckily, umount uses /etc/mtab instead of /proc/mounts - # which allows this hack to work. - grep -v "^[^ ]* / tmpfs " /proc/mounts > /etc/mtab - - # Remove stale backups - rm -f /etc/mtab~ /etc/mtab~~ - eend 0 -} - -root_rw() -{ - echo 2>/dev/null >/.test.$$ || return 1 - rm -f /.test.$$ -} - -do_fsck() -{ - local retval=0 opts= root= - case "${RC_UNAME}" in - FreeBSD) opts="-F";; - Linux) opts="-T -C0";; - esac - - # Don't bother doing a fsck on these - if [ -n "${CDBOOT}" ] || is_net_fs / || is_union_fs /; then - return 0 - fi - - if root_rw; then - einfo "root filesystem is mounted read-write - skipping" - return 0 - fi - - root=$(fstabinfo --blockdevice /) - [ ! -e "${root}" -a -e /dev/root ] && root=/dev/root - - # Obey the fs_passno setting for / (see fstab(5)) - local pass=$(fstabinfo --passno /) - if [ ${pass:-0} != "0" ]; then - ebegin "Checking root filesystem" - fsck ${opts} -p "${root}" - retval=$? - else - ebegin "Skipping root filesystem check (fstab's passno == 0)" - retval=0 - fi - - if [ ${retval} -eq 0 ]; then - eend 0 - elif [ ${retval} -eq 1 ]; then - ewend 1 "Filesystem repaired" - retval=0 - elif [ ${retval} -eq 8 ]; then - ewend 1 $"Operational error, continuing" - retval=0 - elif [ ${retval} -eq 2 -o ${retval} -eq 3 ]; then - ewend 1 "Filesystem repaired, but reboot needed!" - if ! yesno ${rc_force_auto:-${RC_FORCE_AUTO}}; then - printf "\a"; sleep 1; printf "\a"; sleep 1 - printf "\a"; sleep 1; printf "\a"; sleep 1 - ewarn "Rebooting in 10 seconds ..." - sleep 10 - fi - einfo "Rebooting" - reboot -f - else - if yesno ${rc_force_auto:-${RC_FORCE_AUTO}}; then - eend 2 "Rerunning fsck in force mode" - fsck ${opts} -y "${root}" - retval=$? - else - eend 2 "Filesystem couldn't be fixed :(" - exec rc-abort || exit 1 - fi - if [ ${retval} != "0" ]; then - einfo "Unmounting filesystems" - if [ "${RC_UNAME}" = "Linux" ]; then - mount -a -o remount,ro / - else - mount -u -o ro / - fi - einfo "Rebooting" - reboot -f - fi - fi -} - -start() -{ - do_fsck || return 1 - - if ! root_rw; then - ebegin "Remounting root filesystem read/write" - if [ "${RC_UNAME}" = "Linux" ]; then - mount -n -o remount,rw / - else - mount -u -o rw / - fi - eend $? "Root filesystem could not be mounted read/write" || return $? - fi - - # Only Linux has mtab - [ "${RC_UNAME}" = "Linux" -a -e /proc/mounts ] && do_mtab - - # We got here, so return 0 - return 0 -} diff --git a/init.d/fsck b/init.d/fsck new file mode 100644 index 00000000..01c92a69 --- /dev/null +++ b/init.d/fsck @@ -0,0 +1,37 @@ +#!/sbin/runscript +# Copyright 2007-2008 Roy Marples <roy@marples.name> +# All rights reserved. Released under the 2-clause BSD license. + +description="Check and repair filesystems according to /etc/fstab" + +depend() +{ + need swap + after clock modules + keywords notimeout +} + +start() +{ + local retval=0 opts= root= + if [ "${RC_UNAME}" = "Linux" ]; then + opts="${opts} -A -C0 -T" + if echo 2>/dev/null >/.test.$$; then + rm -f /.test.$$ + opts="${opts} -R" + fi + fi + + ebegin "Checking local filesystems" + fsck -p ${opts} + case $? in + 0) eend 0; return 0;; + 1) ewend 1 "Filesystems repaired"; return 0;; + 2|4) ewend 1 "Filesystems repaired, but reboot needed" + reboot; exec rc-abort; return 1;; + 8) ewend 1 "Operational error"; return 0;; + 12) ewend 1 "fsck interupted"; return 1;; + *) eend 2 "Filesystems couldn't be fixed" + exec rc-abort; return 1;; + esac +} diff --git a/init.d/hostname b/init.d/hostname index 1ee3e381..a777cb38 100755 --- a/init.d/hostname +++ b/init.d/hostname @@ -4,11 +4,6 @@ description="Sets the hostname of the machine." -depend() -{ - need checkroot -} - start() { hostname=${hostname-${HOSTNAME-localhost}} diff --git a/init.d/localmount b/init.d/localmount index 1983aa54..5b8e849c 100755 --- a/init.d/localmount +++ b/init.d/localmount @@ -6,7 +6,8 @@ description="Mounts disks and swap according to /etc/fstab." depend() { - need checkfs + need fsck + use modules mtab } start() diff --git a/init.d/root b/init.d/root new file mode 100644 index 00000000..fa20ebd8 --- /dev/null +++ b/init.d/root @@ -0,0 +1,25 @@ +#!/sbin/runscript +# Copyright 2007-2008 Roy Marples <roy@marples.name> +# All rights reserved. Released under the 2-clause BSD license. + +description="Mount the root fs read/write" + +depend() +{ + need fsck +} + +start() +{ + if echo 2>/dev/null >/.test.$$; then + rm -f /.test.$$ + return 0 + fi + + ebegin "Remounting root filesystem read/write" + case "${RC_UNAME}" in + Linux) mount -n -o remount,rw /;; + *) mount -u -o rw /;; + esac + eend $? "Root filesystem could not be mounted read/write" +} diff --git a/init.d/swap b/init.d/swap index 53cf45c6..8e7d42f7 100644 --- a/init.d/swap +++ b/init.d/swap @@ -2,11 +2,6 @@ # Copyright 2007-2008 Roy Marples <roy@marples.name> # All rights reserved. Released under the 2-clause BSD license. -depend() -{ - need localmount -} - start() { ebegin "Activating swap" diff --git a/runlevels/Makefile b/runlevels/Makefile index 1e2591ab..05e45399 100644 --- a/runlevels/Makefile +++ b/runlevels/Makefile @@ -1,5 +1,5 @@ -BOOT= bootmisc checkroot checkfs hostname localmount \ - swap sysctl urandom +BOOT= bootmisc fsck hostname localmount \ + root swap sysctl urandom DEFAULT= local netmount LEVELDIR= ${DESTDIR}/etc/runlevels diff --git a/runlevels/Makefile.Linux b/runlevels/Makefile.Linux index 205f0971..81101e34 100644 --- a/runlevels/Makefile.Linux +++ b/runlevels/Makefile.Linux @@ -1,2 +1,2 @@ -BOOT+= clock consolefont keymaps modules net.lo procfs +BOOT+= clock consolefont keymaps modules mtab net.lo procfs DEFAULT+= hdparm |