gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:24:22 25 4
gpt4 key购买 nike

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

最佳答案

Go 或 C++ 没有什么特别的要求。您可以使用任何相关代码或库来检查 Linux 系统设备的磁盘空间或可用空间,因为 docker 容器提供的环境(通常)是 Linux 环境。
docker 解决方案docker run --privileged <image> <program>将填充 /dev容器中的文件系统,其中包含与您的系统相关的设备文件,并允许容器访问这些设备。
用户解决方案
您将不得不告诉您的用户,例如在 DockerHub 文档或错误消息中,使用--privileged旗帜
运行镜像时,否则将无法访问系统设备。
您应该期待一些知识渊博的用户会进行一些审查或玩世不恭。
比如:为什么需要那个?
细节
根据Luc Juggery's blog on Medium :

Purpose of the --privileged flag

Running a container with the --privileged flag gives all the capabilities to the container and also access to the host’s devices (everything that is under the /dev >folder)...


然而,他通过从 vagrant 运行 docker 使初学者有点混淆了这个问题。
他还告诫我们:

If you use the --privileged flag when running a container, make sure you know what you are doing.


我完全同意这一点。 使用 --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 容器访问主机设备。

关于docker - 如何在golang的容器中获取磁盘设备信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57446939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com