Виртуализация · 7 min read · Dec 08, 2025

Виртуализация с Xen на CentOS 6.3 (x86_64) (Паравиртуализация и Аппаратная Виртуализация)

Виртуализация с Xen на CentOS 6.3 (x86_64) (Паравиртуализация и Аппаратная Виртуализация)

Версия 1.0
Автор: Фалко Тимме
Следите за мной в Twitter

Этот учебник предоставляет пошаговые инструкции по установке Xen (версия 4.1.x) на систему CentOS 6.3 (x86_64).

Xen позволяет создавать гостевые операционные системы (nix операционные системы, такие как Linux и FreeBSD), так называемые “виртуальные машины” или domU, под хост-операционной системой (dom0). Используя Xen, вы можете разделить свои приложения на разные виртуальные машины, которые полностью независимы друг от друга (например, виртуальная машина для почтового сервера, виртуальная машина для веб-сайта с высоким трафиком, другая виртуальная машина, которая обслуживает веб-сайты ваших клиентов, виртуальная машина для DNS и т.д.), но при этом использовать одно и то же оборудование. Это экономит деньги, и что еще более важно, это более безопасно. Если виртуальная машина вашего DNS-сервера будет взломана, это не повлияет на ваши другие виртуальные машины. Кроме того, вы можете перемещать виртуальные машины с одного сервера Xen на другой.

Я буду использовать CentOS 6.3 (x86_64) как для хост-ОС (dom0), так и для гостевой ОС (domU).

Этот howto предназначен как практическое руководство; он не охватывает теоретические основы. Они рассматриваются во многих других документах в сети.

Этот документ предоставляется без каких-либо гарантий! Я хочу сказать, что это не единственный способ настройки такой системы. Существует множество способов достижения этой цели, но это тот путь, который я выбираю. Я не даю никаких гарантий, что это сработает для вас!

1 Предварительная заметка

Этот гид объяснит, как настроить виртуальные машины на основе образов, а также виртуальные машины на основе LVM.

Убедитесь, что SELinux отключен или в разрешительном режиме:

vi /etc/sysconfig/selinux

| # Этот файл управляет состоянием SELinux в системе. # SELINUX= может принимать одно из этих трех значений: # 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

Сначала проверьте, поддерживает ли ваш процессор аппаратную виртуализацию - если это так, команда

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 прекратил поддержку Xen в версии 6, нам нужно получить Xen из стороннего репозитория. Мы можем включить репозиторий следующим образом:

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

Чтобы установить Xen, мы просто выполняем

yum install kernel-xen xen

Это устанавливает Xen и ядро Xen на нашу систему CentOS.

Прежде чем мы сможем загрузить систему с ядром 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 на module в строке initrd /initramfs… Затем добавьте строку kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin после строки root и перед первой строкой module (если у вас больше одного ядра процессора, вы можете указать другое число, чем 1 для dom0_max_vcpus). Конечный раздел ядра должен выглядеть следующим образом:

| [...] 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 (которые содержат инструмент virt-install, который мы будем использовать позже для установки виртуальных машин Xen):

yum install libvirt python-virtinst

Поскольку пакет libvirt из CentOS 6/RedHat 6 не поддерживает 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

Затем мы добавляем поддержку Xen в исходники libvirt:

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!

Теперь мы можем выполнить

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. Это предпочтительный способ, так как мы используем libvirt.

virsh list

должен показать это:

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

Get new posts in your inbox

No spam. Unsubscribe anytime.