#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh 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 } if [ -n "$root" -a -z "${root%%block:*}" ]; then mount -t ${fstype:-auto} -o "$rflags",ro "${root#block:}" "$NEWROOT" \ && ROOTFS_MOUNTED=yes 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 if ! strstr " $fsckoptions" " -y"; then fsckoptions="-a $fsckoptions" fi rootfs=${fstype:-auto} 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 rootfs=$fs rootopts=$opts break fi done < "$NEWROOT/etc/fstab" rootopts=$(filter_rootopts $rootopts) fi umount "$NEWROOT" if [ "$rootfs" = "auto" ]; then rootfs=$(udevadm info --query=env --name=${root#block:} | \ while read line; do if strstr $line ID_FS_TYPE; then eval $line echo $ID_FS_TYPE break fi done) rootfs=${rootfs:-auto} fi # backslashes are treated as escape character in fstab esc_root=$(echo ${root#block:} | sed 's,\\,\\\\,g') printf '%s %s %s %s,%s 1 1 \n' "$esc_root" "$NEWROOT" "$rootfs" "$rflags" "$rootopts" > /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=$? echo $RD_ROOTFS_FSCK > /run/initramfs/root-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 -n "(Repair filesystem)" else echo $out|vinfo [ $RD_ROOTFS_FSCK -gt 0 ] && 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 [ -f "$NEWROOT"/forcefsck ] && rm -f "$NEWROOT"/forcefsck 2>/dev/null [ -f "$NEWROOT"/.autofsck ] && rm -f "$NEWROOT"/.autofsck 2>/dev/null fi