systemd 教程 / Mount 与 Automount
Mount 与 Automount
一、systemd 挂载管理概述
systemd 通过 .mount Unit 管理文件系统挂载,替代传统的 mount 命令和 /etc/fstab。
| 特性 | /etc/fstab | systemd Mount Unit |
|---|---|---|
| 配置格式 | 空格分隔文本行 | INI 风格 |
| 依赖管理 | 有限 | 完整 Unit 依赖 |
| 按需挂载 | ❌ | ✅ Automount |
| 日志集成 | ❌ | ✅ journalctl |
| 超时控制 | ❌ | ✅ TimeoutSec |
💡 提示:/etc/fstab 中的挂载项仍由 systemd-fstab-generator 自动转换为 Mount Unit,因此传统 fstab 配置与 systemd 并不冲突,两者可以共存。
# 查看所有挂载 Unit
systemctl list-units --type=mount
# 查看由 fstab 生成的 Unit
ls /run/systemd/generator/*.mount
二、Mount Unit 文件
2.1 手动创建
/etc/systemd/system/mnt-data.mount:
[Unit]
Description=Data Partition
After=blockdev@dev-disk-by\x2duuid-abc123.target
[Mount]
What=/dev/disk/by-uuid/abc123-def456
Where=/mnt/data
Type=ext4
Options=defaults,noatime
[Install]
WantedBy=multi-user.target
2.2 [Mount] 段参数
| 参数 | 说明 | 示例 |
|---|---|---|
What | 要挂载的设备/路径 | /dev/sdb1、UUID=... |
Where | 挂载点 | /mnt/data |
Type | 文件系统类型 | ext4、nfs4、cifs |
Options | 挂载选项 | defaults,noatime |
TimeoutSec | 挂载超时 | 90s |
DirectoryMode | 挂载点目录权限 | 0755 |
⚠️ 注意:Mount Unit 文件名必须与挂载点路径一致。/mnt/data → mnt-data.mount(/ 替换为 -)。
# 使用 systemd-escape 转义路径
systemd-escape --suffix=mount "/mnt/my data"
# 输出: mnt-my\x20data.mount
三、/etc/fstab 与 systemd
3.1 fstab 特殊选项
systemd 识别 fstab 中以 x-systemd. 开头的选项:
| fstab 选项 | 说明 |
|---|---|
_netdev | 等待网络就绪 |
noauto | 不在启动时自动挂载 |
nofail | 挂载失败不阻止启动 |
x-systemd.automount | 使用 Automount 按需挂载 |
x-systemd.idle-timeout=300 | 空闲 300 秒后自动卸载 |
x-systemd.requires=xxx | 指定依赖 Unit |
x-systemd.after=xxx | 指定启动顺序 |
x-systemd.device-timeout=10 | 设备等待超时 |
3.2 fstab 示例
# /etc/fstab
# 使用 UUID(推荐,设备名可能变化)
UUID=a1b2c3d4-e5f6-7890 /data ext4 defaults,noatime 0 2
# NFS 挂载
nas:/volume1/backup /mnt/nfs/backup nfs4 defaults,_netdev,x-systemd.automount,x-systemd.idle-timeout=300 0 0
# CIFS/SMB 挂载
//192.168.1.100/share /mnt/smb cifs credentials=/etc/samba/creds,uid=1000,_netdev 0 0
# 查看 UUID
blkid
lsblk -f
四、Automount 按需挂载
4.1 什么是 Automount
Automount 在首次访问挂载点时才触发实际挂载,适用于:
- 网络驱动器(NFS/CIFS)
- 移动存储设备
- 不常用的大分区
4.2 Automount Unit 文件
Automount 文件 (/etc/systemd/system/mnt-nas.automount):
[Unit]
Description=NAS Automount
[Automount]
Where=/mnt/nas
TimeoutIdleSec=300
DirectoryMode=0755
[Install]
WantedBy=multi-user.target
Mount 文件 (/etc/systemd/system/mnt-nas.mount):
[Unit]
Description=NAS Mount
After=network-online.target
Requires=network-online.target
[Mount]
What=192.168.1.100:/volume1/shared
Where=/mnt/nas
Type=nfs4
Options=defaults,rsize=1048576,wsize=1048576
[Install]
WantedBy=multi-user.target
4.3 [Automount] 段参数
| 参数 | 说明 | 默认值 |
|---|---|---|
Where | 挂载点(必须与 .mount 一致) | — |
TimeoutIdleSec | 空闲超时后自动卸载 | 0(不卸载) |
DirectoryMode | 自动创建的目录权限 | 0755 |
4.4 工作流程
系统启动
▼
mnt-nas.automount 激活(挂载点就绪,未实际挂载)
▼
用户访问 /mnt/nas/
▼
mnt-nas.mount 激活 → NFS 挂载完成
▼
300 秒无访问 → 自动卸载(回到等待状态)
# 启用 Automount
systemctl enable --now mnt-nas.automount
# 首次访问触发挂载
ls /mnt/nas/
# 查看状态
systemctl status mnt-nas.automount
systemctl status mnt-nas.mount
五、NFS 挂载
5.1 安装
# Debian/Ubuntu
sudo apt install nfs-common
# CentOS/RHEL
sudo yum install nfs-utils
5.2 Mount Unit 方式
# /etc/systemd/system/mnt-nfs-backup.mount
[Unit]
Description=NFS Backup Mount
After=network-online.target
Requires=network-online.target
[Mount]
What=192.168.1.100:/volume1/backup
Where=/mnt/nfs/backup
Type=nfs4
Options=defaults,hard,timeo=600,retrans=2,rsize=1048576,wsize=1048576
[Install]
WantedBy=multi-user.target
| NFS 选项 | 说明 |
|---|---|
hard | 硬挂载,持续重试(推荐,防数据损坏) |
soft | 软挂载,超时返回错误 |
timeo=600 | 超时时间(0.1 秒为单位) |
retrans=2 | 重试次数 |
rsize/wsize | 读/写缓冲区大小 |
⚠️ 注意:生产环境 NFS 必须使用 hard 选项。soft 可能导致数据损坏。务必添加 After=network-online.target。
六、CIFS/SMB 挂载
6.1 安装与凭据
# 安装
sudo apt install cifs-utils
# 创建凭据文件
cat > /etc/samba/creds << 'EOF'
username=myuser
password=mypassword
domain=WORKGROUP
EOF
sudo chmod 600 /etc/samba/creds
6.2 Mount Unit
# /etc/systemd/system/mnt-smb.mount
[Unit]
Description=SMB Share Mount
After=network-online.target
Requires=network-online.target
[Mount]
What=//192.168.1.100/share
Where=/mnt/smb
Type=cifs
Options=credentials=/etc/samba/creds,uid=1000,gid=1000,file_mode=0664,dir_mode=0775,vers=3.0
[Install]
WantedBy=multi-user.target
| CIFS 选项 | 说明 |
|---|---|
credentials= | 凭据文件(推荐) |
uid=/gid= | 文件所有者 |
file_mode=/dir_mode= | 权限 |
vers= | SMB 版本(2.0/3.0/3.1.1) |
iocharset=utf8 | 字符编码 |
七、加密卷挂载
7.1 LUKS 加密卷
# 首次加密
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup luksOpen /dev/sdb1 mydata
sudo mkfs.ext4 /dev/mapper/mydata
# 配置 crypttab(/etc/crypttab)
echo "mydata /dev/sdb1 none luks" | sudo tee -a /etc/crypttab
# 配置 fstab
echo "/dev/mapper/mydata /data ext4 defaults 0 2" | sudo tee -a /etc/fstab
# 查看加密设备
lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT
# 查看 crypttab 生成的 Unit
systemctl list-units 'systemd-cryptsetup*'
八、交换分区管理
# 查看 Swap 状态
swapon --show
systemctl list-units --type=swap
# 创建 swap 文件
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 配置 fstab
echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
zram 压缩 Swap
# /etc/systemd/zram-generator.conf
[zram0]
zram-size = ram / 2
compression-algorithm = zstd
swap-priority = 100
fs-type = swap
sudo systemctl daemon-reload
sudo systemctl restart [email protected]
九、生产场景
场景 1:NAS 自动挂载
# /etc/systemd/system/mnt-nas-media.automount
[Unit]
Description=NAS Media Automount
[Automount]
Where=/mnt/nas-media
TimeoutIdleSec=300
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/mnt-nas-media.mount
[Unit]
Description=NAS Media Mount
After=network-online.target
Requires=network-online.target
[Mount]
What=192.168.1.100:/volume1/media
Where=/mnt/nas-media
Type=nfs4
Options=defaults,hard,timeo=600,retrans=2
[Install]
WantedBy=multi-user.target
场景 2:开发环境共享目录
# /etc/systemd/system/mnt-dev-share.automount
[Automount]
Where=/mnt/dev-share
TimeoutIdleSec=120
# /etc/systemd/system/mnt-dev-share.mount
[Mount]
What=//devserver/projects
Where=/mnt/dev-share
Type=cifs
Options=credentials=/etc/samba/dev-creds,uid=1000,gid=1000,vers=3.0
十、常用命令速查表
| 操作 | 命令 |
|---|---|
| 列出所有挂载 | systemctl list-units --type=mount |
| 列出所有 Automount | systemctl list-units --type=automount |
| 启动挂载 | systemctl start mnt-data.mount |
| 卸载 | systemctl stop mnt-data.mount |
| 查看 UUID | blkid |
| 查看文件系统 | lsblk -f |
| 转义路径 | systemd-escape --suffix=mount "/mnt/data" |
| 查看挂载信息 | findmnt |
| NFS 共享列表 | showmount -e <server> |