引言
为了确保系统启动后 NFS 自动挂载,虽然传统的 /etc/fstab
方法仍然可用,但使用 systemd 服务可以提供更强大的网络依赖处理和故障恢复能力。笔者之前尝试使用/etc/fstab
来创建自动创建,但是因为网络原因失败后卡在命令行界面系统启动失败。
本文将详细介绍如何使用 systemd 服务创建可靠的 NFS 自动挂载解决方案。
准备工作
开始之前,请确保你具备:
- Linux 系统的 root 或 sudo 访问权限
- 已安装 NFS 客户端包(Debian/Ubuntu 上为
nfs-common
) - 与 NFS 服务器的网络连接
理解 systemd 挂载单元
Systemd 提供两种管理挂载的方式:
- 挂载单元(
.mount
文件) - 服务单元(
.service
文件)
为了实现更高级的 NFS 设置,我们将使用服务单元来获得更多的挂载过程控制。
创建 NFS 挂载服务
让我们创建一个具有网络检查和自动重试功能的服务:
sudo nano /etc/systemd/system/nfs-data-mounts.service
添加以下内容:
[Unit]
Description=挂载所有 NFS 数据共享
Requires=network-online.target
After=network-online.target
StartLimitIntervalSec=0
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c '\
until ping -c 1 -W 5 192.168.1.100 > /dev/null 2>&1; do \
echo "等待 NFS 服务器可达..."; \
exit 1; \
done && \
mount -t nfs server:/share /mnt/data || exit 1; \
mount -t nfs server:/share2 /mnt/data2 || exit 1'
ExecStop=/bin/bash -c '\
umount /mnt/data2; \
umount /mnt/data'
Restart=on-failure
RestartSec=30s
[Install]
WantedBy=multi-user.target
配置详解
让我们分析关键组件:
Unit 部分
- Requires/After:确保在启动前网络已经在线
- StartLimitIntervalSec=0:允许无限重试次数
Service 部分
- Type=oneshot:服务运行一次后退出
- RemainAfterExit=yes:成功退出后服务仍被视为活动状态
- ExecStart:在挂载前执行 ping 检查
- Restart=on-failure:失败时自动重试
- RestartSec=30s:重试间隔 30 秒
激活服务
使用以下命令启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable nfs-data-mounts
sudo systemctl start nfs-data-mounts
监控和故障排除
检查服务状态:
systemctl status nfs-data-mounts
查看日志:
journalctl -u nfs-data-mounts -f