コンテナ内でホスト 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 によって生成されたシェルは常に というエラーを出力します。 (の代わりに)can't access tty; job control turned offに同じホスト TTY ノードを使用することも試みましたが、この問題は依然として解決しません。/dev/ttyc 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 バージョンでも結果は変わらないと思います。

関連情報