私は 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 によって生成されたシェルは常に というエラーを出力します。 (の代わりに)can't access tty; job control turned off
に同じホスト TTY ノードを使用することも試みましたが、この問題は依然として解決しません。/dev/tty
c 5 0
私はソースコードを調べてみsystemd-nspawn
たところ、「転送された pty」を作成します、コンテナはホスト側に「転送」される新しい PTY 上で実行されます。コードは私の教育プロジェクトには複雑すぎるため、私には実行可能ではありません。
コンテナのホストターミナルを使用するにはどうすればよいですか?
詳細: 私のコンテナプログラムにはclone(2)
フラグ = を持つ子が1つだけあり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 バージョンでも結果は変わらないと思います。