私は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 で実行されます。このコードは私の教育プロジェクトと比較して複雑すぎるので、適切ではありません。
コンテナのホスト端末をどのように使用しますか?
詳細:私のコンテナプログラムには、機能(ブラックリスト)と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バージョンではこれが異なるとは予想していません。