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

标签 docker rancher

就像标题一样,我在裸机主机上安装了 RancherOS 并且想要
动态处理外部 USB 硬盘的添加/移除。它应该可以作为其他容器的绑定(bind)挂载访问。

最佳答案

你可以这样做:

# 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 .

配置 udev在 RancherOS 中。

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

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

sudo ros service ps

或者

sudo system-docker ps

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

console 提供挂载和其他衍生的 docker 容器。

默认情况下 udev容器不共享 media volumes所以我们运行提供的脚本,这些脚本在 console 中执行 mount系统容器。它具有我们需要的属性:
  • mountumount可用(与 docker 容器不同)
  • media-volumes安装

  • 笔记
  • 小心 RUN 中的路径命令,因为非绝对路径将相对于 /usr/lib/udev/ 进行解析.
  • 您可以通过执行 udevadm info <device path> 查看设备的属性例如udevadm info /dev/sdb1 .
  • 您可以测试您的udev console 中的配置容器(当你 ssh 进入 RancherOS 时生成的默认容器)你可以将文件放在 /etc/udev/rules.d/并使用例如测试udevadm test --action=add <DEVPATH>
  • udevd 的日志可通过 dmesg 访问(根据 rancher/os#2253 )。 udevadm --log-priority=debug动态设置日志级别
  • 关于docker - 如何在 RancherOS 中动态挂载外部 USB 硬盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48726784/

    相关文章:

    deployment - 将主机目录挂载到 Wildfly 部署目录

    linux - CronJob 无法启动 docker 容器

    php - Rancher sidekick php-fpm端口映射

    hadoop - Hadoop集群有docker编排吗

    kubernetes - 不允许使用带有rancher 2.2.8的traefik v2.0标签

    docker - Kubernetes 1.17.2 Rancher 2.3.5 CreateContainerConfigError : stat no such file or directory but the directory IS there

    docker - 主机是否可以通过Docker容器上运行的KDC进行身份验证?

    laravel - 用于存储 jpg 的 Docker 卷使用情况

    docker - 如何降级docker-machine和boot2docker使用的docker版本?

    ubuntu - Docker Rancher /代理无法启动