¿Cómo utilizar el host PTY en un contenedor?

¿Cómo utilizar el host PTY en un contenedor?

Estoy aprendiendo sobre tecnologías de contenedores de Linux y escribí una implementación mínima de contenedores por mi cuenta. Actualmente estoy confundido acerca de las consolas/terminales para procesos de contenedor, ya que estoy "reutilizando" la terminal de control como /dev/console(en lugar de c 5 1) en el contenedor.

Determino el terminal actual desde /proc/self/fd/0y /proc/self/fd/2, leo su nodo de dispositivo (mayor y menor) y mknod(2)uso los nodos de dispositivo descubiertos para crear /dev/consoleun nodo en el contenedor.

Esto parece estar bien cuando se ejecuta una aplicación normal como /bin/shPID 1 (en el espacio de nombres PID), pero no cuando se ejecuta a través de un sistema de inicio (usé BusyBox para esto).

Aquí está mi /etc/inittabpara los rootfs de BusyBox:

::sysinit:/bin/true
::respawn:-/bin/sh

Sin embargo, el shell generado por init siempre se queja can't access tty; job control turned off. También intenté usar el mismo nodo TTY del host para /dev/tty(en lugar de c 5 0), pero este problema aún persiste.

Miré el código fuente de systemd-nspawny descubrí quecrea un "pty reenviado", donde el contenedor se ejecuta en un nuevo PTY que se "reenvía" al lado del host. El código es demasiado complejo para mi proyecto educativo por lo que no es viable para mí.

¿Cómo puedo utilizar la terminal host para el contenedor?


Detalles: Mi programa contenedor clone(2)tiene solo un hijo con flags = CLONE_NEWGROUP | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWIPC | CLONE_NEWUTS | SIGCHLD, y el hijo configura capacidades (listas negras) y seccomp (listas blancas, lista de llamadas al sistema tomadas deEstibador), antes pivot_root(2)del contenedor rootfs y execve(2)de la aplicación de destino.

Actualmente estoy experimentando con Linux 5.3 (Ubuntu 18.04 HWE), pero no espero que esto sea diferente en ninguna versión reciente de Linux.

información relacionada