如何在 RancherOS 中动态挂载外部 USB 硬盘?

How can I dynamically mount an external USB hard drive in RancherOS?

如标题所述,我在裸机主机上安装了 RancherOS,并且想要 动态处理外部 USB 硬盘驱动器的 addition/removal。它应该可以作为其他容器的绑定安装来访问。

你可以这样做:

# udev_config.yml
write_files:
- path: /etc/udev/rules.d/99-media-Storage-usb-drive.rules
  container: udev
  permissions: "0644"
  owner: root
  content: |
    ATTRS{ID_FS_UUID}!="161E-5755", GOTO="media_Storage_usb_drive_exit"
    ACTION=="add", \
      RUN{program}+="/usr/bin/udev-mount.sh -o nodev,noexec,nosuid,uid=1100,gid=5000,umask=007 $root/$name /media/Storage"
    ACTION=="remove", \
      RUN{program}+="/usr/bin/udev-umount.sh /media/Storage"
    LABEL="media_Storage_usb_drive_exit"
- path: /usr/bin/udev-mount.sh
  container: udev
  permissions: "0755"
  owner: root
  content: |
    #!/bin/sh
    set -e
    eval path=${$#}
    system-docker exec console /usr/bin/mkdir -p "$path"
    system-docker exec console /usr/bin/mount "$@"
- path: /usr/bin/udev-umount.sh
  container: udev
  permissions: "0755"
  owner: root
  content: |
    #!/bin/sh
    system-docker exec console /usr/bin/umount "$@"

然后执行

sudo ros config merge -i udev_config.yml && sudo ros service restart udev

您可以拔下并插入您的设备,或者如果您知道您的 DEVNAME(见下文),例如/dev/sdb1,执行

sudo system-docker exec udev udevadm trigger --action=add /dev/sdb1

这有几个部分:

对硬件进行动态操作addition/removal

udev 是这项工作的常用工具。 udev(7) 有关于其配置的信息。

在上面的例子中:

ATTRS{ID_FS_UUID}!="161E-5755", GOTO="media_Storage_usb_drive_exit"
ACTION=="add", \
  RUN{program}+="/usr/bin/udev-mount.sh -o nodev,noexec,nosuid,uid=1100,gid=5000,umask=007 $root/$name /media/Storage"
ACTION=="remove", \
  RUN{program}+="/usr/bin/udev-umount.sh /media/Storage"
LABEL="media_Storage_usb_drive_exit"

在其他在线示例中,您可能会看到使用了 KERNEL,但这可能很脆弱,因为与外部设备关联的特定名称不是静态的。这里我们使用ID_FS_UUID。可以通过执行 udevadm info /dev/sdb1(作为示例)找到与您的设备关联的此属性和其他属性。使用不会被覆盖或可能被另一个硬盘驱动器使用的东西很重要。此命令的其他重要信息包括 DEVPATHDEVNAME.

在 RancherOS 中配置 udev

上面的配置一般会放在/etc/udev/rules.d/里,但是我们需要把它放在正确的/etc/udev/rules.d/.

在 RancherOS 中,udev 守护进程(udevd)运行s 作为容器,通过执行可见:

sudo ros service ps

sudo system-docker ps

RancherOS 系统容器可以使用 cloud-config. We can write files into system containers using the write_files 指令进行配置,如上所示。

使 console 和其他生成的 docker 容器可用。

默认情况下 udev 容器不共享 media volumes 因此我们 运行 提供的脚本在 console 系统容器内执行挂载。它具有我们需要的属性:

  • mountumount 可用(不同于 docker 容器)
  • media-volumes挂载

备注

  1. 注意 RUN 命令中的路径,因为非绝对路径将相对于 /usr/lib/udev/.
  2. 进行解析
  3. 您可以通过执行 udevadm info <device path> 查看设备的属性,例如udevadm info /dev/sdb1.
  4. 您可以在 console 容器(当您通过 ssh 进入 RancherOS 时生成的默认容器)中测试您的 udev 配置,您可以将文件放在 /etc/udev/rules.d/ 中并使用例如udevadm test --action=add <DEVPATH>
  5. udevd 的日志可通过 dmesg(根据 rancher/os#2253)访问。 udevadm --log-priority=debug 动态设置日志级别