構築・運用‎ > ‎Linux‎ > ‎

Xen 4 で Scientific Linux 6 Dom0

2011/05/22, 21:38 by knaka <knaka@ayutaya.com>

Xen (Xen-PV) は良いです。何が良いって、VT/AMD-V が必須の KVM や Xen-HVM と違って Paravirtualization でも動くので、最近流行りの IaaS のテストなども、VM 上でおこなうことができるところです。(KVM に比べて、サポートが手薄な感は拭えませんが)

RHEL5/CentOS5 では、インストール中に “Virtualization” サポートのパッケージグループを有効にするだけで Xen の Dom0 がインストールできて簡単でした。ところが RHEL6/SL6 (Scientific Linux 6) では、Red Hat による KVM 推しのせいか Xen Dom0 が除外されてしまいました。実運用に使うわけではないので品質は問わないので、SL6 を Xen Dom0 化してみました。

RHEL6 では、Dom0 が除外されただけです。ノーマルカーネルは Xen pv_ops オプション付きでビルドされているので、そのまま Xen DomU にはなれます。

なお、今回は本家の記事がネタ元。参考: “RHEL6Xen4Tutorial – Xen Wiki“。

前準備

まず、distro をインストールする先の VM の設定を変えます。KVM であれば、ストレージやネットワークに virtio を使わず、IDE や SCSI、RTL-8139 や E1000 あたりを利用した方が無難です。別段、Dom0 が virtio を使っちゃいかんこともないと思うのですが、起動・認識しませんでした。カーネルの config 等まで、よくは見ていません。VMware の ESXi でも同様に、SCSI は準仮想化を切り、LSI Logic PATA あたりに設定します (これまた起動しなくなります)。ターゲットとして「RHEL6」等の新しい distro を選択すると virtio を有効にされてしまうこともあるので注意します。

以下の例は、KVM にインストールした SL6 (“Desktop”) です。ありモノのパッケージを使う場合には /boot/ のサイズはそれほど要らないのですが、自分でビルドする場合には、巨大な全部入り initramfs を収めることになりますので、/boot/ に 1~2GB ほど割り当てておきます。それと、”Desktop” インストールをした後でビルドを行なうと、ざっと 12~13GB にはなります。

以下、ほめられたことではありませんが、面倒なのですべて root で作業します。SELinux と iptables も off にします。

[root@sl6x ~]# chkconfig iptables off
[root@sl6x ~]# cp /etc/sysconfig/selinux /etc/sysconfig/selinux.orig
[root@sl6x ~]# vi /etc/sysconfig/selinux
[root@sl6x ~]# diff -uNr /etc/sysconfig/selinux.orig /etc/sysconfig/selinux
--- /etc/sysconfig/selinux.orig
+++ /etc/sysconfig/selinux
@@ -4,7 +4,7 @@
 #     enforcing - SELinux security policy is enforced.
 #     permissive - SELinux prints warnings instead of enforcing.
 #     disabled - No SELinux policy is loaded.
-SELINUX=enforcing
+SELINUX=disabled
 # SELINUXTYPE= can take one of these two values:
 #     targeted - Targeted processes are protected,
 #     mls - Multi Level Security protection.

下記の組み合わせ (特に「ネット上で配布されているバイナリを利用する」場合) で、libvirt の virbr0 (NAT) 経由で Fedora 14 や SL6 を入れようとすると、どうも pv_ops な DomU のネットワークが不安定なのか、不定なタイミングでインストールがコケます。カーネルだけは手で入れた方が無難かも知れません。あるいは、下記のようにして直結ブリッジを作っておきます。(xenbr0 や peth0 が見当たりません。Xen 4 になって、見せないようになった?)

なお、”NM_CONTROLLED” の行を “no” にするやいなや NetworkManager はインターフェイスを off にしますので、リモートから編集していると切られます。

[root@sl6x ~]# cd /etc/sysconfig/network-scripts/
[root@sl6x network-scripts]# cp ifcfg-eth0 /tmp/ifcfg-eth0
[root@sl6x network-scripts]# cp ifcfg-eth0 ifcfg-br0
[root@sl6x network-scripts]# vi ifcfg-eth0
[root@sl6x network-scripts]# vi ifcfg-br0
[root@sl6x network-scripts]# diff -uNr /tmp/ifcfg-eth0 ifcfg-eth0
--- /tmp/ifcfg-eth0
+++ ifcfg-eth0
@@ -1,5 +1,4 @@
 DEVICE="eth0"
