本文目录导读:

是的,脚本可以自动挂载NFS共享,以下是几种常见的方法和示例脚本:
基本的Shell脚本挂载
#!/bin/bash
# NFS服务器信息
NFS_SERVER="192.168.1.100"
NFS_SHARE="/shared/data"
MOUNT_POINT="/mnt/nfs_share"
# 检查挂载点是否存在,不存在则创建
if [ ! -d "$MOUNT_POINT" ]; then
mkdir -p "$MOUNT_POINT"
fi
# 检查是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
echo "NFS共享已挂载"
else
# 挂载NFS共享
mount -t nfs "$NFS_SERVER:$NFS_SHARE" "$MOUNT_POINT"
if [ $? -eq 0 ]; then
echo "NFS共享挂载成功"
else
echo "NFS共享挂载失败"
exit 1
fi
fi
更完善的脚本(带参数和错误处理)
#!/bin/bash
# 使用方法函数
usage() {
echo "用法: $0 -s <NFS服务器> -d <共享目录> -m <挂载点> [-o <挂载选项>]"
exit 1
}
# 默认值
MOUNT_OPTIONS="rw,hard,intr,timeo=30"
# 解析参数
while getopts "s:d:m:o:" opt; do
case $opt in
s) NFS_SERVER="$OPTARG" ;;
d) NFS_SHARE="$OPTARG" ;;
m) MOUNT_POINT="$OPTARG" ;;
o) MOUNT_OPTIONS="$OPTARG" ;;
*) usage ;;
esac
done
# 检查必要参数
if [ -z "$NFS_SERVER" ] || [ -z "$NFS_SHARE" ] || [ -z "$MOUNT_POINT" ]; then
usage
fi
# 创建挂载点
if [ ! -d "$MOUNT_POINT" ]; then
mkdir -p "$MOUNT_POINT" || { echo "创建挂载点失败"; exit 1; }
fi
# 检查NFS服务器是否可达
ping -c 1 "$NFS_SERVER" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "NFS服务器 $NFS_SERVER 不可达"
exit 1
fi
# 检查NFS服务是否运行
showmount -e "$NFS_SERVER" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "NFS服务未在服务器上运行"
exit 1
fi
# 卸载如果已经挂载
if mount | grep -q "$MOUNT_POINT"; then
umount "$MOUNT_POINT" 2>/dev/null
fi
# 挂载NFS共享
mount -t nfs -o "$MOUNT_OPTIONS" "$NFS_SERVER:$NFS_SHARE" "$MOUNT_POINT"
if [ $? -eq 0 ]; then
echo "成功挂载 $NFS_SERVER:$NFS_SHARE 到 $MOUNT_POINT"
echo "挂载选项: $MOUNT_OPTIONS"
else
echo "挂载失败"
exit 1
fi
自动挂载所有fstab中的NFS
#!/bin/bash
# 挂载所有fstab中定义的NFS共享
mount -a -t nfs
# 检查挂载状态
if [ $? -eq 0 ]; then
echo "所有NFS共享已挂载"
else
echo "部分NFS共享挂载失败"
fi
使用Python脚本
#!/usr/bin/env python3
import os
import subprocess
import sys
def mount_nfs(server, share, mount_point, options="rw,hard,intr"):
"""挂载NFS共享"""
try:
# 创建挂载点
if not os.path.exists(mount_point):
os.makedirs(mount_point)
# 构建挂载命令
cmd = f"mount -t nfs -o {options} {server}:{share} {mount_point}"
# 执行挂载
result = subprocess.run(cmd.split(), capture_output=True, text=True)
if result.returncode == 0:
print(f"成功挂载 {server}:{share} 到 {mount_point}")
return True
else:
print(f"挂载失败: {result.stderr}")
return False
except Exception as e:
print(f"错误: {e}")
return False
if __name__ == "__main__":
# 示例用法
if mount_nfs("192.168.1.100", "/shared/data", "/mnt/nfs"):
print("挂载成功")
else:
sys.exit(1)
使用expect自动处理密码(如果有)
#!/usr/bin/expect -f
# 如果NFS需要认证(通常不需要)
set timeout 30
set server "192.168.1.100"
set share "/shared/data"
set mount_point "/mnt/nfs"
spawn mount -t nfs $server:$share $mount_point
expect {
"Password:" { send "your_password\r"; exp_continue }
timeout { puts "挂载超时"; exit 1 }
eof { puts "挂载完成" }
}
添加到启动脚本
添加到rc.local
# 编辑 /etc/rc.local # 在 exit 0 之前添加: mount -t nfs 192.168.1.100:/shared/data /mnt/nfs_share
使用systemd服务
创建 /etc/systemd/system/mount-nfs.service:
[Unit] Description=Mount NFS Share After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/usr/bin/mount -t nfs 192.168.1.100:/shared/data /mnt/nfs_share RemainAfterExit=true ExecStop=/usr/bin/umount /mnt/nfs_share StandardOutput=journal [Install] WantedBy=multi-user.target
然后启用服务:
sudo systemctl enable mount-nfs.service sudo systemctl start mount-nfs.service
使用建议
-
安全性考虑:
- 不要在脚本中硬编码密码
- 使用SSH密钥认证,而不是密码
- 限制脚本的访问权限
chmod 700 script.sh
-
最佳实践:
- 使用
-o hard,intr选项提供更好的错误处理 - 添加重试逻辑
- 记录日志
- 在/etc/fstab中配置自动挂载(最简单)
- 使用
-
故障排除:
- 检查
showmount -e <server>确认共享可用 - 检查防火墙规则
- 查看日志
tail -f /var/log/messages
- 检查
选择哪种方法取决于你的具体需求:简单场景用fstab,需要复杂逻辑用shell脚本,需要更多功能用Python。