登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux systemd.automount TimeoutIdleSec 怎样卸载空闲自动挂载点

来源:17golang原创

时间:2026-10-27 13:59:39 488浏览 收藏

可以把 TimeoutIdleSec= 写在 .automount 单元的 [Automount] 段中。达到空闲时长后,systemd 会尝试卸载对应的挂载点;它不是强制终止占用该文件系统的进程。要让配置真正生效,还必须为同一个路径提供匹配的 .mount 单元,或者在 /etc/fstab 中使用对应的 systemd 选项。

官方地址:https://www.freedesktop.org/software/systemd/man/latest/systemd.automount.html

最小可用组合是:同一路径的 .automount 负责“访问时触发”,.mount 负责“实际挂载”,TimeoutIdleSec=5min 20s 负责“空闲后尝试卸载”。如果仍有进程、工作目录或文件引用,卸载可能会被推迟。

一、先分清 .automount 和 .mount

假设目标目录是 /srv/archive。systemd 会把路径转换成 unit 名称,因此对应文件通常是:

  • srv-archive.automount:访问 /srv/archive 时触发挂载。
  • srv-archive.mount:描述真正要挂载的资源。

官方文档要求 automount 单元与挂载目录同名,并要求存在匹配的 mount 单元。这里的“空闲”针对的是 automount 管理的挂载关系,不等于某个业务线程恰好暂时没有读写。

访问请求触发 systemd automount 和 mount 单元连接到挂载资源的结构图
图1:访问自动挂载点时,.automount 单元把请求交给匹配的 .mount 单元;这是静态结构说明图,不是运行截图。

二、编写带空闲超时的原生 unit

下面用一个 NFS 资源作为示例,目标是把 server:/archive 按需挂载到 /srv/archive。如果你的资源不是 NFS,只需替换 What=、Type= 和 Options=,空闲卸载的写法不变。

创建 /etc/systemd/system/srv-archive.automount:

[Unit]
Description=按需挂载归档目录

[Automount]
# 必须与匹配的 .mount 使用同一个绝对路径
Where=/srv/archive
# 支持 5min 20s 这样的时间跨度;0 表示关闭空闲超时
TimeoutIdleSec=5min 20s

[Install]
# 开机时让 automount 单元进入系统目标
WantedBy=multi-user.target

再创建 /etc/systemd/system/srv-archive.mount:

[Unit]
Description=挂载归档资源

[Mount]
# What 是实际资源,Where 必须与 .automount 的 Where 一致
What=server:/archive
Where=/srv/archive
Type=nfs4
# _netdev 让 systemd 按网络文件系统处理,ro 只示例只读需求
Options=_netdev,ro
# 限制 mount 命令自身等待资源的时间,不是空闲卸载时间
TimeoutSec=30s

[Install]
WantedBy=multi-user.target

这里故意把网络依赖写在 .mount 单元的挂载参数中,而不是给 .automount 增加 After=network-online.target。automount 与实际挂载是两个阶段,混合依赖容易造成不必要的排序关系。

三、重新加载并启用自动挂载

写好两个文件后,先让 systemd 重新读取 unit,再只启动 automount 单元。此时目录可以存在,但实际文件系统通常要等第一次访问才挂载。

# 重新读取新增或修改过的 unit 文件
sudo systemctl daemon-reload

# 启用并立即启动自动挂载单元
sudo systemctl enable --now srv-archive.automount

# 查看自动挂载单元的状态与关键属性
systemctl status srv-archive.automount
systemctl show srv-archive.automount -p Where -p TimeoutIdleUSec

然后访问一次目录,触发对应的 mount 单元:

# 访问目录会触发 srv-archive.mount
ls -la /srv/archive

# 查看实际挂载单元和内核看到的挂载关系
systemctl status srv-archive.mount
findmnt /srv/archive

判断时要区分两个状态:srv-archive.automount 可以一直保持 active,实际的 srv-archive.mount 则会在访问后变为 active。空闲计时结束后,systemd 会对实际挂载进行卸载尝试。

四、TimeoutIdleSec 到期后为什么可能还没卸载

TimeoutIdleSec= 的语义是“空闲达到阈值后尝试卸载”,不是“到点强制卸载”。例如有进程仍把当前目录放在 /srv/archive 下,或者打开文件、子挂载和其他引用仍然存在,内核可能把挂载视为 busy,systemd 就不能按普通卸载完成。

TimeoutIdleSec 到期后按是否仍被占用分为卸载成功或保持挂载的说明图
图2:超时后 systemd 进入卸载尝试;没有占用时可卸载,仍有引用时会保持挂载,这是静态边界说明图。

可以用下面的命令查看当前是谁还在使用目录。命令本身只用于定位占用,不会替你强制结束进程。

# 查找仍打开该挂载点文件的进程
sudo lsof +D /srv/archive

# 从文件系统视角确认当前挂载是否还存在
findmnt /srv/archive

# 查看本次 unit 的日志,重点关注卸载失败或资源不可达信息
sudo journalctl -u srv-archive.mount --since "10 minutes ago"

如果你希望关闭空闲卸载,把值改为 0;官方文档规定这会禁用超时逻辑。默认值本身也是禁用,所以没有显式配置时不要期待目录会自动卸载。

五、在 /etc/fstab 中写同一类配置

如果系统更适合由 fstab 管理挂载,可以在挂载选项中使用 x-systemd.automount 与 x-systemd.idle-timeout=。为避免 fstab 的逗号分隔和空格产生歧义,下面使用不带空格的 300s。

# /etc/fstab:访问时挂载,连续空闲 300 秒后尝试卸载
server:/archive /srv/archive nfs4 _netdev,ro,x-systemd.automount,x-systemd.idle-timeout=300s 0 0

systemd 会把这条 fstab 记录转换成匹配的 mount 与 automount 单元。修改后执行:

# 让 systemd 重新生成由 fstab 派生的 unit
sudo systemctl daemon-reload

# 查看 systemd 生成的单元名称
systemctl list-unit-files 'srv-archive.*'

# 需要立即启用时启动 automount 单元
sudo systemctl start srv-archive.automount

原生 unit 适合需要把挂载参数、描述和依赖拆得更清楚的场景;fstab 更紧凑。两者不要同时为同一路径维护互相冲突的配置,否则排查时要先确认哪个配置来源实际生效。

六、常见问题

TimeoutIdleSec 写在 .mount 里为什么不生效?

它是 [Automount] 段的选项,应写在 .automount 单元中。.mount 中的 TimeoutSec= 只控制挂载命令等待多久,两者用途不同。

设置 5 分钟后是不是一定会卸载?

不是。到期后是卸载尝试;如果文件系统仍被使用,卸载会失败或暂缓。先查工作目录、打开文件和子挂载,再决定是否调整业务访问方式。

为什么访问前 mount 单元没有 active?

这是按需挂载的正常表现。先确认 automount 单元已启动,再访问 Where= 指定的目录,之后查看对应的 .mount 单元。

总结

要让 Linux 的 systemd 自动卸载空闲挂载点,关键不是给 mount 命令加一个普通超时,而是在匹配的 .automount 单元中配置 TimeoutIdleSec=,并确保同路径的 .mount 可以被访问触发。它只在空闲后发起正常卸载尝试;值为 0 或未配置时都不会启用这条超时逻辑。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>