From 3871942d13b9175b8143f1ebbd48a211a007c7d2 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Fri, 29 Oct 2010 19:00:35 +0200 Subject: [PATCH] rootfs-block:mount-root.sh add fsck --- modules.d/95rootfs-block/install | 2 + modules.d/95rootfs-block/mount-root.sh | 87 +++++++++++++++++++++++--- 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/modules.d/95rootfs-block/install b/modules.d/95rootfs-block/install index 60b47c59..ff03476a 100755 --- a/modules.d/95rootfs-block/install +++ b/modules.d/95rootfs-block/install @@ -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" diff --git a/modules.d/95rootfs-block/mount-root.sh b/modules.d/95rootfs-block/mount-root.sh index cb482839..59d8540d 100755 --- a/modules.d/95rootfs-block/mount-root.sh +++ b/modules.d/95rootfs-block/mount-root.sh @@ -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