summaryrefslogtreecommitdiffstats
path: root/scripts/nfs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 10:29:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 10:29:49 +0000
commit1fd7da94235a7ee9cc21d25d39e6c03421ef5ab6 (patch)
treeb4cc647f3e5833b224c5fd593023397a80cca78f /scripts/nfs
parentInitial commit. (diff)
downloadinitramfs-tools-upstream.tar.xz
initramfs-tools-upstream.zip
Adding upstream version 0.140.upstream/0.140upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'scripts/nfs')
-rw-r--r--scripts/nfs166
1 files changed, 166 insertions, 0 deletions
diff --git a/scripts/nfs b/scripts/nfs
new file mode 100644
index 0000000..40c92c7
--- /dev/null
+++ b/scripts/nfs
@@ -0,0 +1,166 @@
+# 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 [ "x${NFSROOT}" = "xauto" ]; 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
+ 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
+ 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
+}