CentOS6 で libvirt で LXC を使ってみる

少し前に CentOS6 で LXC を使ってみたので、次は libvirt を絡めて LXC を使ってみます。

なお、今回もほとんど参考サイトの写経です。

参考にしたサイト

前提

  • CentOS 6.5 を Base パッケージグループのみでセットアップ
    • 前回は CentOS 6.4 だったのですがつい先日 6.5 がリリースされたので 6.5 を使います
  • IPv6 は有効にしています
    • なぜか有効にしないと sshX11 転送ができなかったからです
    • この記事では X11 転送は出てきません
  • SELinux は無効にしています
    • SELinux とかよくわからないです

libvirt のインストールと設定

libvirt をインストールします。

# yum install libvirt libvirt-client python-virtinst

前回の手順でインストールしていた rpmforge の lxc は必要ありません。libvirt に含まれる /usr/libexec/libvirt_lxc その代わりです。

次に virsh コマンドや virt-install コマンドのデフォルトの接続先を lxc にします。これが無いと毎回 virsh --connect lxc:/// のように指定しなければならず、面倒です。

# cat >> /etc/libvirt/libvirt.conf <<EOS
uri_default = "lxc:///"
EOS

再起動しておきます。

reboot

ゲストの rootfs を作成

ゲストの rootfs のディレクトリを作成して必要なパッケージをインストールします。

参考サイトの手順で core パッケージグループをインストールしていたので同じようにします。

# mkdir /var/lib/libvirt/lxc/vm01
# yum --installroot=/var/lib/libvirt/lxc/vm01 --releasever=6 -y groupinstall core
# yum --installroot=/var/lib/libvirt/lxc/vm01 --releasever=6 -y install plymouth libselinux-python

chroot します。

# chroot /var/lib/libvirt/lxc/vm01

空の fstab と mtab を作成します。これらのファイルが無いとコンテナの最初の起動時に妙なことになります。

どんな風に妙なのかはちょっと言葉にはしにくいですが、コンテナのコンソールに接続してもまともに表示されなかったり、ホスト側の SSH が突然切れたりします。

この2つのファイルを作ることで改善される理由は・・・わかりません! 直感です。

# touch /etc/fstab /etc/mtab

/etc/sysconfig/network を作ります。

# cat > /etc/sysconfig/network <<EOS
NETWORKING=yes
HOSTNAME=localhost
EOS

I/F 設定を作ります。

# cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOS
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERNTP=no
EOS

root のパスワードを設定します。

# echo password | passwd --stdin root

/etc/securetty に pts/0 を追記します。これが無いと virsh console でコンソールに接続したときに root でログインできません。

# echo "pts/0" >> /etc/securetty

pam の設定ファイルから session required pam_loginuid.so という行をコメントアウトします。 これをやっておかないとゲストにログインできません。なお、理由はわかりません。

# cp -p /etc/pam.d/login /etc/pam.d/login.orig
# cp -p /etc/pam.d/sshd  /etc/pam.d/sshd.orig

# sed -i 's/^\(session  *required  *pam_loginuid.so\)/#\1/' /etc/pam.d/login
# sed -i 's/^\(session  *required  *pam_loginuid.so\)/#\1/' /etc/pam.d/sshd

SELinux を無効にします。

# sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

chroot を抜けます。

# exit

ホストの SELinux

ホストの /selinux を削除して reboot します。

# rmdir /selinux
# reboot

これをやっておかないと後の手順でコンテナの開始に失敗します。

# virsh start vm01
エラー: ドメイン vm01 の起動に失敗しました
エラー: internal error guest failed to start: PATH=/bin:/sbin TERM=linux container=lxc-libvirt container_uuid=85dea966-d430-c06b-67f3-9a02fdf23b19 LIBVIRT_LXC_UUID=85dea966-d430-c06b-67f3-9a02fdf23b19 LIBVIRT_LXC_NAME=vm01 /sbin/init
error receiving signal from container: Input/output error

これまた理由はわかりませんが、下記あたりが関係していると思います。

ゲストの作成と起動

再起動が終わったら virt-install で lxc コンテナを作成します。

# virt-install --name vm01 --ram 512 --vcpu 1 --filesystem /var/lib/libvirt/lxc/vm01/,/ --noautoconsole --noreboot

virsh start でコンテナを開始します。

# virsh start vm01

virsh でコンソールに接続します。コンソールを抜けるときは Ctrl + [ です

# virsh console vm01

ssh でも接続してみます。まずはホストで IP アドレスを調べます。

# cat /var/lib/libvirt/dnsmasq/default.leases

ssh で接続します。

# ssh 192.168.122.182

接続を抜けるときは exit です。そんなの誰でも知ってます。

# exit

virsh destroy で停止します(virsh shutdown では停止できませんでした)。

強制終了になるので安全に停止したかったらゲストにログインしてシャットダウンしてください。

# virsh destroy vm01

さいごに

よくわからずに試行錯誤で構築したので、実運用はもとより開発環境とかでも使うのはコワイですね・・・

最近は Docker というのが流行っているらしいのでそっちの方が良いかもしれません(CentOS で動くかどうかは知りませんが)。