本文目录导读:

在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
使用建议
- 生产环境:推荐使用autofs或/etc/fstab方式
- 临时挂载:使用mount命令直接挂载
- 容错要求高:添加重试机制和错误检查
- 网络不稳定:使用硬挂载(hard)配合intr选项
- 性能优化:添加noatime, rsize, wsize等参数
选择哪种方式取决于你的具体需求和使用场景。