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