Wikipediaより。
Network File System (NFS) は、1984年にSun Microsystems社によって開発された分散型ファイルシステムのプロトコルで、クライアントコンピュータのユーザーが、ローカルストレージにアクセスするのと同様の方法でネットワーク上のファイルにアクセスできるようにするものです。
- NFSは暗号化されていません。
- NFSは暗号化されていません。機密データを扱う場合は、Kerberosや(セキュアな)VPNのような暗号化されたプロトコルを通してNFSをトンネリングしてください。
- Sambaとは異なり、NFSはデフォルトではユーザー認証を持たず、クライアントのアクセスはIPアドレス/ホスト名によって制限されます。
anonuid
anongid
all_squash
を併用することで、NFSv4 の idmapping を有効にするか、UID/GID を手動で上書きします(/etc/exports
)。
インストール
クライアント、サーバーともに、nfs-utilsパッケージのインストールのみが必要です。
クライアントとサーバーの時計を同期させるために、時刻同期デーモンを使用することを強くお勧めします。
設定
サーバー
グローバルな設定オプションは /etc/nfs.conf
で設定します。
NFSサーバーは、/etc/exports
/etc/exports.d/*.exports
で定義されたエクスポートのリスト(詳細はexports(5)を参照)を必要とします。 これらの共有は、いわゆるNFSルートからの相対的なものです。 セキュリティの観点からは、NFSルートを個別のディレクトリツリーに定義し、ユーザーをそのマウントポイントに限定するのがよいでしょう。
以下の例を考えてみてください。
- NFS ルートは
/srv/nfs
です。 - エクスポートは
/srv/nfs/music
/mnt/music
へのバインドマウントを介して行われます。再起動してもバインドマウントを持続させるには、fstabに追加します。
/etc/fstab
/mnt/music /srv/nfs/music none bind 0 0
共有するディレクトリを追加し、アドレスの範囲で制限します。 共有するディレクトリを追加し、CIDRによるアドレスの範囲や、
/etc/exports
にマウントすることを許可されたクライアントマシンのホスト名に制限します。 e./etc/exports
/srv/nfs 192.168.1.0/24(rw,sync,crossmnt,fsid=0)/srv/nfs/music 192.168.1.0/24(rw,sync)/srv/nfs/home 192.168.1.0/24(rw,sync)/srv/nfs/home 192.192.168.1.0/24(rw,sync,nohide)/srv/nfs/public 192.168.1.0/24(ro,all_squash,insecure) desktop(rw,sync,all_squash,anonuid=99,anongid=99) # map to user/group - ここではnobody
Tip:-
crossmnt
crossmnt
でマークされたファイルシステムにマウントされているすべてのファイルシステムにクライアントがアクセスできるようになり、クライアントはすべての子エクスポートを個別にマウントする必要がなくなります。 -
crossmnt
nohide
crossmnt
nohide
は子エクスポートのアドレス範囲を尊重します。 - アスタリスク(*)を使用して任意のインターフェイスからのアクセスを許可します。
サーバーの実行中に
/etc/exports
を変更すると、変更を有効にするために再エクスポートが必要になることに注意してください。# exportfs -arv
現在読み込まれているエクスポートの状態をさらに詳しく見るには、次のように使用します:
# exportfs -v
利用可能なすべてのオプションの詳細については、exports(5)を参照してください。
ヒント: ip2cidrはIPレンジを正しい構造のCIDR仕様に変換するツールです。注意: エクスポート対象がtmpfsファイルシステムの場合は、fsid=1
オプションが必要です。サーバーの起動
nfs-server.service
を起動して有効にします。警告。 NFS を提供するハード依存 (rpc-gssd.service
) は、乱数生成器のプールが十分に初期化されるまで待機するため、起動プロセスが遅れる可能性があります。 この現象は、ヘッドレスサーバーで顕著に見られます。 このようなシナリオでは、Rng-tools (TPM がサポートされている場合) や Haveged などのユーティリティを使用してエントロピー プールを生成することを強くお勧めします。注意: ZFS 共有をエクスポートする場合は、zfs-share.service
を開始/有効にしてください。 これがないと、再起動後にZFS共有がエクスポートされなくなります。 ZFS#NFSを参照してください。NFSをインターフェイス/IPに制限する
デフォルトでは、
nfs-server.service
/etc/exports
に関係なく、すべてのネットワークインターフェイス上の接続をリッスンします。/etc/nfs.conf
host=192.168.1.123# Alternatively, use the hostname.# host=myhostname
変更をすぐに適用するには、
nfs-server.service
を再起動してください。ファイアウォールの設定
ファイアウォール経由でのアクセスを可能にするために、デフォルトの設定を使用する場合、TCPおよびUDPポート
111
2049
20048
rpcinfo -p
を使用してください。$ rpcinfo -p | grep nfs
100003 3 tcp 2049 nfs100003 4 tcp 2049 nfs100227 3 tcp 2049 nfs_acl
NFSv4を使用している場合、TCPポート
rpcinfo -p
を開く必要があります。 TCPポート2049
が開いていることを確認してください。 他のポートのオープンは必要ありません。/etc/iptables/iptables.rules
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT
古いバージョンのNFSを使用している場合は、他のポートが開いていることを確認してください。
# iptables -A INPUT -p tcp -m tcp --dport 111 -j ACCEPT# iptables -A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT# iptables -A INPUT -p tcp -m tcp --dport 20048 -j ACCEPT# iptables -A INPUT -p udp -m udp --dport 111 -j ACCEPT# iptables -A INPUT -p udp -m udp --dport 2049 -j ACCEPT# iptables -A INPUT -p udp -m udp --dport 20048 -j ACCEPT
システムの起動時に毎回この設定をロードするには、
/etc/iptables/iptables.rules
を編集して次の行を含めます。ルール-A INPUT -p tcp -m tcp --dport 111 -j ACCEPT-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT-A INPUT -p tcp -m tcp --dport 20048 -j ACCEPT-A INPUT -.p udp -m udp --dport 111 -j ACCEPT-A INPUT -p udp -m udp --dport 2049 -j ACCEPT-A INPUT -p udp -m udp --dport 20048 -j ACCEPT
これまでのコマンドは、実行することで保存できます。
# iptables-save > /etc/iptables/iptables.rules
警告。 このコマンドは、現在の iptables の開始設定を、現在の iptables の設定で上書きします!NFSv3を使用し、
rpc.statd
lockd
に上記の静的ポートを使用する場合は、以下のポートも設定に追加する必要があります:/etc/iptables/iptables.ルール
A INPUT -p tcp -m tcp --dport 32765 -j ACCEPT-A INPUT -p tcp -m tcp --dport 32803 -?j ACCEPT-A INPUT -p udp -m udp --dport 32765 -j ACCEPT-A INPUT -p udp -m udp --dport 32803 -j ACCEPT
変更を適用するには、以下の手順に従います。
iptables.service
を再起動します。NFSv4のidmappingを有効にする
この記事またはセクションは拡張が必要です。 ルックアップ情報、静的バインディングの例などが不足しています。 (Talk:NFS#で議論)
注意:- NFSv4 idmappingは、デフォルトの
sec=sys
マウントオプションでは動作しません。 - NFSv4 idmapping はクライアントとサーバーの両方で有効にする必要があります。
- 別の方法として、クライアントとサーバーの両方でユーザーとグループの ID (UID と GID) が一致するようにすることもできます。
-
nfs-idmapd.service
の有効化/起動は、新しい id マッパーに置き換えられているため、必要ないはずです:
# dmesg | grep id_resolver
NFS: id_resolverキータイプの登録 キータイプ id_resolver registered
NFSv4プロトコルでは、ローカルシステムのUIDとGIDの値を
user@domain
という形式の文字列としてワイヤで表現します。 UIDを文字列に、文字列をUIDに変換するプロセスは、IDマッピングと呼ばれています。idmapdが動作していても、完全には有効になっていない場合があります。 クライアント/サーバー上で
/sys/module/nfs/parameters/nfs4_disable_idmapping
/sys/module/nfsd/parameters/nfs4_disable_idmapping
Y
を返した場合、次の方法で有効にしてください:注意。 以下のパスが利用できるようにするには、カーネルモジュールnfs4
nfsd
がそれぞれロードされている必要があります。クライアント側:
# echo "N" | tee /sys/module/nfs/parameters/nfs4_disable_idmapping
サーバー側:
# echo "N" | tee /sys/module/nfsd/parameters/nfs4_disable_idmapping
この変更を永続的なものにするために、モジュールオプションとして設定します。例:
/etc/modprobe.d/nfsd.conf
options nfs nfs4_disable_idmapping=0options nfsd nfs4_disable_idmapping=0
idmappingを完全に使用するには、サーバーとクライアントの両方で
/etc/idmapd.conf
にドメインが構成されていることを確認してください。/etc/idmapd.conf
# 以下はローカルのNFSv4ドメイン名に設定する必要があります# デフォルトはホストのDNSドメイン名です。Domain = domain.tld
詳細はこちら
Client
NFS4をKerberosで使用する予定のユーザーは、
nfs-client.target
を起動して有効にする必要があります。手動マウント
NFSv3では、サーバーのエクスポートされたファイルシステムを表示するためにこのコマンドを使用します。
$ showmount -e servername
NFSv4の場合は、NFSルートディレクトリをマウントし、利用可能なマウントを探します:
# mount server:/ /mountpoint/on/client
そして、サーバーのNFSエクスポートルートを省略してマウントします。
# mount -t nfs -o vers=4 servername:/music /mountpoint/on/client
マウントに失敗した場合は、サーバーのエクスポート ルートを含めてみます (Debian/RHEL/SLES では必要ですが、一部のディストリビューションでは
-t nfs
-t nfs4
が必要です)。# mount -t nfs -o vers=4 servername:/srv/nfs/music /mountpoint/on/client
注意: サーバー名は有効なホスト名である必要があります (IP アドレスだけではありません)。/etc/fstabを使用してマウントする
fstabを使用することは、常にオンになっているサーバーで、クライアントが起動したときにNFS共有が利用できる場合に便利です。
/etc/fstab
ファイルを編集し、設定を反映した適切な行を追加します。 ここでも、サーバーのNFSエクスポートルートは省略しています。/etc/fstab
servername:/music /mountpoint/on/client nfs defaults,timeo=900,retrans=5,_netdev0 0
Note: マウントオプションの詳細については nfs(5)と mount(8)を参照してください。考慮すべき追加のマウントオプション:
rsizeとwsize
rsize
wsize
の値は、サーバーへの書き込み時に使用されるバイト数です。 デフォルトでは、これらのオプションが指定されていない場合、クライアントとサーバーは、双方がサポートできる最大の値を交渉します(詳細はnfs(5)を参照)。 soft or hard NFSリクエストがタイムアウトした後のNFSクライアントの回復動作を決定します。 どちらのオプションも指定されていない場合(またはhard
オプションが指定されている場合)、NFSリクエストは無期限に再試行されます。soft
オプションが指定された場合、NFSクライアントは再送の再送が行われた後にNFSリクエストに失敗し、呼び出したアプリケーションにエラーを返します。警告。 いわゆるsoft
soft
オプションは、データの整合性よりもクライアントの応答性が重要な場合にのみ使用してください。timeo の値は、RPCのタイムアウト後に送信を再送信するまでの待ち時間を10分の1秒単位で指定します。 NFS over TCPのデフォルト値は600(60秒)です。 最初のタイムアウトの後、タイムアウト値は最大60秒間、またはメジャータイムアウトが発生するまで、再試行のたびに2倍になります。 遅いサーバーや混雑したネットワークに接続する場合は、このタイムアウト値を大きくすることで、より良い安定性を得ることができます。 retrans NFSクライアントがさらなる回復アクションを試みる前に、リクエストを再試行する回数です。
retrans
オプションが指定されていない場合、NFS クライアントは各要求を 3 回試行します。 NFS クライアントは retrans の再試行後に「サーバーが応答しません」というメッセージを生成し、その後さらに回復を試みます (ハードマウントオプションが有効であるかどうかによって異なります)。 _netdev_netdev
オプションは、共有をマウントする前にネットワークが立ち上がるまで待つようにシステムに指示します – systemd は NFS のためにこれを想定しています。注意: 6 番目のフィールド (fs_passno
) をゼロ以外の値に設定すると、systemd の automount が決して起こらないチェックを待っているときにハングアップするなど、予期しない動作を引き起こす可能性があります。systemd で /etc/fstab を使用してマウントする
別の方法として、x-systemd.automount オプションを使って、アクセス時にファイルシステムをマウントする方法もあります:
/etc/fstab
servername:/home /mountpoint/on/client nfs _netdev,noauto,x-systemd.automount,x-systemd.mount-timeout=10,timeo=14,x-systemd.idle-timeout=1min 0 0
systemdにfstabの変更を認識させるには、systemdをリロードし、
remote-fs.target
.ヒント:-
noauto
のマウントオプションは、アクセスされるまでNFS共有をマウントしません。auto
を使用すると、すぐに利用可能になります。
ネットワークが稼働していない/利用できないためにマウントに失敗する問題が発生した場合は、NetworkManager-wait-online.service
を有効にしてください。 -
users
noexec
のように、さらなるオプションを意味することに注意してください。 - オプションは、1 分間使用しないと NFS 共有を自動的にアンマウントします。
- NFS が原因でシャットダウン/再起動に時間がかかる場合は、
NetworkManager-wait-online.service
を有効にして、NFS ボリュームがアンマウントされる前に NetworkManager が終了しないようにします。 - systemd 内での順序付けサイクルにつながるため、
x-systemd.requires=network-online.target
マウント オプションを追加しないでください。 systemd はnetwork-online.target
_netdev
マウントのユニットに自動的に追加します。 -
nocto
オプションを使用すると、読み取り専用のマウントのパフォーマンスが向上する場合がありますが、サーバー上のデータが時々しか変更されない場合にのみ使用する必要があります。
systemdの単位として
/etc/systemd/system
.mount
/mnt/myshare
systemd: mnt-myshare.mount: Where= setting does not match unit name. Refusing.
となります。What=
共有へのパスWhere=
共有をマウントするパスOptions=
共有のマウントオプション注意。- ネットワークマウントユニットは、
After
remote-fs-pre.target
network.target
network-online.target
nofail
Before
remote-fs.target
に依存するようになります。 -
noauto
Options
に追加することで、起動時に自動的にマウントされるのを防ぎます(他のユニットによって引き込まれない限り)。 - 共有するサーバーに(IPアドレスではなく)ホスト名を使いたい場合は、
nss-lookup.target
After
に追加します。 これにより、ユニットのテスト時には発生しないブート時のマウントエラーを回避できるかもしれません。
/etc/systemd/system/mnt-myshare.mount
Description=Mount Share at bootWhat=172.16.24.192:/mnt/myshareWhere=/mnt/myshareOptions=Type=nfsTimeoutSec=30WantedBy=multi-user.target
Tip: システムに到達できない場合は、ForceUnmount=true
に追加することで、共有を(強制的に)アンマウントできるようになります。
を使用するには、このユニットを起動し、システム起動時に実行できるようにします。
automount
共有を自動的にマウントするには、次のautomountユニットを使用できます。automount
Description=Automount myshareWhere=/mnt/myshareWantedBy=multi-user.target
mnt-myshare.automount
TimeoutIdleSec
を追加します。autofs を使用したマウント
複数のマシンが NFS で接続する際に autofs を使用すると便利で、クライアントとしてもサーバーとしても使用できます。 この方法が以前の方法よりも優れている理由は、サーバーの電源が切れても、クライアントが NFS 共有を見つけられないというエラーを出さないことです。
ヒントとコツ
パフォーマンスの調整
かなりの数のクライアントがいるネットワーク上で NFS を使用する場合、サーバーやネットワークの要件に応じて、デフォルトの NFS スレッドを 8 から 16 に、またはそれ以上に増やすことができます
/etc/nfs.conf
threads=16
ネットワーク構成の要件を満たすために、
rsize
wsize
のマウントオプションを調整する必要があるかもしれません。最近の Linux カーネル (>2.6.18)では、NFSサーバーが許容するI/O操作のサイズ(デフォルトの最大ブロックサイズ)はRAMサイズによって異なり、最大で1M(1048576バイト)となっています。NFSクライアントがより大きな
rsize
wsize
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/5.8_Technical_Notes/Known_Issues-kernel.htmlItを参照してください。 nfsdを起動する前に/proc/fs/nfsd/max_block_size
に書き込むことで、サーバーが許可するデフォルトの最大ブロックサイズを変更することができます。 たとえば、次のコマンドは、以前のデフォルトの iosize である 32k を復元します:# echo 32768 > /proc/fs/nfsd/max_block_size
変更を恒久的なものにするには、systemd-tmpfile を作成します:
/etc/tmpfiles.d/nfsd-block-size.conf
w /proc/fs/nfsd/max_block_size - - - 32768
増加した
rsize
wsize
のマウントオプションでマウントするには、次のようにします。# mount -t nfs -o rsize=32768,wsize=32768,vers=4 servername:/srv/nfs/music /mountpoint/on/client
さらに、NFS プロトコルに違反していますが、
sync
sync,no_wdelay
async
を設定することで、特に回転ディスク上で大幅なパフォーマンスの向上を実現できる可能性があります。/etc/exports
/srv/nfs 192.168.1.0/24(rw,async,crossmnt,fsid=0)/srv/nfs/music 192.168.1.0/24(rw,async)
自動マウント処理
このトリックは、ワイヤレスネットワークや信頼性の低いネットワーク上のNFS共有に役立ちます。 NFS ホストが到達できなくなった場合、NFS 共有はアンマウントされ、
hard
マウント オプションを使用する際のシステムのハングアップを防ぐことができます。NFS マウント ポイントが fstab で正しく示されていることを確認してください:
/etc/fstab
lithium:/mnt/data /mnt/data nfs noauto 0 0lithium:/var/cache/pacman /var/cache/pacmannfs noauto 0 0
注意事項:- この作業を行うには、fstabにIPアドレスではなくホスト名を入力してください。
- 非 root ユーザーで NFS 共有をマウントするには、
users
オプションを追加する必要があります。 noauto
mount オプションは、ブート時に自動的に共有をマウントしないように systemd に指示しますが、そうしないとブートプロセスがストールしてしまう可能性があります。
cronやsystemd/TimersがICMP pingを使用してNFSホストが到達可能かどうかを確認するために使用する
auto_share
スクリプトを作成します。/usr/local/bin/auto_share
#!/bin/bashfunction net_umount { umount -l -f $1 &>/dev/null}function net_mount { mountpoint -q $1 || mount $1}NET_MOUNTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' /etc/fstab | tr -s " ") | while IFS= read -r linedo SERVER=$(echo $line | cut -f1 -d":") MOUNT_POINT=$(echo $line | cut -f2 -d" ") # サーバーが既にテストされているかチェック if }" =~ "${SERVER}" ]]; then # サーバーは起動しているので、シェアがマウントされているか確認する net_mount $MOUNT_POINT elif }" =~ "${SERVER}" ]]; then # サーバーに到達できませんでした、共有をアンマウントしてください net_umount $MOUNT_POINT else # サーバーに到達できるかどうか確認してください ping -c 1 "${SERVER}" &>/dev/null if ; then server_notok}]=$SERVER # サーバーに到達できませんでした、共有をアンマウントしてください net_umount $MOUNT_POINT else server_ok}]=$SERVER # サーバーは起動しています、共有がマウントされていることを確認してください net_mount $MOUNT_POINT fi fidone
注意。 ICMP ping の代わりに TCP プローブを使用してテストした場合 (NFS4 のデフォルトは tcp ポート 2049)、上記のスクリプトの# Check if the server is reachableping -c 1 "${SERVER}" &>/dev/null
を次のように置き換えます:
# Check if the server is reachabletimeout 1 bash -c ": < /dev/tcp/${SERVER}/2049"
auto_share
スクリプトで。スクリプトが実行可能であることを確認します:
# chmod +x /usr/local/bin/auto_share
次に、Xごとに実行されるようにスクリプトを設定します(以下の例では1分ごとに実行)。
Cron
# crontab -e
* * * /usr/local/bin/auto_share
systemd/Timers
/etc/systemd/system/auto_share.timer
Description=NFSシェアを1分ごとに自動マウントOnCalendar=*-*-* *:*:00WantedBy=timers.target
/etc/systemd/system/auto_share.service
Description=Automount NFS sharesAfter=syslog.target network.targetType=oneshotExecStart=/usr/local/bin/auto_shareWantedBy=multi-user.target
最後に、
auto_share.timer
を有効にして起動します。NetworkManagerのディスパッチャを使用する
NetworkManagerは、ネットワークの状態変化時にスクリプトを実行するように設定することもできます。
ネットワークの状態が変化したときに共有をマウントする最も簡単な方法は、
auto_share
スクリプトをシンボリックリンクすることです:# ln -s /usr/local/bin/auto_share /etc/NetworkManager/dispatcher.d/30-nfs.sh
しかし、その特別なケースでは、アンマウントはネットワーク接続がすでに無効になった後にのみ行われます。
以下のスクリプトは、
pre-down
vpn-pre-down
イベントをリッスンすることで、関連するネットワーク接続が無効になる前に、NFS共有を安全にアンマウントし、スクリプトを実行可能にします:/etc/NetworkManager/dispatcher.d/30-nfs.sh
#!/bin/bash# ターミナルで "nmcli con show "で接続UUIDを確認します。 # NetworkManagerのすべての接続タイプがサポートされています: 無線、VPN、有線...WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9 "if ]; then # スクリプトパラメータ $1: NetworkManagerの接続名、使用しない # スクリプトパラメータ $2: dispatched event case "$2" in "up") mount -a -t nfs4,nfs ;; "pre-down");& "vpn-pre-down") umount -l -a -t nfs4,nfs -f >/dev/null ;; esacfi
注意。 このスクリプトは、noauto
auto
を使用して、ディスパッチャーがこれらのマウントを管理できるようにします。/etc/NetworkManager/dispatcher.d/pre-down
pre-down
イベントをキャッチします:# ln -s /etc/NetworkManager/dispatcher.d/30-nfs.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-nfs.sh
トラブルシューティング
専用の記事「NFS/トラブルシューティング」があります。
その他
- NFS 共有の自動検出を可能にする Zeroconf の実装である Avahi も参照してください。
- HOWTO: Diskless network boot NFS root
- Microsoft Services for Unix NFS Client info
- NFS on Snow Leopard
- http://chschneider.eu/linux/server/nfs.shtml
- How to do Linux NFS Performance Tuning and Optimization
- Linux: NFS パフォーマンスのチューニング
̫⃝ | while IFS= read -r linedo SERVER=$(echo $line | cut -f1 -d”:”) MOUNT_POINT=$(echo $line | cut -f2 -d” “) # Check if server already tested if }” =~ “${SERVER}” ]]; then # The server is up, make sure the share are mounted net_mount $MOUNT_POINT elif }” =~ “${SERVER}” ]]; then # The server could not be reached, unmount the share net_umount $MOUNT_POINT else # Check if the server is reachable ping -c 1 “${SERVER}” &>/dev/null if ; then server_notok}]=$SERVER # The server could not be reached, unmount the share net_umount $MOUNT_POINT else server_ok}]=$SERVER # The server is up, make sure the share are mounted net_mount $MOUNT_POINT fi fidone
Note: Test using a TCP probe instead of ICMP ping (default is tcp port 2049 in NFS4) then replace the line:# Check if the server is reachableping -c 1 "${SERVER}" &>/dev/null
with:
# Check if the server is reachabletimeout 1 bash -c ": < /dev/tcp/${SERVER}/2049"
in the
auto_share
script above.Make sure the script is executable:
# chmod +x /usr/local/bin/auto_share
Next check configure the script to run every X, in the examples below this is every minute.
Cron
# crontab -e
* * * * * /usr/local/bin/auto_share
systemd/Timers
/etc/systemd/system/auto_share.timer
Description=Automount NFS shares every minuteOnCalendar=*-*-* *:*:00WantedBy=timers.target
/etc/systemd/system/auto_share.service
Description=Automount NFS sharesAfter=syslog.target network.targetType=oneshotExecStart=/usr/local/bin/auto_shareWantedBy=multi-user.target
Finally, enable and start
auto_share.timer
.Using a NetworkManager dispatcher
NetworkManager can also be configured to run a script on network status change.
The easiest method for mount shares on network status change is to symlink the
auto_share
script:# ln -s /usr/local/bin/auto_share /etc/NetworkManager/dispatcher.d/30-nfs.sh
However, in that particular case unmounting will happen only after the network connection has already been disabled, which is unclean and may result in effects like freezing of KDE Plasma applets.
The following script safely unmounts the NFS shares before the relevant network connection is disabled by listening for the
pre-down
andvpn-pre-down
events, make the script is executable:/etc/NetworkManager/dispatcher.d/30-nfs.sh
#!/bin/bash# Find the connection UUID with "nmcli con show" in terminal.# All NetworkManager connection types are supported: wireless, VPN, wired...WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9"if ]; then # Script parameter $1: NetworkManager connection name, not used # Script parameter $2: dispatched event case "$2" in "up") mount -a -t nfs4,nfs ;; "pre-down");& "vpn-pre-down") umount -l -a -t nfs4,nfs -f >/dev/null ;; esacfi
Note: This script ignores mounts with thenoauto
option, remove this mount option or useauto
to allow the dispatcher to manage these mounts.Create a symlink inside
/etc/NetworkManager/dispatcher.d/pre-down
to catch thepre-down
events:# ln -s /etc/NetworkManager/dispatcher.d/30-nfs.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-nfs.sh
Troubleshooting
There is a dedicated article NFS/Troubleshooting.
See also
- See also Avahi, a Zeroconf implementation which allows automatic discovery of NFS shares.
- HOWTO: Diskless network boot NFS root
- Microsoft Services for Unix NFS Client info
- NFS on Snow Leopard
- http://chschneider.eu/linux/server/nfs.shtml
- How to do Linux NFS Performance Tuning and Optimization
- Linux: Tune NFS Performance
bprintf %s “$NET_MOUNTS” | while IFS= read -r linedo SERVER=$(echo $line | cut -f1 -d”:”) MOUNT_POINT=$(echo $line | cut -f2 -d” “) # Check if server already tested if }” =~ “${SERVER}” ]]; then # The server is up, make sure the share are mounted net_mount $MOUNT_POINT elif }” =~ “${SERVER}” ]]; then # The server could not be reached, unmount the share net_umount $MOUNT_POINT else # Check if the server is reachable ping -c 1 “${SERVER}” &>/dev/null if ; then server_notok}]=$SERVER # The server could not be reached, unmount the share net_umount $MOUNT_POINT else server_ok}]=$SERVER # The server is up, make sure the share are mounted net_mount $MOUNT_POINT fi fidone
Note: Test using a TCP probe instead of ICMP ping (default is tcp port 2049 in NFS4) then replace the line:# Check if the server is reachableping -c 1 "${SERVER}" &>/dev/null
with:
# Check if the server is reachabletimeout 1 bash -c ": < /dev/tcp/${SERVER}/2049"
in the
auto_share
script above.Make sure the script is executable:
# chmod +x /usr/local/bin/auto_share
Next check configure the script to run every X, in the examples below this is every minute.
Cron
# crontab -e
* * * * * /usr/local/bin/auto_share
systemd/Timers
/etc/systemd/system/auto_share.timer
Description=Automount NFS shares every minuteOnCalendar=*-*-* *:*:00WantedBy=timers.target
/etc/systemd/system/auto_share.service
Description=Automount NFS sharesAfter=syslog.target network.targetType=oneshotExecStart=/usr/local/bin/auto_shareWantedBy=multi-user.target
Finally, enable and start
auto_share.timer
.Using a NetworkManager dispatcher
NetworkManager can also be configured to run a script on network status change.
The easiest method for mount shares on network status change is to symlink the
auto_share
script:# ln -s /usr/local/bin/auto_share /etc/NetworkManager/dispatcher.d/30-nfs.sh
However, in that particular case unmounting will happen only after the network connection has already been disabled, which is unclean and may result in effects like freezing of KDE Plasma applets.
The following script safely unmounts the NFS shares before the relevant network connection is disabled by listening for the
pre-down
andvpn-pre-down
events, make the script is executable:/etc/NetworkManager/dispatcher.d/30-nfs.sh
#!/bin/bash# Find the connection UUID with "nmcli con show" in terminal.# All NetworkManager connection types are supported: wireless, VPN, wired...WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9"if ]; then # Script parameter $1: NetworkManager connection name, not used # Script parameter $2: dispatched event case "$2" in "up") mount -a -t nfs4,nfs ;; "pre-down");& "vpn-pre-down") umount -l -a -t nfs4,nfs -f >/dev/null ;; esacfi
Note: This script ignores mounts with thenoauto
option, remove this mount option or useauto
to allow the dispatcher to manage these mounts.Create a symlink inside
/etc/NetworkManager/dispatcher.d/pre-down
to catch thepre-down
events:# ln -s /etc/NetworkManager/dispatcher.d/30-nfs.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-nfs.sh
Troubleshooting
There is a dedicated article NFS/Troubleshooting.
See also
- See also Avahi, a Zeroconf implementation which allows automatic discovery of NFS shares.
- HOWTO: Diskless network boot NFS root
- Microsoft Services for Unix NFS Client info
- NFS on Snow Leopard
- http://chschneider.eu/linux/server/nfs.shtml
- How to do Linux NFS Performance Tuning and Optimization
- Linux: Tune NFS Performance
-