-BOOTPROTO="dhcp"
-HWADDR="XX:XX:XX:XX:XX:XX"
-NM_CONTROLLED="yes"
+NM_CONTROLLED="no"
 ONBOOT="yes"
+BRIDGE="br0"
[root@sl6x network-scripts]# diff -uNr /tmp/ifcfg-eth0 ifcfg-br0
--- /tmp/ifcfg-eth0
+++ ifcfg-br0
@@ -1,5 +1,5 @@
-DEVICE="eth0"
+DEVICE="br0"
 BOOTPROTO="dhcp"
-HWADDR="XX:XX:XX:XX:XX:XX"
-NM_CONTROLLED="yes"
+NM_CONTROLLED="no"
 ONBOOT="yes"
+TYPE="Bridge"
[root@sl6x network-scripts]# cd
[root@sl6x ~]# service network restart

計算ノードとして VM イメージをコピーする際には、当然 NIC の MAC アドレスも変わります。そのため、MAC アドレスを記憶されてしまうと不都合ですので、消して、二度と書かれないようにしておきます。参考: “Disable automatic udev rules for network interfaces in Ubuntu << six degrees of freedom“。

[root@sl6x ~]# rm -f /etc/udev/rules.d/70-persistent-net.rules
[root@sl6x ~]# mkdir /etc/udev/rules.d/70-persistent-net.rules
[root@sl6x ~]#

SELinux もオフにしたことですし、ここらで一度リブートしておきますか。

[root@sl6x ~]# reboot

ネット上で配布されているバイナリを利用する場合

コミュニティビルドのパッケージです。ドイツ語は読めませんが、ありがたく利用させていただきます。

[root@sl6x ~]# ( cd /etc/yum.repos.d/ ; wget \
 http://www.gitco.de/linux/x86_64/centos/6/gitco-centos6-x86_64.repo )
(中略)
2011-05-21 15:17:02 (62.2 MB/s) - “gitco-centos6-x86_64.repo” saved [607/607]
[root@sl6x ~]# yum install -y kernel # ← Dom0 カーネルが入らなければ要調整
(中略)
Installed:
  kernel.x86_64 0:2.6.32.26-174.1.xendom0.el6

Dependency Updated:
  kernel-firmware.x86_64 0:2.6.32.26-174.1.xendom0.el6

Complete!
[root@sl6x ~]# yum install -y \
 xen xen-hypervisor xen-libs xen-licenses xen-runtime
(中略)
Installed:
  xen.x86_64 0:4.0.1-6.1.el6            xen-hypervisor.x86_64 0:4.0.1-6.1.el6
  xen-libs.x86_64 0:4.0.1-6.1.el6       xen-licenses.x86_64 0:4.0.1-6.1.el6
  xen-runtime.x86_64 0:4.0.1-6.1.el6

Dependency Installed:
  PyXML.x86_64 0:0.8.4-19.el6              SDL.x86_64 0:1.2.14-2.el6
  qemu-common.x86_64 2:0.12.5-1.el6        qemu-img.x86_64 2:0.12.5-1.el6

Complete!
[root@sl6x ~]#

上記の手順で、カーネルよりも後で xen-runtime を入れることで、postinstall のスクリプトで grub.conf を適切に編集してくれます。でもこれ、本来は trigger スクリプトでやるべきなのでは? もし xen.gz のエントリが書かれていないようであれば、以下のように手で書き換えます。

[root@sl6x ~]# cp /boot/grub/grub.conf /boot/grub/grub.conf.orig
[root@sl6x ~]# vi /boot/grub/grub.conf
[root@sl6x ~]# diff -uNr /boot/grub/grub.conf.orig /boot/grub/grub.conf
--- /boot/grub/grub.conf.orig
+++ /boot/grub/grub.conf
@@ -13,8 +13,9 @@
 hiddenmenu
 title Scientific Linux (2.6.32.26-174.1.xendom0.el6.x86_64)
        root (hd0,0)
