167 lines
3.0 KiB
Bash
167 lines
3.0 KiB
Bash
# NFS filesystem mounting -*- shell-script -*-
|
|
|
|
# FIXME This needs error checking
|
|
|
|
nfs_top()
|
|
{
|
|
if [ "${nfs_top_used}" != "yes" ]; then
|
|
[ "${quiet?}" != "y" ] && log_begin_msg "Running /scripts/nfs-top"
|
|
run_scripts /scripts/nfs-top
|
|
[ "$quiet" != "y" ] && log_end_msg
|
|
fi
|
|
nfs_top_used=yes
|
|
}
|
|
|
|
nfs_premount()
|
|
{
|
|
if [ "${nfs_premount_used}" != "yes" ]; then
|
|
[ "${quiet?}" != "y" ] && log_begin_msg "Running /scripts/nfs-premount"
|
|
run_scripts /scripts/nfs-premount
|
|
[ "$quiet" != "y" ] && log_end_msg
|
|
fi
|
|
nfs_premount_used=yes
|
|
}
|
|
|
|
nfs_bottom()
|
|
{
|
|
if [ "${nfs_premount_used}" = "yes" ] || [ "${nfs_top_used}" = "yes" ]; then
|
|
[ "${quiet?}" != "y" ] && log_begin_msg "Running /scripts/nfs-bottom"
|
|
run_scripts /scripts/nfs-bottom
|
|
[ "$quiet" != "y" ] && log_end_msg
|
|
fi
|
|
nfs_premount_used=no
|
|
nfs_top_used=no
|
|
}
|
|
|
|
# parse nfs bootargs and mount nfs
|
|
nfs_mount_root_impl()
|
|
{
|
|
configure_networking
|
|
|
|
# get nfs root from dhcp
|
|
if [ "${NFSROOT}" = "auto" ]; then
|
|
# check if server ip is part of dhcp root-path
|
|
if [ "${ROOTPATH#*:}" = "${ROOTPATH}" ]; then
|
|
NFSROOT=${ROOTSERVER}:${ROOTPATH}
|
|
else
|
|
NFSROOT=${ROOTPATH}
|
|
fi
|
|
|
|
# nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
|
|
elif [ -n "${NFSROOT}" ]; then
|
|
# nfs options are an optional arg
|
|
if [ "${NFSROOT#*,}" != "${NFSROOT}" ]; then
|
|
NFSOPTS="-o ${NFSROOT#*,}"
|
|
fi
|
|
NFSROOT=${NFSROOT%%,*}
|
|
if [ "${NFSROOT#*:}" = "$NFSROOT" ]; then
|
|
NFSROOT=${ROOTSERVER}:${NFSROOT}
|
|
fi
|
|
fi
|
|
|
|
if [ -z "${NFSOPTS}" ]; then
|
|
NFSOPTS="-o retrans=10"
|
|
fi
|
|
|
|
nfs_premount
|
|
|
|
if [ "${readonly?}" = y ]; then
|
|
roflag="-o ro"
|
|
else
|
|
roflag="-o rw"
|
|
fi
|
|
|
|
# shellcheck disable=SC2086
|
|
nfsmount -o nolock ${roflag} ${NFSOPTS} "${NFSROOT}" "${rootmnt?}"
|
|
}
|
|
|
|
# NFS root mounting
|
|
nfs_mount_root()
|
|
{
|
|
nfs_top
|
|
|
|
# For DHCP
|
|
/sbin/modprobe af_packet
|
|
|
|
wait_for_udev 10
|
|
|
|
# Default delay is around 180s
|
|
delay=${ROOTDELAY:-180}
|
|
|
|
# loop until nfsmount succeeds
|
|
nfs_mount_root_impl
|
|
ret=$?
|
|
nfs_retry_count=0
|
|
while [ ${nfs_retry_count} -lt "${delay}" ] \
|
|
&& [ $ret -ne 0 ] ; do
|
|
[ "$quiet" != "y" ] && log_begin_msg "Retrying nfs mount"
|
|
sleep 1
|
|
nfs_mount_root_impl
|
|
ret=$?
|
|
nfs_retry_count=$(( nfs_retry_count + 1 ))
|
|
[ "$quiet" != "y" ] && log_end_msg
|
|
done
|
|
}
|
|
|
|
nfs_mount_fs_impl()
|
|
{
|
|
configure_networking
|
|
|
|
if [ -z "${NFSOPTS}" ]; then
|
|
NFSOPTS="-o retrans=10"
|
|
fi
|
|
|
|
nfs_premount
|
|
|
|
if [ "${readonly}" = y ]; then
|
|
roflag="-o ro"
|
|
else
|
|
roflag="-o rw"
|
|
fi
|
|
|
|
read_fstab_entry "$1"
|
|
|
|
# shellcheck disable=SC2086
|
|
nfsmount ${roflag} ${NFSOPTS} -o "${MNT_OPTS}" "$MNT_FSNAME" "${rootmnt}${MNT_DIR}"
|
|
}
|
|
|
|
nfs_mount_fs()
|
|
{
|
|
nfs_top
|
|
|
|
# For DHCP
|
|
/sbin/modprobe af_packet
|
|
|
|
wait_for_udev 10
|
|
|
|
# Default delay is around 180s
|
|
delay=${ROOTDELAY:-180}
|
|
|
|
# Don't loop here; we can't sanely check if it worked like for
|
|
# the rootfs or /etc.
|
|
nfs_mount_fs_impl "$1"
|
|
}
|
|
|
|
mountroot()
|
|
{
|
|
nfs_mount_root
|
|
}
|
|
|
|
mount_top()
|
|
{
|
|
# Note, also called directly in case it's overridden.
|
|
nfs_top
|
|
}
|
|
|
|
mount_premount()
|
|
{
|
|
# Note, also called directly in case it's overridden.
|
|
nfs_premount
|
|
}
|
|
|
|
mount_bottom()
|
|
{
|
|
# Note, also called directly in case it's overridden.
|
|
nfs_bottom
|
|
}
|