仮想化 · 4 min read · Dec 08, 2025

CentOS 6.3 (x86_64) における Xen を用いた仮想化 (パラ仮想化 & ハードウェア仮想化)

CentOS 6.3 (x86_64) における Xen を用いた仮想化 (パラ仮想化 & ハードウェア仮想化)

バージョン 1.0
著者: Falko Timme
Twitterでフォローしてください

このチュートリアルでは、CentOS 6.3 (x86_64) システムに Xen (バージョン 4.1.x) をインストールする手順を説明します。

Xen を使用すると、ホストオペレーティングシステム (dom0) の下に、ゲストオペレーティングシステム (*nix オペレーティングシステム、Linux や FreeBSD など) を作成できます。これらは「仮想マシン」または domU と呼ばれます。Xen を使用すると、アプリケーションを完全に独立した異なる仮想マシンに分離できます (例: メールサーバー用の仮想マシン、高トラフィックのウェブサイト用の仮想マシン、顧客のウェブサイトを提供する別の仮想マシン、DNS 用の仮想マシンなど)。これにより、同じハードウェアを使用しながらコストを削減でき、さらに重要なことに、より安全です。DNS サーバーの仮想マシンがハッキングされた場合でも、他の仮想マシンには影響を与えません。また、仮想マシンを一つの Xen サーバーから別のサーバーに移動することもできます。

ホスト OS (dom0) とゲスト OS (domU) の両方に CentOS 6.3 (x86_64) を使用します。

このハウツーは実用的なガイドとして意図されており、理論的な背景については説明していません。これらはウェブ上の他の多くの文書で扱われています。

この文書にはいかなる種類の保証もありません!これはこのようなシステムを設定する唯一の方法ではないことをお伝えしたいと思います。この目標を達成する方法はたくさんありますが、これは私が取る方法です。これがあなたにとって機能することを保証するものではありません!

1 予備ノート

このガイドでは、イメージベースの仮想マシンと LVM ベースの仮想マシンを設定する方法を説明します。

SELinux が無効または許可されていることを確認してください:

vi /etc/sysconfig/selinux

| # このファイルはシステム上の SELinux の状態を制御します。 # SELINUX= は次の 3 つの値のいずれかを取ります: # enforcing - SELinux セキュリティポリシーが強制されます。 # permissive - SELinux は強制する代わりに警告を表示します。 # disabled - SELinux は完全に無効です。 SELINUX=disabled # SELINUXTYPE= 使用中のポリシーのタイプ。可能な値は: # targeted - 対象とされたネットワークデーモンのみが保護されます。 # strict - 完全な SELinux 保護。 SELINUXTYPE=targeted |

/etc/sysconfig/selinux を変更した場合は、システムを再起動してください:

reboot

2 ネットワークブリッジの作成

仮想マシンが他のホストから物理システムのようにアクセスできるように、サーバーにネットワークブリッジを設定する必要があります。

これを行うために、bridge-utils パッケージをインストールします…

yum install bridge-utils

… そしてブリッジを設定します。/etc/sysconfig/network-scripts/ifcfg-br0 ファイルを作成します (IPADDR、PREFIX、GATEWAY、DNS1、および DNS2 の値は /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルから取得してください); TYPE=Bridge を使用することを確認してください。TYPE=Ethernet ではありません:

vi /etc/sysconfig/network-scripts/ifcfg-br0

| DEVICE="br0" NM_CONTROLLED="yes" ONBOOT=yes TYPE=Bridge BOOTPROTO=none IPADDR=192.168.0.100 PREFIX=24 GATEWAY=192.168.0.1 DNS1=8.8.8.8 DNS2=8.8.4.4 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System br0" |

/etc/sysconfig/network-scripts/ifcfg-eth0 を次のように変更します (BOOTPROTO、IPADDR、PREFIX、GATEWAY、DNS1、および DNS2 をコメントアウトし、BRIDGE=br0 を追加します):

vi /etc/sysconfig/network-scripts/ifcfg-eth0

