Eu poderia ocultar uma montagem criando explicitamente um novo namespace de montagem particular. Primeiro, eu habilitei dispositivos de loop e montagem como em este método .
$ 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
Com essa configuração, o ponto de montagem não é facilmente visível fora do contêiner (não está listado a saída mount
, por exemplo). Eu tive que acessá-lo usando /proc/<pid-of-container-process>/cwd
(que por sua vez era acessível apenas para root, mas não para o meu usuário regular, que pode executar lxc
comandos):
$ 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
Agora, crie um namespace de montagem particular usando 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
Agora, esses comandos não produziram saída:
$ sudo ls /proc/14421/cwd/mnt
$ grep /mnt /proc/*/mounts | head
Mas agora todos os processos no contêiner que precisam de acesso a esse ponto de montagem precisam ser executados nesse namespace de montagem. Isso pode ser feito usando nsenter
, por exemplo.