Como usar o host PTY no contêiner?

Como usar o host PTY no contêiner?

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/0e /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/consoleo nó no contêiner.

Isso parece bom ao executar um aplicativo regular como /bin/sho 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/inittabrootfs 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-nspawne 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 | SIGCHLDe 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.

informação relacionada