如何在容器中使用主機PTY?

如何在容器中使用主機PTY?

我正在學習Linux的容器技術,並自己編寫了一個最小的容器實作。我目前對容器進程的控制台/終端感到困惑,因為我在容器中「重複使用」控制終端/dev/console(而不是)。c 5 1

/proc/self/fd/0我從和確定當前終端/proc/self/fd/2,讀取其設備節點(主要和次要),並使用發現的設備節點在容器中mknod(2)建立節點。/dev/console

當運行像 PID 1(在 PID 命名空間中)這樣的常規應用程式時,這看起來很好/bin/sh,但在通過 init 系統時則不然(我為此使用了 BusyBox)。

這是我的/etc/inittabBusyBox rootfs:

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

然而,由 init 產生的 shell 總是抱怨can't access tty; job control turned off。我還嘗試使用相同的主機 TTY 節點/dev/tty(而不是c 5 0),但此問題仍然存在。

我查看了原始碼systemd-nspawn,發現它創建一個“轉發 pty”,其中容器在「轉送」到主機端的新 PTY 上運行。該程式碼對於我的教育專案來說太複雜,因此對我來說不可行。

如何使用容器的主機終端機?


詳細資訊:我的容器程式clone(2)只有一個帶有 flags = 的子項CLONE_NEWGROUP | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWIPC | CLONE_NEWUTS | SIGCHLD,該子項設定功能(黑名單)和 seccomp(白名單,系統呼叫列表取自碼頭工人),然後pivot_root(2)再到容器 rootfs 並execve(2)進入目標應用程式。

我目前正在 Linux 5.3 (Ubuntu 18.04 HWE) 上進行實驗,但我預計這在任何最新的 Linux 版本上都不會有所不同。

相關內容