В контейнере LXD, я создал файл образа диска и наконец выяснил, как смонтировать его. Однако побочный эффект монтирования изображения делает это видимым и читаемым к хостовой операционной системе.
Там какой-либо путь состоит в том, чтобы смонтировать это изображение в контейнере, но сохранить это частным к контейнеру?
Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-универсальный x86_64) lxd версия 2.17
Я мог скрыть монтирование, явно создав новое частное пространство имен монтирования. Во-первых, я включил петлевые устройства и монтаж как в , этот метод .
$ 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
.