我的 systemd 自动挂载正在挂载什么?

我的 systemd 自动挂载正在挂载什么?

我在 /etc/fstab 中为 sshfs 设置了 systemd 自动挂载,大致如下:

me@server:  /mount/point  fuse.sshfs  noauto,_netdev,x-systemd.automount,x-systemd.idle-timeout=900,default_permissions,allow_other,uid=josh,gid=josh,transform_symlinks  0  0

效果很好,但有时我会注意到它已挂载,尽管我最近没有访问过它。查看 journalctl,显然有一个名为的进程pool导致 systemd 不时挂载它:

$ journalctl -u mount-point.automount -n10
Mar 04 22:17:39 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 11546 (pool)
Mar 04 22:53:03 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 27856 (pool)
Mar 05 00:31:36 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 9083 (pool)
Mar 05 01:44:21 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 32232 (pool)
Mar 05 17:32:31 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 10771 (pool)
Mar 05 17:59:01 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 18662 (pool)
Mar 05 20:05:10 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 3259 (pool)
Mar 05 20:36:21 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 16858 (pool)
Mar 05 22:29:33 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 20812 (pool)
Mar 05 23:39:16 hostname systemd[1]: mount-point.automount: Got automount request for /mount/point, triggered by 15976 (pool)

我已经在系统上查找了调用的二进制文件pool,但没找到,而且目前似乎没有任何调用的进程正在pool运行。我不想一直观察 journalctl,直到出现某些东西来尝试找出这是什么,不过如果有必要,我想我会这么做的。

什么使得 systemd 安装我的自动挂载?

答案1

我猜测您的自动挂载位于 下/media

我有同样的问题,非常每隔几分钟,短暂的进程就会触发我的自动挂载。捕获有关它们的任何信息都非常具有挑战性。

为了记录,我所做的是:

  • 首先,使用以下命令启动一个 shell stdbuf -i0 -oL -eL bash
    (这将启动一个 shell,其管道缓冲已调整为立即发送每一行,而不是默认的,默认会在实际发送任何内容之前缓冲一堆输出。)
  • 在该 shell 中,运行这个可怕的命令行,我真的应该将其格式化为 .sh 文件中的正确脚本,但我没有这样做:\
journalctl --unit UNITNAME.automount -f | grep -oP '(?<=^|[^0-9])[0-9]{4,}(?=[^0-9]|$)' | while read pid; do if [ -e /proc/"$pid"/status ] ; then if [ -e proc-capture/"$pid" ] ; then echo "Already captured PID $pid. Ignoring"; else echo "Capturing $pid."; mkdir proc-capture/"$pid"; cp /proc/"$pid"/status proc-capture/"$pid"; fi; else echo "No current status for PID $pid. Skipping"; fi; done

(如果需要,可根据需要调整单元名称和输出目录。)

  • 等待。

注意:您可能需要 root 权限才能执行此操作。我总是将自己的常规用户帐户添加到组中adm,这样就可以读取系统日志内容(包括journalctl(在 Debian 上,但我猜在 Ubuntu 上也一样),因此我不需要 sudo 或任何东西来使脚本运行。

然后,每当轮询进程启动并执行其任务时,脚本都会立即将其复制/proc/<PID>/statusproc-capture/<PID>/(当前工作目录下),然后进程结束,状态文件将不复存在。该文件将告诉您 PPID,即父母所讨论的 PID。在我的例子中,父级是 systemd,它会在插入 USB 驱动器时自动挂载到 下,执行所有幕后魔法/media。可能可以配置该子系统以忽略 下的指定目录/media,但在我的例子中,只需将自动挂载从 移动/media到 即可/mnt解决问题,因此我没有进一步深入研究。

相关内容