【问题标题】:How to get disk device information in container in golang?如何在golang的容器中获取磁盘设备信息?
【发布时间】:2019-08-11 11:18:37
【问题描述】:

我想用 Go 或 C++ 语言在 docker 容器中获取主机的所有磁盘设备。还需要更多信息,例如可用空间。我应该怎么做或者这可能吗?

【问题讨论】:

    标签: docker


    【解决方案1】:

    Go 或 C++ 没有什么特别的要求。您可以使用任何相关代码或库来检查 Linux 系统设备的磁盘空间或可用空间,因为 docker 容器提供的环境(通常)是 Linux 环境。

    Docker 解决方案

    docker run --privileged <image> <program> 将填充容器中的/dev 文件系统,其中包含与您的系统相关的设备文件并允许容器访问这些设备。

    用户解决方案

    您必须告诉您的用户,例如在 DockerHub 文档或错误消息中,使用

    --privileged标志

    在运行映像时,否则将无法访问系统设备。

    您应该期待您的一些知识渊博的用户会进行一些审查或怀疑。

    喜欢:为什么需要那个?

    详情

    根据Luc Juggery's blog on Medium

    --privileged 标志的用途

    使用 --privileged 标志运行容器会为容器提供所有功能,还可以访问主机的设备(/dev >文件夹下的所有内容)...

    但是,他通过从 vagrant 运行 docker 使初学者有点混淆了这个问题。

    他还警告我们:

    如果您在运行容器时使用 --privileged 标志,请确保您知道自己在做什么。

    我完全同意这一点。 使用--privileged 赋予容器修改主机的权限。

    从运行 docker 的 Linux 主机上更容易看到发生了什么。

    示例 1:

    从 Linux 主机我们将启动一个 ubuntu 容器(没有--privileged)并运行sfdisk 来查看磁盘分区,运行ls -l /dev/s* 来查看磁盘设备。它不起作用,因为容器没有权限以这种方式访问​​主机。容器的环境无法以任何方式扫描宿主机上的磁盘。

    paul@somewhere:~$ docker run -it ubuntu /bin/bash
    root@175db156cb32:/# sfdisk --list
    (blank output)
    root@175db156cb32:/# ls -l /dev/sd*
    ls: cannot access '/dev/sd*': No such file or directory
    

    示例 2:

    现在我们运行docker run --privileged

    paul@somewhere:~$ docker run --privileged -it ubuntu /bin/bash
    root@c62b42161444:/# sfdisk --list
    Disk /dev/sda: 223.6 GiB, 240057409536 bytes, 468862128 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: EE70993B-4640-4899-B142-18B89DD16CB8
    
    Device         Start       End   Sectors   Size Type
    /dev/sda1       2048    923647    921600   450M Windows recovery environment
    /dev/sda2     923648   1128447    204800   100M EFI System
    /dev/sda3    1128448   1161215     32768    16M Microsoft reserved
    /dev/sda4    1161216 467810878 466649663 222.5G Microsoft basic data
    /dev/sda5  467812352 468858879   1046528   511M Windows recovery environment
    
    
    Disk /dev/sdb: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disklabel type: gpt
    Disk identifier: 2F514662-72A3-4126-9868-40CEB6ADA416
    
    Device      Start        End    Sectors  Size Type
    /dev/sdb1      34     262177     262144  128M Microsoft reserved
    /dev/sdb2  264192 5860532223 5860268032  2.7T Microsoft basic data
    
    Partition 1 does not start on physical sector boundary.
    
    
    Disk /dev/sdc: 232.9 GiB, 250059350016 bytes, 488397168 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x299c6114
    
    Device     Boot     Start       End   Sectors   Size Id Type
    /dev/sdc1  *         2048  89843711  89841664  42.9G 83 Linux
    /dev/sdc2        89843712 480468991 390625280 186.3G 83 Linux
    /dev/sdc3       480471038 488396799   7925762   3.8G  5 Extended
    /dev/sdc5       480471040 488396799   7925760   3.8G 82 Linux swap / Solaris
    root@c62b42161444:/# ls -l /dev/sd*
    brw-rw---- 1 root disk 8,  0 Aug 11 02:43 /dev/sda
    brw-rw---- 1 root disk 8,  1 Aug 11 02:43 /dev/sda1
    brw-rw---- 1 root disk 8,  2 Aug 11 02:43 /dev/sda2
    brw-rw---- 1 root disk 8,  3 Aug 11 02:43 /dev/sda3
    brw-rw---- 1 root disk 8,  4 Aug 11 02:43 /dev/sda4
    brw-rw---- 1 root disk 8,  5 Aug 11 02:43 /dev/sda5
    brw-rw---- 1 root disk 8, 16 Aug 11 02:43 /dev/sdb
    brw-rw---- 1 root disk 8, 17 Aug 11 02:43 /dev/sdb1
    brw-rw---- 1 root disk 8, 18 Aug 11 02:43 /dev/sdb2
    brw-rw---- 1 root disk 8, 32 Aug 11 02:43 /dev/sdc
    brw-rw---- 1 root disk 8, 33 Aug 11 02:43 /dev/sdc1
    brw-rw---- 1 root disk 8, 34 Aug 11 02:43 /dev/sdc2
    brw-rw---- 1 root disk 8, 35 Aug 11 02:43 /dev/sdc3
    brw-rw---- 1 root disk 8, 37 Aug 11 02:43 /dev/sdc5
    root@c62b42161444:/# exit
    

    并且允许 docker 容器访问主机设备。

    【讨论】:

    • 谢谢,这样我可以得到所有的磁盘和分区,但是如何获得空闲空间呢?
    • @kyleqian 这是谷歌搜索的顶部项目:stackoverflow.com/questions/20108520/…
    • 感谢您的回复。在特权模式下运行容器可以列出所有磁盘,但是所有获取磁盘可用空间的方法都需要一个路径参数,就像 Go 中的 syscall.Statfs 和 C++ 中的 boost::filesystem::spaces 一样。但在容器中,我无法获取主机中哪些磁盘安装的这些路径。
    • @kyleqian 试图解除容器化造成的隔离。在这种情况下,最佳实践可能是发布本机应用程序而不是容器应用程序。如果您的主机是 Linux,您可以使用 -v /etc:/hostetc 将主机的 etc 挂载到容器上的 /hostetc 中,以便容器可以读取 /hostetc/fstab 并解析它以获取正确的设备以检查可用空间。如果您的主机是窗户,那将毫无用处。
    猜你喜欢
    • 1970-01-01
    • 2019-08-06
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多