NFS (日本語)

Wikipediaより。

Network File System (NFS) は、1984年にSun Microsystems社によって開発された分散型ファイルシステムのプロトコルで、クライアントコンピュータのユーザーが、ローカルストレージにアクセスするのと同様の方法でネットワーク上のファイルにアクセスできるようにするものです。

注意:

  • NFSは暗号化されていません。
  • NFSは暗号化されていません。機密データを扱う場合は、Kerberosや(セキュアな)VPNのような暗号化されたプロトコルを通してNFSをトンネリングしてください。
  • Sambaとは異なり、NFSはデフォルトではユーザー認証を持たず、クライアントのアクセスはIPアドレス/ホスト名によって制限されます。 anonuidanongidall_squashを併用することで、NFSv4 の idmapping を有効にするか、UID/GID を手動で上書きします(/etc/exports)。

インストール

クライアント、サーバーともに、nfs-utilsパッケージのインストールのみが必要です。

クライアントとサーバーの時計を同期させるために、時刻同期デーモンを使用することを強くお勧めします。

設定

サーバー

グローバルな設定オプションは /etc/nfs.conf で設定します。

NFSサーバーは、/etc/exports/etc/exports.d/*.exportsで定義されたエクスポートのリスト(詳細はexports(5)を参照)を必要とします。 これらの共有は、いわゆるNFSルートからの相対的なものです。 セキュリティの観点からは、NFSルートを個別のディレクトリツリーに定義し、ユーザーをそのマウントポイントに限定するのがよいでしょう。

以下の例を考えてみてください。

  1. NFS ルートは /srv/nfs です。
  2. エクスポートは /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:

    • crossmntcrossmnt でマークされたファイルシステムにマウントされているすべてのファイルシステムにクライアントがアクセスできるようになり、クライアントはすべての子エクスポートを個別にマウントする必要がなくなります。
    • crossmntnohidecrossmntnohideは子エクスポートのアドレス範囲を尊重します。
    • アスタリスク(*)を使用して任意のインターフェイスからのアクセスを許可します。

    サーバーの実行中に/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ポート111204920048rpcinfo -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.statdlockdに上記の静的ポートを使用する場合は、以下のポートも設定に追加する必要があります:

    /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を有効にする

    Tango-view-fullscreen.pngこの記事またはセクションは拡張が必要です。 ルックアップ情報、静的バインディングの例などが不足しています。 (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_idmappingY を返した場合、次の方法で有効にしてください:

    注意。 以下のパスが利用できるようにするには、カーネルモジュール nfs4nfsd がそれぞれロードされている必要があります。

    クライアント側:

    # 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 rsizewsizeの値は、サーバーへの書き込み時に使用されるバイト数です。 デフォルトでは、これらのオプションが指定されていない場合、クライアントとサーバーは、双方がサポートできる最大の値を交渉します(詳細はnfs(5)を参照)。 soft or hard NFSリクエストがタイムアウトした後のNFSクライアントの回復動作を決定します。 どちらのオプションも指定されていない場合(またはhardオプションが指定されている場合)、NFSリクエストは無期限に再試行されます。 softオプションが指定された場合、NFSクライアントは再送の再送が行われた後にNFSリクエストに失敗し、呼び出したアプリケーションにエラーを返します。

    警告。 いわゆるsoftsoftオプションは、データの整合性よりもクライアントの応答性が重要な場合にのみ使用してください。

    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を有効にしてください。
    • usersnoexec のように、さらなるオプションを意味することに注意してください。
    • オプションは、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/mysharesystemd: mnt-myshare.mount: Where= setting does not match unit name. Refusing.となります。

    What= 共有へのパス

    Where= 共有をマウントするパス

    Options= 共有のマウントオプション

    注意。

    • ネットワークマウントユニットは、Afterremote-fs-pre.targetnetwork.targetnetwork-online.targetnofailBeforeremote-fs.targetに依存するようになります。
    • noautoOptionsに追加することで、起動時に自動的にマウントされるのを防ぎます(他のユニットによって引き込まれない限り)。
    • 共有するサーバーに(IPアドレスではなく)ホスト名を使いたい場合は、nss-lookup.targetAfterに追加します。 これにより、ユニットのテスト時には発生しないブート時のマウントエラーを回避できるかもしれません。
    /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.automountTimeoutIdleSecを追加します。

    autofs を使用したマウント

    複数のマシンが NFS で接続する際に autofs を使用すると便利で、クライアントとしてもサーバーとしても使用できます。 この方法が以前の方法よりも優れている理由は、サーバーの電源が切れても、クライアントが NFS 共有を見つけられないというエラーを出さないことです。

    ヒントとコツ

    パフォーマンスの調整

    かなりの数のクライアントがいるネットワーク上で NFS を使用する場合、サーバーやネットワークの要件に応じて、デフォルトの NFS スレッドを 8 から 16 に、またはそれ以上に増やすことができます

    /etc/nfs.conf
    threads=16

    ネットワーク構成の要件を満たすために、rsizewsizeのマウントオプションを調整する必要があるかもしれません。

    最近の Linux カーネル (>2.6.18)では、NFSサーバーが許容するI/O操作のサイズ(デフォルトの最大ブロックサイズ)はRAMサイズによって異なり、最大で1M(1048576バイト)となっています。NFSクライアントがより大きなrsizewsizehttps://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

    増加したrsizewsizeのマウントオプションでマウントするには、次のようにします。

    # mount -t nfs -o rsize=32768,wsize=32768,vers=4 servername:/srv/nfs/music /mountpoint/on/client

    さらに、NFS プロトコルに違反していますが、syncsync,no_wdelayasync を設定することで、特に回転ディスク上で大幅なパフォーマンスの向上を実現できる可能性があります。

    /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-downvpn-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
    注意。 このスクリプトは、noautoautoを使用して、ディスパッチャーがこれらのマウントを管理できるようにします。

    /etc/NetworkManager/dispatcher.d/pre-downpre-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 and vpn-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 the noauto option, remove this mount option or use auto to allow the dispatcher to manage these mounts.

    Create a symlink inside /etc/NetworkManager/dispatcher.d/pre-down to catch the pre-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 and vpn-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 the noauto option, remove this mount option or use auto to allow the dispatcher to manage these mounts.

    Create a symlink inside /etc/NetworkManager/dispatcher.d/pre-down to catch the pre-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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です