少し前に CentOS6 で LXC を使ってみたので、次は libvirt を絡めて LXC を使ってみます。
なお、今回もほとんど参考サイトの写経です。
参考にしたサイト
前提
- CentOS 6.5 を Base パッケージグループのみでセットアップ
- 前回は CentOS 6.4 だったのですがつい先日 6.5 がリリースされたので 6.5 を使います
- IPv6 は有効にしています
- 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
これまた理由はわかりませんが、下記あたりが関係していると思います。
- https://www.redhat.com/archives/libvir-list/2013-March/msg01507.html
- https://www.redhat.com/archives/libvirt-users/2013-March/msg00136.html
- https://bugzilla.redhat.com/show_bug.cgi?id=995897
ゲストの作成と起動
再起動が終わったら 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 で動くかどうかは知りませんが)。