Shell脚本如何自动挂载NFS共享

wen 实用脚本 2

本文目录导读:

Shell脚本如何自动挂载NFS共享

  1. 使用mount命令直接挂载
  2. 使用自动挂载(autofs)
  3. 使用/etc/fstab实现自动挂载
  4. 完善的NFS挂载脚本示例
  5. 添加服务检查和重试机制
  6. 使用建议

在Shell脚本中自动挂载NFS共享,通常有以下几种方法:

使用mount命令直接挂载

#!/bin/bash
# NFS服务器和共享路径
NFS_SERVER="192.168.1.100"
NFS_SHARE="/data/shared"
MOUNT_POINT="/mnt/nfs_share"
# 创建挂载点(如果不存在)
mkdir -p $MOUNT_POINT
# 挂载NFS共享
mount -t nfs $NFS_SERVER:$NFS_SHARE $MOUNT_POINT
# 检查挂载是否成功
if mountpoint -q $MOUNT_POINT; then
    echo "NFS共享已成功挂载到 $MOUNT_POINT"
else
    echo "挂载失败"
    exit 1
fi

使用自动挂载(autofs)

安装autofs

# Ubuntu/Debian
apt-get install autofs
# CentOS/RHEL
yum install autofs

配置主配置文件 /etc/auto.master

/mnt/nfs /etc/auto.nfs --timeout=60

创建NFS映射文件 /etc/auto.nfs

share1 -rw,hard,intr 192.168.1.100:/data/shared1
share2 -rw,soft,bg 192.168.1.100:/data/shared2

启动autofs服务

systemctl restart autofs
systemctl enable autofs

使用/etc/fstab实现自动挂载

修改/etc/fstab文件

168.1.100:/data/shared /mnt/nfs_share nfs defaults,_netdev 0 0

添加挂载选项说明

  • _netdev: 网络设备,在网络可用后才挂载
  • hard: 硬挂载,持续重试直到成功
  • soft: 软挂载,超时后返回错误
  • intr: 允许中断挂起的操作
  • rw: 读写权限
  • noatime: 不更新访问时间,提升性能

测试fstab配置

# 测试挂载
mount -a
# 检查是否成功
df -h | grep nfs

完善的NFS挂载脚本示例

#!/bin/bash
# 配置变量
NFS_SERVER="192.168.1.100"
NFS_SHARE="/data/shared"
MOUNT_POINT="/mnt/nfs_share"
MOUNT_OPTIONS="rw,hard,intr,noatime,vers=4"
# 日志函数
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# 检查NFS服务器是否可达
check_server() {
    ping -c 1 -W 2 $NFS_SERVER > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        log_message "错误: NFS服务器 $NFS_SERVER 不可达"
        return 1
    fi
    return 0
}
# 检查挂载点
check_mount_point() {
    if [ ! -d "$MOUNT_POINT" ]; then
        log_message "创建挂载点: $MOUNT_POINT"
        mkdir -p $MOUNT_POINT
    fi
}
# 检查是否已挂载
is_mounted() {
    mountpoint -q $MOUNT_POINT
    return $?
}
# 挂载NFS共享
mount_nfs() {
    log_message "尝试挂载 NFS: $NFS_SERVER:$NFS_SHARE -> $MOUNT_POINT"
    # 如果已经挂载,先卸载
    if is_mounted; then
        log_message "卸载现有挂载: $MOUNT_POINT"
        umount -f $MOUNT_POINT
        sleep 1
    fi
    # 挂载NFS
    mount -t nfs -o $MOUNT_OPTIONS $NFS_SERVER:$NFS_SHARE $MOUNT_POINT
    if [ $? -eq 0 ]; then
        log_message "成功: NFS已挂载到 $MOUNT_POINT"
        return 0
    else
        log_message "失败: 挂载出错"
        return 1
    fi
}
# 主函数
main() {
    # 检查是否以root运行
    if [ "$(id -u)" != "0" ]; then
        log_message "错误: 此脚本需要root权限"
        exit 1
    fi
    # 检查NFS服务器
    if ! check_server; then
        exit 1
    fi
    # 检查挂载点
    check_mount_point
    # 执行挂载
    if mount_nfs; then
        # 显示挂载结果
        df -h | grep $MOUNT_POINT
        # 测试文件读写
        if touch $MOUNT_POINT/test_write && rm $MOUNT_POINT/test_write; then
            log_message "读写测试通过"
        else
            log_message "警告: 读写测试失败"
        fi
    fi
}
# 执行主函数
main

添加服务检查和重试机制

#!/bin/bash
# 带重试的NFS挂载脚本
NFS_SERVER="192.168.1.100"
MOUNT_POINT="/mnt/nfs_share"
MAX_RETRIES=3
RETRY_INTERVAL=5
# 检查服务是否运行
check_nfs_service() {
    service nfs-common status > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        service nfs-common start
        sleep 2
    fi
}
# 重试挂载
mount_with_retry() {
    local retry=0
    while [ $retry -lt $MAX_RETRIES ]; do
        if mount -t nfs $NFS_SERVER:$NFS_SHARE $MOUNT_POINT; then
            echo "挂载成功"
            return 0
        fi
        retry=$((retry + 1))
        if [ $retry -lt $MAX_RETRIES ]; then
            echo "挂载失败,${RETRY_INTERVAL}秒后重试 (第${retry}次)"
            sleep $RETRY_INTERVAL
        fi
    done
    echo "挂载失败,已达最大重试次数"
    return 1
}
# 主执行
check_nfs_service
mount_with_retry

使用建议

  1. 生产环境:推荐使用autofs或/etc/fstab方式
  2. 临时挂载:使用mount命令直接挂载
  3. 容错要求高:添加重试机制和错误检查
  4. 网络不稳定:使用硬挂载(hard)配合intr选项
  5. 性能优化:添加noatime, rsize, wsize等参数

选择哪种方式取决于你的具体需求和使用场景。

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