3

要使用 SGX 飞地,应用程序必须与通过/dev/isgx主机公开的 SGX 驱动程序通信。我们使用命令行选项在 Docker 容器映射/dev/isgx内部执行此类应用程序。--device

是否可以选择将设备(/dev/isgx在这种情况下)添加到由 docker 引擎启动的任何容器中?

编辑:

到目前为止,我这边的进展:

Docker 在启动之前使用containerd&runc来创建容器配置。Docker 的配置文件 /etc/docker/daemon.json有一个字段runtimes,可以在其中提供任意参数runc

[...]    
"runtimes": {
    "runc": {
        "path": "runc"
    },
    "custom": {
        "path": "/usr/local/bin/my-runc-replacement",
        "runtimeArgs": [
            "--debug"
        ]
    }
},
[...]

可悲的是,它接缝runc并没有消耗很多有用的论据,因为我的手段(runc --help并且runc spec --help<-- 创建了配置)。

我在的代码库中发现了有趣的源代码。该文件的最后一次提交说“默认情况下不创建 /dev/fuse”,这是有希望的,但会涉及构建我自己的. 我希望通过配置选项提供通用解决方案。DefaultSimpleDevicesDefaultAllowedDevicesruncrunc

4

2 回答 2

2

更新

这不是正确答案。事实证明,docker 的默认父 cgroup 已经具有开放devices权限:

/# cat /sys/fs/cgroup/devices/docker/devices.list 
a *:* rwm

在创建容器时,会为该容器创建一个具有更多限制devices规则的新 cgroup。


原始答案

我认为你可以使用 cgroups 来实现你想要的。你可以在你的主机上创建一个新的 cgroup,它允许访问/dev/isgx和启动你的 docker 守护进程--cgroup-parent=<my-cgroup-name>。你也可以cgroup-parent在你的/etc/docker/daemon.json.

如果您以前从未使用过 cgroups,那么设置起来可能并不简单。如何创建新的 cgroup 取决于您的主机系统,但您必须使用devices控制器将 cgroup 的特定设备列入白名单。

例如,一种方法是使用libcgroup's 并通过以下方式/etc/cgconfig.conf为 cgroup 授予对块设备的读/写访问权限:dockerdaemon

group dockerdaemon {
  devices {
    devices.allow = b <device-major>:<device-minor> rw
  }
}

这是一个关于如何找出块设备的主要/次要设备的示例:

sudo udevadm info -n /dev/isgx

以下是一些进一步的链接,可能会让您对整个 cgroup 主题有更多的了解:

于 2017-02-07T11:43:16.680 回答
0

您的docker-compose.yaml文件中需要类似的内容(或其他基于 Docker 的技术的类似内容:

    devices:
      - "/dev/isgx:/dev/isgx"
于 2019-07-19T23:49:54.913 回答