如何在RancherOS中动态安装外部USB硬盘?

时间:2018-02-10 23:42:10

标签: docker rancher

与标题状态一样,我将RancherOS安装在裸机主机上并且想要 动态处理外部USB硬盘的添加/删除。它应该可以作为其他容器的绑定安装来访问。

1 个答案:

答案 0 :(得分:0)

您可以这样做:

# 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

这有几个部分:

动态采取硬件添加/删除操作

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)作为容器运行,通过执行以下内容可见:

sudo ros service ps

sudo system-docker ps

可以使用cloud-config配置RancherOS系统容器。我们可以使用write_files指令将文件写入系统容器,如上所示。

使console和其他衍生的docker容器可以使用挂载。

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

  • mountumount可用(与docker容器不同)
  • media-volumes已安装

注释

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