kyleqian
kyleqian

Reputation: 385

How to get disk device information in container in golang?

I want to get all disk devices of host machine in Go or C++ language in a docker container. More information such as free spaces are also needed. What should I do or can this be possible ?

Upvotes: 1

Views: 2069

Answers (1)

Paul
Paul

Reputation: 27443

There is nothing special about Go or C++ that is required. You can use any relevant code or libraries that would examine Linux system devices for disk space or free space, because the environment the docker container provides is (typically) a Linux environment.

Docker Solution

docker run --privileged <image> <program> will populate the /dev file system in the container, which contains the device files relevant to your system and allows the container to access those devices.

User Solution

You will have to tell your users, e.g. in DockerHub documentation, or in error messages, to use the

--privileged flag

when running your image or it won't be able to access system devices.

You should expect some scrutiny or cynicism from some of your more knowledgeable users.

Like: why does it need that?

Details

According to 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)...

However, he confuses the issue for beginners a bit by running docker from vagrant.

He also warns us:

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

And I agree with that completely. Using --privileged gives the container the permission to modify the host.

It is easier to see what is happening from a Linux host running docker.

Example 1:

From the Linux host we will start an ubuntu container (without --privileged) and run sfdisk to see the disk partitions and ls -l /dev/s* to see the disk devices. It doesn't work because the container has no privileges to access the host in this way. The container's environment can not scan the disks on the host in any way.

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

Example 2:

Now we run 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

and the docker container is allowed to access the host devices.

Upvotes: 2

Related Questions