仮想化 · 4 min read · Nov 30, 2025

CentOS 6.2 における Xen を用いた仮想化 (準仮想化 & ハードウェア仮想化)

CentOS 6.2 における Xen を用いた仮想化 (準仮想化 & ハードウェア仮想化)

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

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

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

ホスト OS (dom0) とゲスト OS (domU) の両方に CentOS 6.2 (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" NM_CONTROLLED="yes" ONBOOT=yes HWADDR=00:1E:90:F3:F0:02 TYPE=Ethernet #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 eth0" UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 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:17 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:1196 (1.1 KiB)  TX bytes:2794 (2.7 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:4554 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:3020 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:1000  
          RX bytes:6249612 (5.9 MiB)  TX bytes:254928 (248.9 KiB)  
          Interrupt:25 Base address:0x6000  
  
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:3 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:1304 (1.2 KiB)  TX bytes:1304 (1.2 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 wget
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.54-1.el6xen.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32.54-1.el6xen.x86_64 ro root=/dev/mapper/VolGroup00-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=VolGroup00/LogVol01 rd_LVM_LV=VolGroup00/LogVol00 rd_NO_DM initrd /initramfs-2.6.32.54-1.el6xen.x86_64.img [...] |

そのセクションを修正して、最初に Xen ハイパーバイザーがロードされるようにします。カーネル /vmlinuz… 行の最初の単語 kernel を module に置き換えます。同様に、次の行でも最初の単語 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.54-1.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.54-1.el6xen.x86_64 ro root=/dev/mapper/VolGroup00-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=VolGroup00/LogVol01 rd_LVM_LV=VolGroup00/LogVol00 rd_NO_DM module /initramfs-2.6.32.54-1.el6xen.x86_64.img [...] |

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

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

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

| # grub.conf generated by anaconda # # このファイルに変更を加えた後、grub を再実行する必要はありません # 注意: /boot パーティションがあります。これは、 # すべてのカーネルと initrd パスが /boot/ に対して相対的であることを意味します。 例: # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/VolGroup00-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.54-1.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.54-1.el6xen.x86_64 ro root=/dev/mapper/VolGroup00-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=VolGroup00/LogVol01 rd_LVM_LV=VolGroup00/LogVol00 rd_NO_DM module /initramfs-2.6.32.54-1.el6xen.x86_64.img title CentOS (2.6.32-220.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup00-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=de rd_LVM_LV=VolGroup00/LogVol01 rd_LVM_LV=VolGroup00/LogVol00 rd_NO_DM initrd /initramfs-2.6.32-220.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

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

rpm -qa | grep libvirt
[root@server1 ~]# rpm -qa | grep libvirt  
libvirt-client-0.9.4-23.el6_2.4.x86_64  
libvirt-0.9.4-23.el6_2.4.x86_64  
libvirt-python-0.9.4-23.el6_2.4.x86_64  
[root@server1 ~]#

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

mkdir /root/src  
cd /root/src  
wget http://vault.centos.org/6.2/os/Source/SPackages/libvirt-0.9.4-23.el6.src.rpm  
rpm -i libvirt-0.9.4-23.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.4-23.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-client-0.9.4-23.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-devel-0.9.4-23.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-lock-sanlock-0.9.4-23.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-python-0.9.4-23.el6.x86_64.rpm  
Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-debuginfo-0.9.4-23.el6.x86_64.rpm

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

cd /root/rpmbuild/RPMS/x86_64/

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

rpm -Uvh --force libvirt-0.9.4-23.el6.x86_64.rpm libvirt-client-0.9.4-23.el6.x86_64.rpm libvirt-python-0.9.4-23.el6.x86_64.rpm

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

reboot

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

uname -r
[root@server1 ~]# uname -r  
2.6.32.54-1.el6xen.x86_64  
[root@server1 ~]#

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

次に、次のコマンドを実行して

xm list

Xen が起動しているかどうかを確認します。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

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

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