コンテナでホストPTYをどのように使用しますか?

コンテナでホストPTYをどのように使用しますか?

私はLinuxコンテナ技術を学んでおり、最小限のコンテナ実装を直接書いています。私は現在コンテナプロセスのコンソール/ターミナルについて混乱しています。コンテナ/dev/consoleの代わりにコンテナ内で制御端末を「再利用」しているからです。c 5 1

/proc/self/fd/0現在の端末を確認し、対応するデバイスノード(プライマリとセカンダリ)を読み取り、取得したデバイス/proc/self/fd/2ノードを使用してコンテナにmknod(2)ノードを作成します。/dev/console

PID 1(PIDネームスペースで)などの一般的なアプリケーションを実行している場合は問題ありませんが、/bin/shinitシステムを通過するときはそうではありません(私はこれにBusyBoxを使用します)。

これは私の/etc/inittabBusyBox 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 で実行されます。このコードは私の教育プロジェクトと比較して複雑すぎるので、適切ではありません。

コンテナのホスト端末をどのように使用しますか?


詳細:私のコンテナプログラムには、機能(ブラックリスト)とseccomp(ホワイトリスト)を設定するフラグをclone(2)持つサブキーが1つしかありません。CLONE_NEWGROUP | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWIPC | CLONE_NEWUTS | SIGCHLDシステムコールのリストは以下から取得されます。ルーストアバウト)、次にpivot_root(2)コンテナrootfsとexecve(2)ターゲットアプリケーションに移動します。

現在、Linux 5.3(Ubuntu 18.04 HWE)で実験していますが、最近のLinuxバージョンではこれが異なるとは予想していません。

関連情報