| DEVICE="eth0" #BOOTPROTO=none NM_CONTROLLED="yes" ONBOOT=yes TYPE="Ethernet" UUID="73cb0b12-1f42-49b0-ad69-731e888276ff" HWADDR=00:1E:90:F3:F0:02 #IPADDR=192.168.0.100 #PREFIX=24 #GATEWAY=192.168.0.1 #DNS1=8.8.8.8 #DNS2=8.8.4.4 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System eth0" BRIDGE=br0 |

ネットワークを再起動します…

/etc/init.d/network restart

… そして実行します

ifconfig

これでネットワークブリッジ (br0) が表示されるはずです:

[root@server1 ~]# ifconfig  
br0       Link encap:Ethernet  HWaddr 00:1E:90:F3:F0:02  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0  
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:27 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:460 (460.0 b)  TX bytes:2298 (2.2 KiB)  
  
eth0      Link encap:Ethernet  HWaddr 00:1E:90:F3:F0:02  
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:18455 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:11861 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:1000  
          RX bytes:26163057 (24.9 MiB)  TX bytes:1100370 (1.0 MiB)  
          Interrupt:25 Base address:0xe000  
  
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0  
          inet6 addr: ::1/128 Scope:Host  
          UP LOOPBACK RUNNING  MTU:16436  Metric:1  
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:2456 (2.3 KiB)  TX bytes:2456 (2.3 KiB)  
  
[root@server1 ~]#

3 Xen のインストール

まず、CPU がハードウェア仮想化をサポートしているかどうかを確認します。これが該当する場合、コマンド

egrep '(vmx|svm)' --color=always /proc/cpuinfo

は何かを表示するはずです。例えば:

[root@server1 ~]# egrep '(vmx|svm)' --color=always /proc/cpuinfo  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall  
 nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy misalignsse  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall  
 nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy misalignsse  
[root@server1 ~]#

何も表示されない場合、プロセッサはハードウェア仮想化をサポートしていません。これは、Xen でパラ仮想化のみを使用でき、ハードウェア仮想化は使用できないことを意味します。

CentOS 6 は RedHat 6 に基づいており、RedHat はバージョン 6 で Xen のサポートを終了したため、サードパーティのリポジトリから Xen を取得する必要があります。リポジトリを次のように有効にします:

yum install http://au1.mirror.crc.id.au/repo/kernel-xen-release-6-3.noarch.rpm

Xen をインストールするには、次のコマンドを実行します:

yum install kernel-xen xen

これにより、CentOS システムに Xen と Xen カーネルがインストールされます。

Xen カーネルでシステムをブートする前に、GRUB ブートローダーの設定を確認してください。/boot/grub/menu.lst を開きます:

vi /boot/grub/menu.lst

最初にリストされているカーネルは、先ほどインストールした Xen カーネルである必要があります:

