В контейнере LXD я могу смонтировать образ диска, таким образом, что это является частным к контейнеру?

В контейнере LXD, я создал файл образа диска и наконец выяснил, как смонтировать его. Однако побочный эффект монтирования изображения делает это видимым и читаемым к хостовой операционной системе.

Там какой-либо путь состоит в том, чтобы смонтировать это изображение в контейнере, но сохранить это частным к контейнеру?

Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-универсальный x86_64) lxd версия 2.17

1
задан 6 September 2017 в 04:52

1 ответ

Я мог скрыть монтирование, явно создав новое частное пространство имен монтирования. Во-первых, я включил петлевые устройства и монтаж как в , этот метод .

$ lxc exec z1 touch foo
$ lxc exec z1 truncate -s 100M foo
$ lxc exec z1 mkfs.ext4 foo
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done
Creating filesystem with 102400 1k blocks and 25688 inodes
Filesystem UUID: 79152d07-1b5e-4b60-b716-84e72a1cce50
Superblock backups stored on blocks:
    8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

$ lxc exec z1 mount foo /mnt
$ lxc exec z1 touch /mnt/foo

С помощью этой конфигурации точка монтирования не легко видна за пределами контейнера (например, она не указана в выводе mount). Мне нужно было получить к нему доступ с помощью /proc/<pid-of-container-process>/cwd (который, в свою очередь, был доступен только пользователю root, но не моему обычному пользователю, который может выполнять команды lxc):

$ grep /mnt /proc/*/mounts | head
/proc/13782/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/13858/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14266/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14394/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14397/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14398/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14406/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14407/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14420/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14421/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0

$ ls /proc/14421/cwd/mnt
ls: cannot access '/proc/14421/cwd/mnt': Permission denied
$ sudo ls /proc/14421/cwd/mnt  # a process in the container
foo  lost+found

Теперь, делая частное монтирование пространство имен с использованием unshare :

$ lxc exec z1 bash
root@z1:~# umount /mnt
root@z1:~# unshare --mount -- /bin/bash
root@z1:~# mount --make-private foo /mnt
root@z1:~# ls /mnt
foo  lost+found
root@z1:~# exit
root@z1:~# ls /mnt
root@z1:~# exit

Теперь эти команды не выдают никаких выходных данных:

$ sudo ls /proc/14421/cwd/mnt
$ grep /mnt /proc/*/mounts | head

Но теперь любые процессы в контейнере, которым необходим доступ точка монтирования должна работать в этом пространстве имен монтирования. Это можно сделать, используя, например, nsenter .

0
ответ дан 8 December 2019 в 04:07

Другие вопросы по тегам:

Похожие вопросы: