From 46a1738161e37f4944f0fba0ee1bb5682bd5efc0 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 3 Apr 2012 17:30:11 +0200 Subject: [PATCH] base/mount-hook.sh: add forgotten file --- modules.d/99base/mount-hook.sh | 169 +++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100755 modules.d/99base/mount-hook.sh diff --git a/modules.d/99base/mount-hook.sh b/modules.d/99base/mount-hook.sh new file mode 100755 index 000000000..99b17dd53 --- /dev/null +++ b/modules.d/99base/mount-hook.sh @@ -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 + -- 2.47.3