]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
base/mount-hook.sh: add forgotten file
authorHarald Hoyer <harald@redhat.com>
Tue, 3 Apr 2012 15:30:11 +0000 (17:30 +0200)
committerHarald Hoyer <harald@redhat.com>
Tue, 3 Apr 2012 15:32:52 +0000 (17:32 +0200)
modules.d/99base/mount-hook.sh [new file with mode: 0755]

diff --git a/modules.d/99base/mount-hook.sh b/modules.d/99base/mount-hook.sh
new file mode 100755 (executable)
index 0000000..99b17dd
--- /dev/null
@@ -0,0 +1,169 @@
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+PATH=/usr/sbin:/usr/bin:/sbin:/bin
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+type det_fs >/dev/null 2>&1 || . /lib/fs-lib.sh
+
+mountpoint="$1"
+ismounted "$mountpoint" && exit 0
+
+if [ -f "$NEWROOT"/fastboot ] || getargbool 0 fastboot ; then
+    fastboot=yes
+fi
+
+filter_rootopts() {
+    rootopts=$1
+    # strip ro and rw options
+    local OLDIFS="$IFS"
+    IFS=,
+    set -- $rootopts
+    IFS="$OLDIFS"
+    local v
+    while [ $# -gt 0 ]; do
+        case $1 in
+            rw|ro);;
+            defaults);;
+            *)
+                v="$v,${1}";;
+        esac
+        shift
+    done
+    rootopts=${v#,}
+    echo $rootopts
+}
+
+mount_root() {
+    local _ret
+    # sanity - determine/fix fstype
+    rootfs=$(det_fs "${root#block:}" "$fstype")
+    mount -t ${rootfs} -o "$rflags",ro "${root#block:}" "$NEWROOT"
+
+    READONLY=
+    fsckoptions=
+    if [ -f "$NEWROOT"/etc/sysconfig/readonly-root ]; then
+        . "$NEWROOT"/etc/sysconfig/readonly-root
+    fi
+
+    if getargbool 0 "readonlyroot=" -y readonlyroot; then
+        READONLY=yes
+    fi
+
+    if getarg noreadonlyroot ; then
+        READONLY=no
+    fi
+
+    if [ -f "$NEWROOT"/fastboot ] || getargbool 0 fastboot ; then
+        fastboot=yes
+    fi
+
+    if [ -f "$NEWROOT"/fsckoptions ]; then
+        fsckoptions=$(cat "$NEWROOT"/fsckoptions)
+    fi
+
+    if [ -f "$NEWROOT"/forcefsck ] || getargbool 0 forcefsck ; then
+        fsckoptions="-f $fsckoptions"
+    elif [ -f "$NEWROOT"/.autofsck ]; then
+        [ -f "$NEWROOT"/etc/sysconfig/autofsck ] && . "$NEWROOT"/etc/sysconfig/autofsck
+        if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then
+            AUTOFSCK_OPT="$AUTOFSCK_OPT -f"
+        fi
+        if [ -n "$AUTOFSCK_SINGLEUSER" ]; then
+            warn "*** Warning -- the system did not shut down cleanly. "
+            warn "*** Dropping you to a shell; the system will continue"
+            warn "*** when you leave the shell."
+            emergency_shell
+        fi
+        fsckoptions="$AUTOFSCK_OPT $fsckoptions"
+    fi
+
+    rootopts=
+    if getargbool 1 rd.fstab -n rd_NO_FSTAB \
+        && ! getarg rootflags \
+        && [ -f "$NEWROOT/etc/fstab" ] \
+        && ! [ -L "$NEWROOT/etc/fstab" ]; then
+        # if $NEWROOT/etc/fstab contains special mount options for
+        # the root filesystem,
+        # remount it with the proper options
+        rootopts="defaults"
+        while read dev mp fs opts rest; do
+            # skip comments
+            [ "${dev%%#*}" != "$dev" ] && continue
+
+            if [ "$mp" = "/" ]; then
+                # sanity - determine/fix fstype
+                rootfs=$(det_fs "${root#block:}" "$fs")
+                rootopts=$opts
+                break
+            fi
+        done < "$NEWROOT/etc/fstab"
+
+        rootopts=$(filter_rootopts $rootopts)
+    fi
+
+    # we want rootflags (rflags) to take precedence so prepend rootopts to
+    # them; rflags is guaranteed to not be empty
+    rflags="${rootopts:+"${rootopts},"}${rflags}"
+
+    umount "$NEWROOT"
+
+    # backslashes are treated as escape character in fstab
+    # esc_root=$(echo ${root#block:} | sed 's,\\,\\\\,g')
+    # printf '%s %s %s %s 1 1 \n' "$esc_root" "$NEWROOT" "$rootfs" "$rflags" >/etc/fstab
+
+    if [ -z "$fastboot" -a "$READONLY" != "yes" ] && ! strstr "${rflags},${rootopts}" _netdev; then
+        fsck_single "${root#block:}" "$rootfs" "$fsckoptions"
+        _ret=$?
+        [ $_ret -ne 255 ] && echo $_ret >/run/initramfs/root-fsck
+    fi
+
+    info "Remounting ${root#block:} with -o ${rflags}"
+    mount -t "$rootfs" -o "$rflags" "${root#block:}" "$NEWROOT" 2>&1 | vinfo
+
+    [ -f "$NEWROOT"/forcefsck ] && rm -f "$NEWROOT"/forcefsck 2>/dev/null
+    [ -f "$NEWROOT"/.autofsck ] && rm -f "$NEWROOT"/.autofsck 2>/dev/null
+}
+
+sub_mount_ready() {
+    local _dev _mp _rest
+    while read _dev _mp _rest; do
+        [ "$1" = "$_mp" ] && continue
+
+        if [ "${1##$_mp}" != "$1" ]; then
+            ismounted "$_mp" || return 1
+        fi
+    done < "/etc/fstab"
+    return 0
+}
+
+if [ "$mountpoint" = "$NEWROOT" ]; then
+    mount_root
+    exit $?
+fi
+
+while read _dev _mp _fs _opts _rest; do
+    if [ "$_mp" = "$mountpoint" ]; then
+        _found="1"
+        break
+    fi
+done < "/etc/fstab"
+
+[ "$_found" = "1" ] || exit 1
+
+sub_mount_ready "$mountpoint" || exit 1
+
+if [ -z "$fastboot" ] && ! strstr "${_opts}" _netdev; then
+    # fsck?
+    fsck_single "$_dev" "$_fs" "$_opts"
+    _ret=$?
+    if [ "${mountpoint##$NEWROOT}" != "$mountpoint" ]; then
+        echo $_ret >/run/initramfs/${mountpoint##$NEWROOT}-fsck
+    fi
+fi
+
+info "Mounting $_dev on $mountpoint"
+mount "$mountpoint" 2>&1 | vinfo
+
+ismounted "$mountpoint" || exit 1
+