読者です 読者をやめる 読者になる 読者になる

TenForward

技術ブログ。はてなダイアリーから移転しました

Plamo Linux 4.73 で lxc 0.7.2 (後編)

前編 で書いたように,普通に lxc のコンテナを起動すると,母艦の Desktop 環境上でターミナルが開きません.これは debianubuntu の lxc 環境では起きません.コンテナ側の処理依存で,debian じゃない別の環境だと問題はないかも知れないけど,よくわかりません.

ターミナルプログラムが動かないということで,推理としては /dev/ptmx とか /dev/pts/ あたりの権限が,コンテナを動かした影響で奪われた,という想像をしてみました.

そこで出てくるのが lxc を動かすのに必要だったカーネルオプション "CONFIG_DEVPTS_MULTIPLE_INSTANCES" です.通常はターミナルが /dev/ptmx を開いて,/dev/pts 以下のファイルディスクリプタが返されますが (man pts 参照),このオプションをオンにすると,/dev/pts/ptmx というのが作成されます.デフォルトだと権限なしで.

c--------- 1 root  root   5, 2 Sep 21 17:03 ptmx

おそらく,作成されるだけで,何も設定をしないと /dev/ptmx が使われるのでしょうけど,このままだと,母艦とコンテナの擬似端末が共有されたままです.コンテナから母艦の /dev/pts/ 以下の端末に出力が出来たりします.

そこで,母艦とコンテナの擬似端末を独立させる設定をしてみよう,それでこそ本当のコンテナだ,って事でやってみました.母艦とコンテナの擬似端末を独立させることで,母艦側への影響がなくなるだろう,という算段です.

devpts ファイルシステムのマウント

Plamo デフォルトでは /etc/fstab で

none    /dev/pts        devpts  gid=5,mode=620  0  0

のようにマウントされています.これにオプションを付けて,

none    /dev/pts        devpts  gid=5,mode=620,newinstance,ptmxmode=0666  0  0

とします.このあたりはカーネル付属の devpts.txt を参照してください.この状態だと owner, group, other いずれも書き込み,読み込み権限が与えられた状態で /dev/pts/ptmx が作成されます.

これだけでは母艦側の ptmx が開けませんので,

# rm -f /dev/ptmx
# ln -s /dev/pts/ptmx /dev/ptmx

とリンクを貼ります.

この状態で "lxc-start" コマンドを実行して,コンテナを起動すると,無事母艦でも gnome-terminal がエラーなく実行されました!!

lxc-start 実行前の /dev/pts

Desktop環境上で gnome-terminal を一つ実行しています.

# ls -l
total 0
crwx-w---- 1 root tty  136, 0 Sep 21 17:14 0
crw-rw-rw- 1 root root   5, 2 Sep 21 17:14 ptmx
lxc-start 実行後 (母艦)

同じく.おそらくコンテナ用の擬似端末が開かれているのかと.

ls -l
合計 0
crw--w---- 1 karma tty  136, 0  9月 21日  17:16 0
crw------- 1 root  root 136, 1  9月 21日  17:17 1
crw------- 1 root  root 136, 2  9月 21日  17:17 2
crw------- 1 root  root 136, 3  9月 21日  17:17 3
crw------- 1 root  root 136, 4  9月 21日  17:17 4
crw------- 1 root  root 136, 5  9月 21日  17:17 5
crw-rw-rw- 1 root  root   5, 2  9月 21日  17:18 ptmx
コンテナ内の /dev/pts

lxc-console でつないでみた状態です.母艦で見えている擬似端末は見えていません.

debian:/dev/pts# ls -l
total 0
crw-rw-rw- 1 root root 5, 2 Sep 21 12:16 ptmx