Comment 5 for bug 151579

Revision history for this message
Agostino Russo (ago) wrote :

preliminary patch for umountroot: instead of remounting ro only /, extend the same treatment to any mountpoint still mentioned in /proc/mounts

remount_ro(){
    local MTPT=$1
    [ "$VERBOSE" = no ] || log_action_begin_msg "Mounting $MPT 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
    ES=$?
    [ "$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
    exec 9<&0 </proc/mounts
    REG_MTPTS=""
    TMPFS_MTPTS=""
    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)
            continue
            ;;
        *)
            remount_ro $MTPT
            ;;
        esac
    done
    exec 0<&9 9<&-
}