-       kernel /vmlinuz-2.6.32.26-174.1.xendom0.el6.x86_64 ro (中略)
-       initrd /initramfs-2.6.32.26-174.1.xendom0.el6.x86_64.img
+       kernel=/xen.gz
+       module /vmlinuz-2.6.32.26-174.1.xendom0.el6.x86_64 ro (中略)
+       module /initramfs-2.6.32.26-174.1.xendom0.el6.x86_64.img
 title Scientific Linux (2.6.32-71.24.1.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-71.24.1.el6.x86_64 ro (中略)
[root@sl6x ~]#

Xen で KSM (Kernel Samepage Merging) は未サポートらしいので ksm と ksmtuned も切っておきます。

[root@sl6x ~]# chkconfig ksm off
[root@sl6x ~]# chkconfig ksmtuned off
[root@sl6x ~]#

Xen を、libvirt 経由で使います。UI としては、virt-manager が良いでしょう。python-virtinst を使いたかったのですが、Xen 4 に追随していないのか、blktap2 まわりで正しく動きませんでした。

[root@sl6x ~]# yum install -y virt-manager libvirt
(中略)
Installed:
  libvirt.x86_64 0:0.8.1-27.1.el6       virt-manager.noarch 0:0.8.4-8.el6

Dependency Installed:
  augeas-libs.x86_64 0:0.7.2-3.el6
  ebtables.x86_64 0:2.0.9-5.el6
  gtk-vnc.x86_64 0:0.3.10-3.el6
  gtk-vnc-python.x86_64 0:0.3.10-3.el6
  iscsi-initiator-utils.x86_64 0:6.2.0.872-10.el6
  libvirt-client.x86_64 0:0.8.1-27.1.el6
  libvirt-python.x86_64 0:0.8.1-27.1.el6
  lzo.x86_64 0:2.03-3.1.el6
  lzop.x86_64 0:1.02-0.9.rc1.el6
  nc.x86_64 0:1.84-22.el6
  netcf-libs.x86_64 0:0.1.6-4.el6
  numactl.x86_64 0:2.0.3-9.el6
  python-virtinst.noarch 0:0.500.3-7.el6
  yajl.x86_64 0:1.0.7-3.el6

Complete!
[root@sl6x ~]#

以上です。再起動して、Xen + Dom0 でブートします。

[root@sl6x ~]# reboot

再起動したら、とりあえず Dom0 で動いていることを確認してみます。

[root@sl6x ~]# virsh list
 Id Name                 State
----------------------------------
  0 Domain-0             running

[root@sl6x ~]#

テストとして、Virt-Manager から Scientific Linux 6 を ttp://ftp.riken.jp/Linux/scientific/6.0/x86_64/os/ からネットワークインストールしてみます。良いようです。ttp://rsync.atworks.co.jp/centos/5/os/i386/ も行けました。

ところで、UltraVNC Win32 Viewer で QEMU-KVM に繋いだ中で Virt-Manager の VNC クライアントが上がると、とても見づらい画面になるのは私だけ? VNC クライアントのせいかしら。

自前でビルドする場合

まずは、標準レポジトリのパッケージをインストールします。

[root@sl6xdev ~]# yum groupinstall -y \
 "Development tools" \
 "Additional Development" "Debugging Tools" \
 "System administration tools" \
 "Compatibility libraries" "Console internet tools" \
 "Desktop Platform Development"
(中略)
Complete!
[root@sl6xdev ~]# yum install -y \
 transfig wget texi2html libaio-devel dev86 \
 glibc-devel e2fsprogs-devel gitk mkinitrd iasl xz-devel \
 bzip2-devel pciutils-libs pciutils-devel SDL-devel \
 libX11-devel gtk2-devel bridge-utils PyXML qemu-common \
 qemu-img mercurial texinfo libuuid-devel
(中略)
Complete!
[root@sl6xdev ~]# yum install -y glibc-devel.i686
(中略)
Complete!
[root@sl6xdev ~]#

Xen 4 のビルドとインストールをします。

[root@sl6xdev ~]# host=ftp-srv2.kddilabs.jp
[root@sl6xdev ~]# path=/Linux/packages/fedora/releases/14/Everything/source/SRPMS
[root@sl6xdev ~]# ver=4.0.1-6.fc14
[root@sl6xdev ~]# wget http://$host/$path/xen-$ver.src.rpm
(中略)
[root@sl6xdev ~]# rpmbuild --rebuild xen-$ver.src.rpm
(中略)
Wrote: /root/rpmbuild/RPMS/x86_64/xen-4.0.1-6.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/xen-libs-4.0.1-6.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/xen-runtime-4.0.1-6.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/xen-hypervisor-4.0.1-6.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/xen-doc-4.0.1-6.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/xen-devel-4.0.1-6.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/xen-licenses-4.0.1-6.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/xen-debuginfo-4.0.1-6.el6.x86_64.rpm
(中略)
+ exit 0
[root@sl6xdev ~]# path=Linux/packages/fedora/releases/13/Fedora/source/SRPMS
[root@sl6xdev ~]# ver=0.12.3-8.fc13
[root@sl6xdev ~]# http://$host/$path/qemu-$ver.src.rpm
(中略)
[root@sl6xdev ~]# rpmbuild --rebuild qemu-$ver.src.rpm
(中略)
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-kvm-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-img-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-common-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-user-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-system-x86-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-system-ppc-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-system-sparc-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-system-arm-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-system-mips-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-system-cris-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-system-m68k-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-system-sh4-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-kvm-tools-0.12.3-8.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/qemu-debuginfo-0.12.3-8.el6.x86_64.rpm
(中略)
+ exit 0
[root@sl6xdev ~]# rpm -Uvh \
 ~/rpmbuild/RPMS/x86_64/xen-runtime-4* \
 ~/rpmbuild/RPMS/x86_64/xen-libs-4* \
 ~/rpmbuild/RPMS/x86_64/xen-licenses-4* \
 ~/rpmbuild/RPMS/x86_64/xen-4* \
 ~/rpmbuild/RPMS/x86_64/xen-hypervisor-4* \
 ~/rpmbuild/RPMS/x86_64/qemu-common-*
(中略)
[root@sl6xdev ~]# chkconfig ksm off
[root@sl6xdev ~]# chkconfig ksmtuned off
[root@sl6xdev ~]#

Xen Dom0 カーネルのビルドとインストールをします。

[root@sl6xdev ~]# git clone \
 git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git linux-2.6-xen
Initialized empty Git repository in /root/linux-2.6-xen/.git/
(中略)
[root@sl6xdev ~]# cd linux-2.6-xen
[root@sl6xdev linux-2.6-xen]# host=pasik.reaktio.net
[root@sl6xdev linux-2.6-xen]# wget -O .config \

http://$host/xen/kernel-config/config-2.6.32.25-pvops-dom0-xen-stable-x86_64

(中略)
[root@sl6xdev linux-2.6-xen]# make oldconfig
(質問が出たら答えます)
[root@sl6xdev linux-2.6-xen]# jobs=$(grep ^processor /proc/cpuinfo | wc -l)
[root@sl6xdev linux-2.6-xen]# make -j$jobs bzImage && \
 make -j$jobs modules && make modules_install
(中略)
  INSTALL /lib/firmware/cpia2/stv0672_vp4.bin
  INSTALL /lib/firmware/yam/1200.bin
  INSTALL /lib/firmware/yam/9600.bin
  DEPMOD  2.6.32.40
[root@sl6xdev linux-2.6-xen]# ver=$(make kernelversion)
[root@sl6xdev linux-2.6-xen]# depmod -a $ver
[root@sl6xdev linux-2.6-xen]# cp -a arch/x86/boot/bzImage /boot/vmlinuz-$ver
[root@sl6xdev linux-2.6-xen]# cp -a System.map /boot/System.map-$ver
[root@sl6xdev linux-2.6-xen]# cp -a .config /boot/config-$ver
[root@sl6xdev linux-2.6-xen]# cd /boot/
[root@sl6xdev boot]# dracut initramfs-$ver.img $ver
[root@sl6xdev boot]# cp /boot/grub/grub.conf /boot/grub/grub.conf.orig
[root@sl6xdev boot]# vi /boot/grub/grub.conf
[root@sl6xdev boot]# diff -uNr /boot/grub/grub.conf.orig /boot/grub/grub.conf
--- /boot/grub/grub.conf.orig
+++ /boot/grub/grub.conf
@@ -11,6 +11,11 @@
 timeout=5
 splashimage=(hd0,0)/grub/splash.xpm.gz
 hiddenmenu
+title Scientific Linux Dom0
+        root (hd0,0)
+        kernel /xen.gz dom0_mem=1024M loglvl=all guest_loglvl=all
+        module /vmlinuz-2.6.32.40 ro root=(中略)
+        module /initramfs-2.6.32.40.img
 title Scientific Linux (2.6.32-71.24.1.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-71.24.1.el6.x86_64 ro root=(中略)
[root@sl6xdev boot]# cd

標準の libvirt では Xen API サポートが落ちているので、有効にしてビルドします。Dom0 カーネル上でビルドするとチェックでコケるらしいので、一応テストをオフにしておきます。virt-manager も入れておきます。

[root@sl6xdev ~]# yumdownloader --source libvirt
(中略)
libvirt-0.8.1-27.el6_0.5.src.rpm                         |  11 MB     00:06
[root@sl6xdev ~]# rpm -i libvirt-*.src.rpm
[root@sl6xdev ~]# cp rpmbuild/SPECS/libvirt.spec \
 rpmbuild/SPECS/libvirt.spec.orig
[root@sl6xdev ~]# vi rpmbuild/SPECS/libvirt.spec
[root@sl6xdev ~]# diff -uNr rpmbuild/SPECS/libvirt.spec.orig \
 rpmbuild/SPECS/libvirt.spec
--- rpmbuild/SPECS/libvirt.spec.orig
+++ rpmbuild/SPECS/libvirt.spec
@@ -107,7 +107,7 @@
 %ifnarch x86_64
 %define with_qemu 0
 %endif
-%define with_xen 0
+%define with_xen 1
 %endif

 # If Xen isn't turned on, we shouldn't build the xen proxy either
@@ -1362,20 +1362,6 @@
 %clean
 rm -fr %{buildroot}

-%check
-cd tests
-# These 3 tests don't current work in a mock build root
-for i in nodeinfotest daemon-conf seclabeltest
-do
-  rm -f $i
-  echo -e "#!/bin/sh\nexit 0" > $i
-  chmod +x $i
-done
-# The test applied by patch need to be made executable
-chmod +x virsh-schedinfo
-
-make check
-
 %pre
 %if 0%{?fedora} >= 12 || 0%{?rhel} >= 6
 # Normally 'setup' adds this in /etc/passwd, but this is
[root@sl6xdev ~]# yum-builddep -y libvirt
(中略)
Complete!
[root@sl6xdev ~]# rpm -Uvh rpmbuild/RPMS/x86_64/xen-devel-*.rpm
[root@sl6xdev ~]# yum install -y libpcap-devel
(中略)
Complete!
[root@sl6xdev ~]# rpmbuild -ba rpmbuild/SPECS/libvirt.spec
(中略)
Wrote: /root/rpmbuild/SRPMS/libvirt-0.8.1-27.el6.5.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-0.8.1-27.el6.5.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-client-0.8.1-27.el6.5.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-devel-0.8.1-27.el6.5.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-python-0.8.1-27.el6.5.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-debuginfo-0.8.1-27.el6.5.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.aEw602
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd libvirt-0.8.1
+ rm -fr /root/rpmbuild/BUILDROOT/libvirt-0.8.1-27.el6.5.x86_64
+ exit 0
[root@sl6xdev ~]# yum install -y nc ebtables lzop
(中略)
Complete!
[root@sl6xdev ~]# rpm -Uvh \
 rpmbuild/RPMS/x86_64/libvirt-client-0.8.1-27.el6.5.x86_64.rpm \
 rpmbuild/RPMS/x86_64/libvirt-0.8.1-27.el6.5.x86_64.rpm \
 rpmbuild/RPMS/x86_64/libvirt-python-0.8.1-27.el6.5.x86_64.rpm
[root@sl6xdev ~]# yum install -y virt-manager
(中略)
Complete!
[root@sl6xdev ~]#

リブートします。

[root@sl6xdev ~]# reboot

先の例と同様に、Dom0 で動作していることを確認し、適当にインストールをしてみます。良いようです。

Comments