我正在學習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/inittab
BusyBox 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 版本上都不會有所不同。