繁体   English   中英

如何在golang中获取容器中的磁盘设备信息?

[英]How to get disk device information in container in golang?

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

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

Docker 解决方案

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

用户解决方案

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

--privileged标志

运行您的图像时,否则将无法访问系统设备。

您应该期待一些知识渊博的用户的审查或冷嘲热讽。

比如:为什么需要那个?

细节

根据Luc Juggery 在 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 容器访问主机设备。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM