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 化してみました。
なお、今回は本家の記事がネタ元。参考: “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 で動作していることを確認し、適当にインストールをしてみます。良いようです。 |