#! /bin/sh ### BEGIN INIT INFO # Provides: umountroot # Required-Start: umountfs # Required-Stop: umountfs # Default-Start: 6 # Default-Stop: # Short-Description: Mount the root filesystem read-only. ### END INIT INFO PATH=/sbin:/bin . /lib/init/vars.sh . /lib/lsb/init-functions remount_ro () { sync local MTPT="$1" [ "$VERBOSE" = no ] || log_action_begin_msg "Mounting $MTPT filesystem read-only" MOUNT_FORCE_OPT= [ "$(uname -s)" = "GNU/kFreeBSD" ] && MOUNT_FORCE_OPT=-f # This: # mount -n -o remount,ro / # will act on a bind mount of / if there is one. # See #339023 and the comment in checkroot.sh mount $MOUNT_FORCE_OPT -n -o remount,ro -t dummytype dummydev $MTPT 2>/dev/null \ || mount $MOUNT_FORCE_OPT -n -o remount,ro dummydev $MTPT 2>/dev/null \ || mount $MOUNT_FORCE_OPT -n -o remount,ro $MTPT 2>/dev/null ES=$? if [ $ES != 0 ]; then DEV= while read xDEV xMTPT xJUNK;do [ "$xMTPT" = "$MTPT" ] || continue [ "/${xDEV#/}" = "$xDEV" ] || continue DEV="$xDEV" break done < /proc/mounts if [ "$DEV" ]; then local TYPE=$(/lib/udev/vol_id -t $DEV 2> /dev/null) if [ -z "$TYPE" ]; then TYPE=${MOUNT#* $MTPT } TYPE=${TYPE%% *} fi mount $MOUNT_FORCE_OPT -n -o remount,ro -t $TYPE $DEV $MTPT 2>/dev/null || \ mount $MOUNT_FORCE_OPT -o remount,ro -t $TYPE $DEV $MTPT ES=$? fi fi [ "$VERBOSE" = no ] || log_action_end_msg $ES } do_stop () { # These directories must exist on the root filesystem as they are # targets for system mountpoints. We've just unmounted all other # filesystems, so either they are mounted now (in which case the # mount point exists) or we can make the mountpoint. for dir in /proc /sys /var/run /var/lock; do mkdir -p $dir || true done echo "$(sed '1!G;h;$!d' /proc/mounts)" | while read DEV MTPT FSTYPE REST; do case "$MTPT" in /proc|/dev|/.dev|/dev/pts|/dev/shm|/proc/*|/sys|/var/run|/var/lock) continue ;; esac case "$FSTYPE" in proc|procfs|linprocfs|devfs|sysfs|usbfs|usbdevfs|devpts|tmpfs|rootfs|securityfs) continue ;; *) remount_ro "$MTPT" if losetup -a|grep -qs "^$DEV:"; then blockdev --setro "$DEV" &>/dev/null || true fi ;; esac done } case "$1" in start) # No-op ;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2 exit 3 ;; stop) do_stop ;; *) echo "Usage: $0 start|stop" >&2 exit 3 ;; esac :