koji::*

主に技術系。他に雑多なことをアレコレと

lxcのptsではまった。

lxcの/dev/ptsではまったのでメモしておきます。

環境

OSはHost、Guest共にCentOS6.3で試しています。lxcは0.7.5です。

現象

lxcのシステムコンテナを作成すると、初回のlxc-startの後だけ、SSHでログインした際に
以下のようなエラーが表示されました。
(一度lxc-stopしてからstartすると表示されなくなりました)

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

また、初回のlxc-start後にSSHの接続を増やしていくと先に接続していた仮想端末の操作が
奪われるという現象が起こったので、仮想端末がおかしいと考えました。

調査内容

そこでlxc、pts、devptsあたりのキーワードで調べていたら、
kernelのdevptsのdocumentを見つけました。

https://www.assembla.com/code/olipad-100/git/nodes/master/ugoraffaele-2.6.32-kernel/Documentation/filesystems/devpts.txt

documentには、まさにコンテナのような用途の話が書かれていて
ポイントをまとめると以下のような感じです。

  • kernelのconfigでCONFIG_DEVPTS_MULTIPLE_INSTANCES=yになっているか(/dev/pts/ptmxが0000で作られるようになる)
  • /dev/ptsをmountするときに、newinstanceとptmxmode=0666のオプションが指定されているか
  • /dev/ptmxを/dev/pts/ptmxへのsymlinkに置き換えているか

対応内容

HostとGuestの両方で、上記の条件を満たせば良いはずなので、同じ設定を両者に行う方針でいきました。
まず、kernelのconfigは以下のように調べました。

[root@localhost lxc63]# cat /boot/config-2.6.32-279.9.1.el6.x86_64 | grep CONFIG_DEVPTS_MULTIPLE_INSTANCES
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y

次に以下のようにOS起動時のscriptに変更を入れました。
ただし、/dev/ptsのmountはGuest側には設定しなくても動きました。
(lxcのソースを見たら、lxc-startの際にmountオプション付でmountしていたので、それで不要なのかな?)

fstabでのmountをGuest側で設定しないと、複数のコンテナを立ち上げた際にコンテナ間で仮想端末が見えてしまっていました。

[root@localhost ~]# cat /etc/fstab | grep pts
devpts                  /dev/pts                devpts  gid=5,mode=620,newinstance,ptmxmode=0666  0 0
[root@localhost ~]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
rm -f /dev/ptmx
ln -s /dev/pts/ptmx /dev/ptmx

あとはtemplateのlxc-fedoraを改造してlxc-centosを作りました。
ネットやgithubで公開している人もちょくちょく要るけど、一応、自分でも作ったのであげておきます。
(オプションをいろいろ付け足しています。あとlxc-createから使うことは考慮していません)

https://github.com/koji--/lxc-centos