]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
rootfs-block:mount-root.sh add fsck
authorHarald Hoyer <harald@redhat.com>
Fri, 29 Oct 2010 17:00:35 +0000 (19:00 +0200)
committerHarald Hoyer <harald@redhat.com>
Fri, 29 Oct 2010 17:00:35 +0000 (19:00 +0200)
modules.d/95rootfs-block/install
modules.d/95rootfs-block/mount-root.sh

index 60b47c599b65d2623c4ca942f95e4e80c5ca89b4..ff03476a47d2d558596069e15ef36392c19a8c01 100755 (executable)
@@ -3,6 +3,8 @@
 # ex: ts=8 sw=4 sts=4 et filetype=sh
 
 dracut_install umount
+dracut_install /sbin/fsck*
+
 inst_hook cmdline 95 "$moddir/parse-block.sh"
 inst_hook pre-udev 30 "$moddir/block-genrules.sh"
 inst_hook mount 99 "$moddir/mount-root.sh"
index cb48283983965a65b780c7bfde3644538e08ff04..59d8540d5a9061819fccc46abfc655ebbe2b835c 100755 (executable)
@@ -26,9 +26,51 @@ filter_rootopts() {
 }
 
 if [ -n "$root" -a -z "${root%%block:*}" ]; then
-    mount -t ${fstype:-auto} -o "$rflags" "${root#block:}" "$NEWROOT" \
+    mount -t ${fstype:-auto} -o "$rflags",ro "${root#block:}" "$NEWROOT" \
         && ROOTFS_MOUNTED=yes 
 
+    READONLY=
+    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
+
+    if strstr " $fsckoptions" " -y"; then
+        fsckoptions="-a $fsckoptions"
+    fi
+
+    rootopts=
     if getargbool 1 rd.fstab -n rd_NO_FSTAB \
         && ! getarg rootflags \
         && [ -f "$NEWROOT/etc/fstab" ] \
@@ -36,7 +78,7 @@ if [ -n "$root" -a -z "${root%%block:*}" ]; then
         # if $NEWROOT/etc/fstab contains special mount options for 
         # the root filesystem,
         # remount it with the proper options
-        rootfs="auto"
+        rootfs=${fstype:-auto}
         rootopts="defaults"
         while read dev mp fs opts rest; do 
             # skip comments
@@ -50,12 +92,43 @@ if [ -n "$root" -a -z "${root%%block:*}" ]; then
         done < "$NEWROOT/etc/fstab"
 
         rootopts=$(filter_rootopts $rootopts)
+    fi
+
+    umount "$NEWROOT"
+    if [ "$rootfs" = "auto" ]; then
+        udevadm info --query=env --name=${root#block:} | \
+            while read line; do
+                if strstr $line ID_FS_TYPE; then
+                    eval $line
+                    rootfs=$ID_FS_TYPE
+                    break
+                fi
+            done
+    fi
 
-        if [ -n "$rootopts" ]; then
-            umount $NEWROOT
-            info "Remounting ${root#block:} with -o $rootopts,$rflags"
-            mount -t "$rootfs" -o "$rflags","$rootopts" \
-                "${root#block:}" "$NEWROOT" 2>&1 | vinfo
+    echo ${root#block:} "$NEWROOT" "$rootfs" ${rflags},${rootopts} 1 1 > /etc/fstab
+
+    if [ -z "$fastboot" -a "$READONLY" != "yes" ]; then
+        info "Checking filesystems"
+        info fsck -T -t noopts=_netdev -A $fsckoptions
+        out=$(fsck -T -t noopts=_netdev -A $fsckoptions) 
+        export RD_ROOTFS_FSCK=$?
+        
+        # A return of 4 or higher means there were serious problems.
+        if [ $RD_ROOTFS_FSCK -gt 3 ]; then
+            warn $out
+            warn "fsck returned with error code $RD_ROOTFS_FSCK"
+            warn "*** An error occurred during the file system check."
+            warn "*** Dropping you to a shell; the system will retry"
+            warn "*** to mount the system, when you leave the shell."
+            emergency_shell "(Repair filesystem)"
+        else
+            echo $out|vinfo
+            warn "fsck returned with $RD_ROOTFS_FSCK"
         fi
     fi
+
+    info "Remounting ${root#block:} with -o ${rflags},${rootopts}"
+    mount -t "$rootfs" -o "$rflags","$rootopts" \
+        "${root#block:}" "$NEWROOT" 2>&1 | vinfo
 fi