Estou aprendendo sobre tecnologias de contêiner do Linux e escrevi sozinho uma implementação mínima de contêiner. Atualmente estou confuso sobre consoles/terminais para processos de contêiner, pois estou "reutilizando" o terminal de controle como /dev/console
(em vez de c 5 1
) no contêiner.
Eu determino o terminal atual de /proc/self/fd/0
e /proc/self/fd/2
, leio seu nó de dispositivo (maior e secundário) e mknod(2)
uso os nós de dispositivo descobertos para criar /dev/console
o nó no contêiner.
Isso parece bom ao executar um aplicativo regular como /bin/sh
o PID 1 (no namespace PID), mas não quando através de um sistema init (usei o BusyBox para isso).
Aqui está o meu /etc/inittab
rootfs do BusyBox:
::sysinit:/bin/true
::respawn:-/bin/sh
No entanto, o shell gerado pelo init sempre reclama can't access tty; job control turned off
. Também tentei usar o mesmo nó TTY do host para /dev/tty
(em vez de c 5 0
), mas o problema ainda persiste.
Eu olhei para o código-fonte systemd-nspawn
e descobri que elecria um "pty encaminhado", onde o contêiner é executado em um novo PTY que é "encaminhado" para o host. O código é muito complexo para o meu projeto educacional, por isso não é viável para mim.
Como posso usar o terminal host para o contêiner?
Detalhes: Meu contêiner programa clone(2)
apenas um filho com flags = CLONE_NEWGROUP | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWIPC | CLONE_NEWUTS | SIGCHLD
e o filho configura recursos (lista negra) e seccomp (lista branca, lista syscall retirada deDocker), antes pivot_root(2)
do contêiner rootfs e execve(2)
do aplicativo de destino.
Atualmente estou experimentando no Linux 5.3 (Ubuntu 18.04 HWE), mas não espero que isso seja diferente em nenhuma versão recente do Linux.