系统 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