怎样用脚本批量卸载NFS共享?

wen 实用脚本 2

本文目录导读:

怎样用脚本批量卸载NFS共享?

  1. 核心命令了解
  2. 方案一:卸载所有NFS挂载点(最简单、最推荐)
  3. 方案二:通过输入文件批量卸载指定列表(更可控)
  4. 方案三:卸载特定共享服务器或特定格式的目录
  5. 方案四:终极强制脚本(注意危险!)
  6. 安全建议(务必阅读)
  7. 快速一行命令(懒人版)

这是一个非常实用但也很有风险的操作,因为直接卸载NFS(网络文件系统)可能会导致正在使用该共享的应用程序崩溃或数据丢失。

为了安全且批量地卸载NFS共享,我们需要根据你的具体需求分场景处理,以下提供几种脚本方案,从最安全最强制排列。

核心命令了解

  • 常规卸载:sudo umount /mount/point
  • 强制卸载:sudo umount -l /mount/point (懒惰卸载,立即断开文件系统,清理完后才真正释放)
  • 卸载所有NFS:sudo umount -a -t nfssudo 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。


安全建议(务必阅读)

  1. 先检查占用:在批量卸载前,先运行 lsof /your/mount/pointfuser -m /your/mount/point 看看谁在用。
  2. 不要卸载根目录或系统关键目录:确保你的挂载点列表里没有 、/home/var 等,除非你确实知道它们在NFS上。
  3. 日志记录:建议在脚本中加入日志,LOG_FILE="unmount.log",将每步操作写入日志以便回溯。
  4. 测试环境验证:先在少量挂载点上测试脚本,再全量运行。

快速一行命令(懒人版)

# 列出当前所有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,根据你的具体需求和环境(是卸载特定列表,还是全部卸载)选择即可。

抱歉,评论功能暂时关闭!