| [...] title CentOS (2.6.32.57-2.el6xen.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32.57-2.el6xen.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet initrd /initramfs-2.6.32.57-2.el6xen.x86_64.img [...] |

そのセクションを修正して、最初に Xen ハイパーバイザーがロードされるようにします。カーネル /vmlinuz… 行の最初の単語 kernel を module に置き換えます。次の行でも同様に、initrd /initramfs… 行の最初の単語 initrd を module に置き換えます。次に、root 行の後、最初の module 行の前に、次の行を追加します: kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin (CPU コアが 1 つ以上ある場合は、dom0_max_vcpus に 1 以外の数を指定できます)。最終的なカーネルセクションは次のようになります:

| [...] title CentOS (2.6.32.57-2.el6xen.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin module /vmlinuz-2.6.32.57-2.el6xen.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet module /initramfs-2.6.32.57-2.el6xen.x86_64.img [...] |

default の値を 0 に変更します (これにより、最初のカーネル (Xen カーネル) がデフォルトでブートされます):

| [...] default=0 [...] |

完全な /boot/grub/menu.lst は次のようになります:

| # grub.conf は anaconda によって生成されました # # このファイルに変更を加えた後、grub を再実行する必要はありません # 注意: /boot パーティションがあります。これは、 # すべてのカーネルと initrd パスが /boot/ に相対的であることを意味します。 例: # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/vg_server1-LogVol00 # initrd /initrd-[generic-]version.img #boot=/dev/sde default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32.57-2.el6xen.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin module /vmlinuz-2.6.32.57-2.el6xen.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet module /initramfs-2.6.32.57-2.el6xen.x86_64.img title CentOS (2.6.32-279.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/mapper/vg_server1-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=vg_server1/LogVol01 rd_LVM_LV=vg_server1/LogVol00 rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-279.el6.x86_64.img |

再起動する前に、libvirt と python-virtinst (後で Xen VM をインストールするために使用する virt-install ツールを含む) パッケージをインストールします:

yum install libvirt python-virtinst

CentOS 6/RedHat 6 の libvirt パッケージには Xen のサポートがないため、Xen サポートを持つように再構築する必要があります。これを行うために、いくつかの前提条件を今インストールします:

yum groupinstall 'Development Tools'
yum install python-devel xen-devel libxml2-devel xhtml1-dtds readline-devel ncurses-devel libtasn1-devel gnutls-devel augeas libudev-devel libpciaccess-devel yajl-devel sanlock-devel libpcap-devel libnl-devel avahi-devel libselinux-devel cyrus-sasl-devel parted-devel device-mapper-devel numactl-devel libcap-ng-devel netcf-devel libcurl-devel audit-libs-devel systemtap-sdt-devel libblkid-devel scrub

libvirt のバージョンを確認しましょう:

rpm -qa | grep libvirt
[root@server1 ~]# rpm -qa | grep libvirt  
libvirt-client-0.9.10-21.el6_3.3.x86_64  
libvirt-0.9.10-21.el6_3.3.x86_64  
libvirt-python-0.9.10-21.el6_3.3.x86_64  
[root@server1 ~]#

バージョンは 0.9.10 ですので、適切な src.rpm パッケージを /root/src にダウンロードしてインストールします:

mkdir /root/src  
cd /root/src  
wget http://vault.centos.org/6.3/os/Source/SPackages/libvirt-0.9.10-21.el6.src.rpm  
rpm -i libvirt-0.9.10-21.el6.src.rpm

最後のコマンドは無視できる警告を表示します:

warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root

次に、libvirt ソースに Xen サポートをパッチします:

wget http://pasik.reaktio.net/xen/patches/libvirt-spec-rhel6-enable-xen.patch  
cd /root/rpmbuild/SPECS  
cp -a libvirt.spec libvirt.spec.orig  
patch -p0 < ~/src/libvirt-spec-rhel6-enable-xen.patch

新しい libvirt パッケージをビルドします:

rpmbuild -bb libvirt.spec

ビルドプロセスの最後に、次のようなメッセージが表示されるはずです:

Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-client-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-devel-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-lock-sanlock-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-python-0.9.10-21.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-debuginfo-0.9.10-21.el6.x86_64.rpm

新しいパッケージが作成されたディレクトリ (/root/rpmbuild/RPMS/x86_64/) に移動します…

cd /root/rpmbuild/RPMS/x86_64/

… そして新しい libvirt パッケージ (Xen サポート付き) を次のようにインストールします:

rpm -Uvh --force libvirt-0.9.10-21.el6.x86_64.rpm libvirt-client-0.9.10-21.el6.x86_64.rpm libvirt-python-0.9.10-21.el6.x86_64.rpm

その後、システムを再起動します:

reboot

システムは新しい Xen カーネルで自動的にブートされるはずです。システムがブートした後、次のコマンドを実行して確認できます:

uname -r
[root@server1 ~]# uname -r  
2.6.32.57-2.el6xen.x86_64  
[root@server1 ~]#

これで本当に新しい Xen カーネルを使用しています!

次に、次のコマンドを実行して、Xen が起動しているかどうかを確認します:

xm list

Domain-0 (dom0) がリストされるはずです:

[root@server1 ~]# xm list  
Name                                    ID   Mem VCPUs      State   Time(s)  
Domain-0                                0   1024     1      r-----     18.9  
[root@server1 ~]#

xm コマンドの代わりに、これからは virsh コマンドを使用して Xen VM を管理します。これは libvirt を使用しているため、推奨される方法です。

virsh list

は次のように表示されるはずです:

[root@server1 ~]# virsh list  
 Id    Name                           State  
----------------------------------------------------  
 0     Domain-0                       running  
[root@server1 ~]#
Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。