#!/bin/sh /etc/rc.common # NFSV4 init script for OpenWrt # Copyright (C) 2025 OpenWrt.org START=99 STOP=60 USE_PROCD=1 NFS_D=/var/lib/nfs RPC_PIPEFS_D=/var/lib/nfs/rpc_pipefs start_service() { logger -t "nfsd" -p notice "Starting the NFSV4 daemon" mkdir -p "$RPC_PIPEFS_D" "$NFS_D" chown nfs:nfs "$NFS_D" grep -q /proc/fs/nfsd /proc/mounts || mount -t nfsd nfsd /proc/fs/nfsd grep -q "$RPC_PIPEFS_D" /proc/mounts || mount -t rpc_pipefs sunrpc "$RPC_PIPEFS_D" procd_open_instance procd_set_param command /usr/sbin/nfsv4.exportd -f -L procd_set_param respawn procd_close_instance procd_open_instance procd_set_param command /usr/sbin/rpc.idmapd -f procd_set_param respawn procd_close_instance procd_open_instance procd_set_param command /usr/sbin/nfsdcld procd_close_instance /usr/sbin/exportfs -r procd_open_instance procd_set_param command /usr/sbin/rpc.nfsd -N 3 -V 4.0 procd_close_instance } stop_service() { /usr/sbin/rpc.nfsd 0 /usr/sbin/exportfs -au /usr/sbin/exportfs -f /usr/bin/killall nfsdcld 2>/dev/null ( sleep 1s grep -q "$RPC_PIPEFS_D" /proc/mounts && umount "$RPC_PIPEFS_D" grep -q /proc/fs/nfsd /proc/mounts && umount /proc/fs/nfsd ) & } status_service() { local n_running=0 local n_total=3 pgrep -x nfsv4.exportd > /dev/null && n_running=$((n_running + 1)) pgrep -x rpc.idmapd > /dev/null && n_running=$((n_running + 1)) pgrep -x nfsdcld > /dev/null && n_running=$((n_running + 1)) if [ "$n_running" -eq "$n_total" ]; then echo "running" return 0 elif [ "$n_running" -gt 0 ]; then echo "running ($n_running/$n_total)" return 0 else echo "not running" return 1 fi } service_triggers() { local export_dir for export_dir in $(awk 'NF && !/^#/ {print $1}' /etc/exports); do procd_add_reload_mount_trigger "$export_dir" done }