# NFS filesystem mounting -*- shell-script -*- # shellcheck shell=sh # 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=[:][,] 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 }