如何在 Ubuntu 22.04 服务器中运行时自动挂载硬盘

如何在 Ubuntu 22.04 服务器中运行时自动挂载硬盘

我在网上找到了很多解决方案,但每个都有特定的错误或缺点,这使得它们不方便。

我想要:在 Ubuntu 22.04 服务器上,在运行时连接硬盘,不仅启动,还通过 sata 将它们自动挂载到每个硬盘的预定义目录中。如果驱动器未连接,目录为空,则没问题。但即使目录为空,也必须可访问。

我尝试过:udev 调用一个简单的挂载脚本,udev 调用 systemctl 并使用它来启动一个挂载单元,udev 并使用 systemd-mount、systemds 自动挂载单元文件。

udev 尝试全部失败。挂载脚本只返回退出代码 32。我曾怀疑这是否有效。使用 systemds 自动挂载单元文件可以自动挂载驱动器。但是一旦驱动器断开连接,尝试访问现在为空的目录会导致严重的延迟,因为会尝试自动挂载,由于请求的设备未启动而超时。

由于所需设备由于未知原因不可用,从 udev 调用 systemd 单元也会超时。此外,在使用 udev 和 systemd 时,目录名称中包含空格会很麻烦,因为单元文件的名称中需要包含路径。

我的 systemd 单元文件:

[Unit]
Description=Hotswap External Game Backups
After=blockdev@dev-disk-by\x2duuid-6ac875cb\x2d2a99\x2d494a\x2db7d9\x2d60619646155d.target

[Mount]
What=/dev/disk/by-uuid/6ac875cb-2a99-494a-b7d9-60619646155d
Where=/media/archive/public/GameBackups
Type=ext4
Options=rw,dev,exec,noauto,nouser,sync,relatime,nofail
[Unit]
Description=Automount for external Game Backups

[Automount]
Where=/media/archive/public/GameBackups

[Install]
WantedBy=multi-user.target

我的 udev 规则:

# rule for automounting hard drives
ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_UUID}="6ac875cb-2a99-494a-b7d9-60619646155d", RUN+="/usr/bin/logger --tag 'udev automount' 'Trying to MOUNT external game backups.'", RUN+="/usr/bin/systemctl start media-archive-public-GameBackups.mount"
ACTION=="remove", SUBSYSTEM=="block", ENV{ID_FS_UUID}="6ac875cb-2a99-494a-b7d9-60619646155d", RUN+="/usr/bin/logger --tag 'udev automount' 'Trying to UNMOUNT external game backups.'", RUN+="/usr/bin/systemctl stop media-archive-public-GameBackups.mount"

正如我所说,udev 超时是因为未达到单元文件的 After 目标。我可以手动启动 systemd 挂载单元,它运行正常。

我使用热插拔托架,它只需连接到 SATA 并将硬盘放入其中。

任何帮助都值得感激!

答案1

评论中提出了许多解决方案。它们可以在标题非常具体的问题中找到。这让我很难找到它们。所以我在这里提出我的解决方案。

这对我有用:

  1. 有一个 udev 规则启动 systemd 服务
  2. 让 oneshot systemd 服务启动一个脚本
  3. 让该脚本调用 mount 命令

据我所知,udev 仅在处理完所有规则后才为系统释放设备。这就是直接调用设备符号链接的操作不起作用的原因。

脚本:

#!/bin/bash

ACTION=$1
if [[ ${ACTION} == "mount" ]]; then
  /bin/mount -o rw,dev,exec,auto,nouser,sync,relatime,nofail /dev/disk/by-uuid/6ac875cb-2a99-494a-b7d9-60619646155d "/media/archive/public/Game Backups"
else
  /bin/umount "/media/archive/public/Game Backups"
fi
/usr/bin/logger -t 'game backups mount script' "${ACTION} on /media/archive/public/Game Backups"

Oneshot systemd 服务:

[Unit]
Description=Mount External Game Backups

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/mount-external-game-backups.sh mount
ExecStop=/usr/local/bin/mount-external-game-backups.sh umount

udev 规则:

ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="6ac875cb-2a99-494a-b7d9-60619646155d", RUN+="/usr/bin/logger -t 'udev mount game backups' 'starting mount script for game backups'", RUN+="/bin/systemctl start mountgamebackups.service"
ACTION=="remove", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="6ac875cb-2a99-494a-b7d9-60619646155d", RUN+="/usr/bin/logger -t 'udev mount game backups' 'stopping mount script for game backups'", RUN+="/bin/systemctl stop mountgamebackups.service"

相关内容