使用Xen On CentOS 6.3(x86_64)进行虚拟化(半虚拟化和硬件虚拟化)
本教程提供了有关如何在CentOS 6.3 (x86_64)系统上安装Xen (版本4.1.x )的分步说明。
Xen允许您在主机操作系统( dom0
)下创建客户操作系统(* nix操作系统,如Linux和FreeBSD),即所谓的“虚拟机”或主机。 使用Xen可以将应用程序分离成完全独立的虚拟机(例如,邮件服务器的虚拟机,高流量网站的虚拟机,为客户网站提供的另一个虚拟机,一个用于DNS的虚拟机等),但仍然使用相同的硬件。 这样可以节省资金,更重要的是更安全。 如果您的DNS服务器的虚拟机被黑客入侵,它对您的其他虚拟机没有影响。 此外,您可以将虚拟机从一个Xen服务器移动到下一个。
我将使用CentOS 6.3(x86_64)作为主机OS( dom0
)和客户操作系统( domU
)。
这是一个实践指南; 它不包括理论背景。 他们在网络上的许多其他文档中被处理。
本文档不附带任何形式的保证! 我想说,这不是设立这样一个制度的唯一办法。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!
1初步说明
本指南将介绍如何设置基于映像的虚拟机以及基于LVM的虚拟机。
确保SELinux已禁用或允许:
vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - SELinux is fully disabled. SELINUX=disabled # SELINUXTYPE= type of policy in use. Possible values are: # targeted - Only targeted network daemons are protected. # strict - Full SELinux protection. SELINUXTYPE=targeted |
如果您必须修改/ etc / sysconfig / selinux
,请重新启动系统:
reboot
2创建网桥
我们需要在我们的服务器上设置网桥,以便我们的虚拟机可以从其他主机访问,就像它们是网络中的物理系统一样。
为此,我们安装了包bridge-utils
...
yum install bridge-utils
...并配置一个桥。 创建文件/ etc / sysconfig / network-scripts / ifcfg-br0
(请使用/ etc / sysconfig / network-scripts / ifcfg-eth0
文件中的IPADDR
, PREFIX
, GATEWAY,DNS1
和DNS2
值); 确保使用TYPE = Bridge
,而不是TYPE =以太网
:
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虚拟机管理程序。 在kernel / vmlinuz ...
行中,用模块
替换第一个单词kernel
。 在下一行中执行相同操作 - 在initrd / initramfs ...
行中用module
替换第一个字initrd
。 然后在根
线和第一个模块
行之前添加行内核/xen.gz dom0_mem = 1024M cpufreq = xen dom0_max_vcpus = 1 dom0_vcpus_pin
(如果有多个CPU内核,可以为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 [...] |
将默认
值更改为0
(以便默认情况
下第一个内核(Xen内核)将被引导):
[...] default=0 [...] |
完整的/boot/grub/menu.lst
应该是这样的:
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # 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 VM)软件包:
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
接下来我们将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是否已启动。 应该列出域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 ~]#