NFS 导出是否正在被外部系统使用?

NFS 导出是否正在被外部系统使用?

系统 A(Ubuntu 服务器 18.04 LTS)导出一个目录,供系统 B、C 或 D 进行 NFS 挂载。在 A(服务器)上,有没有办法判断其他系统当前是否已挂载该目录?

目的是避免在 B、C 或 D 中的任何一个已挂载了导出的目录时关闭 A。

自动化(shell 脚本)方法是理想的,但是手动也可以。

答案1

没有直接的 NFS 实用程序(由提供nfs-utils)来列出连接到 NFS 服务器的客户端(挂载导出的目录)。

但是,如果使用 NFSv4,则在 NFS 服务器端可以轻松使用ss或识别客户端,netstat因为它对 UDP 和 TCP 仅使用 1 个端口 2049:

例子

netstat -naptule | grep :2049

root@n54l:~# exportfs -rav
exporting 192.168.1.0/24:/srv/oops

root@n54l:~# netstat -naptule | grep :2049
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      0          32620      -                 
tcp        0      0 192.168.1.123:2049      192.168.1.150:730       ESTABLISHED 0          94689      -                 
tcp6       0      0 :::2049                 :::*                    LISTEN      0          32631      -                 

ss -tuna | grep :2049

root@n54l:~# ss -tuna | grep :2049
tcp   LISTEN     0      64                0.0.0.0:2049            0.0.0.0:*
tcp   ESTAB      0      0           192.168.1.123:2049      192.168.1.150:730
tcp   LISTEN     0      64                   [::]:2049               [::]:*

我们可以看到NFS服务器192.168.1.123,有1个客户端192.168.1.150连接到它。

任一命令与文本处理(grep、cut、awk、sed 等)的组合都可以组装一个 shell 脚本,轻松实现您想要的功能。

nfsstat注意:(nfsiostat客户端)可能会提供一些见解,但结果/统计数据不是直接的。

答案2

来自 No Good Deed Goes Unpunished Department,这里有一个简单的脚本,它完成了我的任务。再次感谢 Terry Wang。调用此脚本的脚本进入一个永久的“do”循环,尝试关闭并休眠几分钟。

    #!/bin/bash

    # Check for open Samba share.
    # All shares are named "share" something,
    # so grep for "share" is usable

    smbstatus | grep -i share > /dev/nul
    samba=$?

    # Check for open NFS mount.
    # Grep for port 2049, then
    # grep that for "ESTAB"

    netstat -naptule | grep :2049 | grep ESTAB > /dev/nul
    nfs=$?

    # If either came back zero, something is active.

    if [[ $samba != 0 && $nfs != 0 ]]; then
       shutdown -h now
    fi

相关内容