You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
4.4 KiB

#!/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
15 years ago
local OLDIFS="$IFS"
IFS=,
set -- $rootopts
15 years ago
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