Виртуализация · 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, пожалуйста, перезагрузите систему:
reboot2 Создание сетевого моста
Нам нужно настроить сетевой мост на нашем сервере, чтобы наши виртуальные машины могли быть доступны с других хостов так, как если бы они были физическими системами в сети.
Для этого мы устанавливаем пакет 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 ~]#Get new posts in your inbox
No spam. Unsubscribe anytime.