本文目录导读:

- 核心命令了解
- 方案一:卸载所有NFS挂载点(最简单、最推荐)
- 方案二:通过输入文件批量卸载指定列表(更可控)
- 方案三:卸载特定共享服务器或特定格式的目录
- 方案四:终极强制脚本(注意危险!)
- 安全建议(务必阅读)
- 快速一行命令(懒人版)
这是一个非常实用但也很有风险的操作,因为直接卸载NFS(网络文件系统)可能会导致正在使用该共享的应用程序崩溃或数据丢失。
为了安全且批量地卸载NFS共享,我们需要根据你的具体需求分场景处理,以下提供几种脚本方案,从最安全到最强制排列。
核心命令了解
- 常规卸载:
sudo umount /mount/point - 强制卸载:
sudo umount -l /mount/point(懒惰卸载,立即断开文件系统,清理完后才真正释放) - 卸载所有NFS:
sudo umount -a -t nfs或sudo umount -a -t nfs4
卸载所有NFS挂载点(最简单、最推荐)
如果你的目标是把系统中所有NFS相关的挂载点全部卸载,这是最直接的方式。
脚本1:卸载所有NFS类型挂载
#!/bin/bash
echo "开始卸载所有NFS共享..."
# 卸载所有类型为 nfs 或 nfs4 的挂载点
sudo umount -a -t nfs,nfs4
if [ $? -eq 0 ]; then
echo "所有NFS共享已成功卸载。"
else
echo "部分卸载可能失败(可能仍有进程在使用),尝试强制卸载中..."
# 另一轮强制卸载剩余未卸载的NFS
mount | grep -E "nfs|nfs4" | awk '{print $3}' | xargs -r sudo umount -l
fi
- 优点:一行命令搞定,无需知道具体路径。
- 缺点:会卸载所有NFS,包括系统重要的NFS(如某些NAS存储的根目录)。
通过输入文件批量卸载指定列表(更可控)
准备一个文本文件,列出所有你要卸载的挂载点路径,每行一个。
准备列表文件 nfs_list.txt:
/mnt/nas_data
/mnt/backup
/home/user/nfs_shared
/data/project_a
批量卸载脚本:
#!/bin/bash
LIST_FILE="nfs_list.txt"
if [ ! -f "$LIST_FILE" ]; then
echo "错误:找不到列表文件 $LIST_FILE"
exit 1
fi
echo "开始卸载列表中的NFS共享..."
while IFS= read -r mount_point; do
# 跳过空行和注释行
[[ -z "$mount_point" || "$mount_point" == \#* ]] && continue
echo "正在卸载: $mount_point"
# 先尝试常规卸载
sudo umount "$mount_point" 2>/dev/null
if [ $? -ne 0 ]; then
echo -e " \033[33m常规卸载失败,尝试强制卸载...\033[0m"
sudo umount -l "$mount_point" 2>/dev/null
if [ $? -ne 0 ]; then
echo -e " \033[31m卸载失败: $mount_point (可能不存在或权限不足)\033[0m"
else
echo -e " \033[32m强制卸载成功: $mount_point\033[0m"
fi
else
echo -e " \033[32m卸载成功: $mount_point\033[0m"
fi
done < "$LIST_FILE"
echo "批量卸载操作完成。"
卸载特定共享服务器或特定格式的目录
如果你想卸载来自某个特定服务器的所有共享,或者挂载点名称符合某个规律。
示例:卸载来自 168.1.100 的所有共享
#!/bin/bash
server_ip="192.168.1.100"
echo "正在卸载来自 $server_ip 的所有NFS共享..."
# 获取挂载该服务器的所有挂载点
mount_points=$(mount | grep "^$server_ip:" | awk '{print $3}')
if [ -z "$mount_points" ]; then
echo "没有发现来自 $server_ip 的挂载点。"
exit 0
fi
echo "即将卸载以下挂载点:"
echo "$mount_points"
# 逐个卸载
for mp in $mount_points; do
sudo umount "$mp"
# 可以加上 2>/dev/null 忽略错误,或尝试 -l
done
echo "卸载尝试完成。"
示例:卸载所有以 /nfs_ 开头的目录
#!/bin/bash
mount | grep -E "^.*:/.* /nfs_" | awk '{print $3}' | while read mp; do
sudo umount "$mp" 2>/dev/null || sudo umount -l "$mp"
done
终极强制脚本(注意危险!)
如果遇到“target is busy”错误,常规和 -l 都搞不定,你需要先找出占用进程并杀掉它们,然后再卸载。这会杀死你的应用程序!
#!/bin/bash
echo "警告:此脚本会强制终止占用NFS的进程并卸载!"
echo "你确定要这样做吗? (yes/no)"
read confirmation
if [ "$confirmation" != "yes" ]; then
echo "操作已取消。"
exit 0
fi
# 遍历所有NFS挂载点
mount | grep -E "nfs|nfs4" | awk '{print $3}' | while read mount_point; do
echo "处理挂载点: $mount_point"
# 查找并杀死占用该挂载点的进程
# 使用 fuser 命令(可能需安装)
if command -v fuser &> /dev/null; then
fuser -km "$mount_point" 2>/dev/null
sleep 1
fi
# 强制卸载
sudo umount -f "$mount_point" 2>/dev/null || sudo umount -l "$mount_point" 2>/dev/null
if [ $? -eq 0 ]; then
echo -e " \033[32m成功卸载\033[0m"
else
echo -e " \033[31m无法卸载 $mount_point (核心繁忙?)\033[0m"
fi
done
echo "操作完成。"
注意:
umount -f并非在所有Linux发行版上都支持NFS。
安全建议(务必阅读)
- 先检查占用:在批量卸载前,先运行
lsof /your/mount/point或fuser -m /your/mount/point看看谁在用。 - 不要卸载根目录或系统关键目录:确保你的挂载点列表里没有 、
/home、/var等,除非你确实知道它们在NFS上。 - 日志记录:建议在脚本中加入日志,
LOG_FILE="unmount.log",将每步操作写入日志以便回溯。 - 测试环境验证:先在少量挂载点上测试脚本,再全量运行。
快速一行命令(懒人版)
# 列出当前所有NFS
mount -t nfs,nfs4
# 卸载所有NFS(谨慎!)
sudo umount -a -t nfs,nfs4
# 如果失败了,尝试强制卸载所有NFS
mount -t nfs,nfs4 | awk '{print $3}' | sudo xargs umount -l
你可以将最合适的方案复制保存为 .sh 文件(unmount_nfs.sh),然后运行 bash unmount_nfs.sh,根据你的具体需求和环境(是卸载特定列表,还是全部卸载)选择即可。