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

TenForward

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

/dev/ptmx でハマり道

Linux Container

lxc を使用する際,仮想端末回りをセキュアにするために newinstance オプションを付けて devpts をマウントするのは,以前 紹介ずみです.ココでも少しハマりましたが,またハマったのでメモっておきます.

devpts の newinstance オプション

カーネル付属文書を読んでみると

To workaround this and have strict isolation, all mounts of devpts,
including the mount in the root container, should use the newinstance
option.

と書かれており,前回やったようなホスト側だけでなく,コンテナ側でも newinstance オプションを付けるのが良いようです.最近の lxc だと,src/lxc/conf.c 内に

        if (mount("devpts", "/dev/pts", "devpts", MS_MGC_VAL,
                  "newinstance,ptmxmode=0666")) {
                SYSERROR("failed to mount a new instance of '/dev/pts'");
                return -1;
        }

というようなコードがあるため,コンテナ側は自動的にそのようにマウントされるようです.これは libvirt の lxc ドライバでも同様のようです(私は未確認).

ホスト側での newinstance 付きマウント

ホスト側では /etc/fstab で

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

という感じで記述し,既存の /dev/ptmx を カーネル付属文書にあるように,

        $ chmod 0666 /dev/pts/ptmx
        $ rm /dev/ptmx
        $ ln -s pts/ptmx /dev/ptmx

というような処理を /etc/rc.d/rc.local で行っていました.

が,このままコンテナ内で udevd が普通に起動するように設定されたコンテナを起動すると,普通にホスト側にも

KERNEL[1320669272.186163] add /devices/virtual/tty/ptmx (tty)
UDEV_LOG=3
ACTION=add
DEVPATH=/devices/virtual/tty/ptmx
SUBSYSTEM=tty
DEVNAME=ptmx
DEVMODE=0666
SEQNUM=2128
MAJOR=5
MINOR=2

なんてカーネルイベントが飛んできていました.そこで udev のデフォルトのルール 50-udev-default.rules内の

KERNEL=="ptmx",                 GROUP="tty", MODE="0666"

というルールが発動し,/dev/ptmx が見事に復活し,ホストで仮想端末が開けなくなるとか,色々と問題が起きてしまってました.(;_;)

ホスト側で問題が起きない設定

この設定ではダメな事がわかったので,どうしたかというと,コンテナ起動時にホスト側にも ptmx の add されるイベントが飛んできてるわけですから,それをそのまま利用する形で,udev のルールに前述のシンボリックリンクが作成されるようなルールを書きました.

50-udev-default.rules より早く読み込まれる必要があるため,例えば 00-ptmx.rules というようなファイルを /etc/udev/rules.d/ 以下に置きます.内容は

KERNEL=="ptmx", NAME="pts/%k", SYMLINK+="%k"

というのでとりあえず問題なく動いています.

以上,間違いがあれば指摘プリーズ!