首页 > 代码库 > Linux -- 构建KVM虚拟化环境
Linux -- 构建KVM虚拟化环境
硬件系统的配置
硬件和BIOS中虚拟化技术的支持是KVM运行的先决条件。
在x86-64架构的处理器中,KVM必需的硬件虚拟化扩展分别为:Intel的虚拟化技术(Intel VT)和AMD的AMD-V技术。
一般在BIOS中,VT的选项通过“Advanced →Processor Configuration”来查看和设置,它的标识通常为“Intel(R) Virtualization Technology”或“Intel VT”等类似的文字说明。
除了支持必需的处理器虚拟化扩展以外,如果服务器芯片还支持VT-d,就建议在BIOS中将其打开,因为后面一些相对高级的设备的直接分配功能会需要硬件VT-d技术的支持。VT-d(Virtualization Technology for Directed I/O)是对设备I/O的虚拟化硬件支持,在BIOS中的位置可能为“Advanced→Processor Configuration”或“Advanced→System Agent (SA) Configuration”,它一般在BIOS中的标志一般为“Intel(R) VTfor Directed I/O”或“Intel VT-d”等。
下面以一台Intel Romley-EP平台的服务器为例来说明在BIOS中的设置。
1)BIOS中的Advanced选项,如图3-1所示。
2)BIOS中的VT和VT-d选项,如图3-2所示。
对于不同平台或不同厂商的BIOS,VT和VT-d等设置的位置可能是不一样的,需要根据实际的硬件情况和BIOS中的选项来灵活设置。
设置好了VT和VT-d的相关选项,保存BIOS的设置并退出,系统重启后生效。在Linux系统中,可以通过检查/proc/cpuinfo文件中的CPU特性标志(flags)来查看CPU目前是否支持硬件虚拟化。在x86和x86-64平台中,Intel系列CPU支持虚拟化的标志为“vmx”,AMD系列CPU的标志为“svm”,所以可以用如下命令行查看“vmx”或者“svm”标志。
[root@jay-linux ~]# grep -E ‘(vmx|svm)‘ /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge
mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall
nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl
xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl
vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt
tsc_deadline_timer aes xsave avx lahf_lm ida arat epb xsaveopt pln pts
dts tpr_shadow vnmi flexpriority ept vpid
<!-–此处省略多行其余CPU或core的flags输出信息 -->
2. 宿主机(Host)操作系统的安装
KVM是基于内核的虚拟化技术,要运行KVM虚拟化环境,安装一个Linux操作系统的宿主机(Host)是必需的。
KVM作为流行的开源虚拟机之一,它可以在绝大多数流行的Linux系统上编译和运行,所以依然可以选择RHEL之外的其他Linux发行版,CentOS、Fedora、Ubuntu、Debian、OpenSuse等系统都是不错的选择。
普通Linux安装的基本过程这里就不再详细描述,这里主要说明安装过程中一些值得注意的地方。
在选择哪种类型的服务器时,选择“Software Development Workstation”即可(如图3-3所示),然后选中当前页面的“Customize now”,单击“Next”按钮进入下一步去选择具体需要安装的组件并设置所需要的各个RPM包。
在选择了“Software Development Workstation”之后,在选择具体组件的界面就可以看到默认已经选择了很多的组件(如图3-4所示),这里主要需要检查一下Development这个选项中默认已经勾选了的很多的开发组件。其中,最好选中Development选项中的Development tools和Additional Development这两个组件,因为在本书的KVM编译过程中以及其他实验中可能会用到,其中包括一些比较重要的软件包,比如:gcc、git、make等(一般被默认选中)。
3. KVM的编译与安装 (重要)
下载KVM源代码
KVM作为Linux kernel中的一个module而存在,是从Linux2.6.20版本开始被完全正式加入到内核的主干开发和正式发布代码中。所以,只需要下载2.6.20版本之后Linux kernel代码即可编译和使用KVM。当然,如果是学习KVM,推荐使用最新正式发布或者正在开发中的kernel版本,如果是实际部署到生产环境中,还需要自己选择适合的稳定版本进行详尽的功能和性能测试。如果你想使用最新的处于开发中的KVM代码,你需要自己下载KVM的代码仓库,本节就是以此为例来讲解的。
总的来说,下载最新KVM源代码,主要有如下三种方式:
下载KVM项目开发中的代码仓库kvm.git。
下载Linux内核的代码仓库linux.git。
打包下载Linux内核的源代码(Tarball[3]格式)。
3.1. 下载kvm.git
KVM项目的代码是托管在Linux内核官方源码网站http://git.kernel.org上的,可以到上面去查看和下载。该网页上virt/kvm/kvm.git即是KVM项目的代码,它是最新的功能最丰富的KVM源代码库(尽管并非最稳定的)。目前,kvm.git的最主要维护者(maintainer)是来自Redhat公司的Gleb Natapov和PaoloBonzini。从http://git.kernel.org/?p=virt/kvm/kvm.git网页可以看到,kvm.git下载链接有如下3个URL,可用于下载最新的KVM的开发代码仓库。
git://git.kernel.org/pub/scm/virt/kvm/kvm.git http://git.kernel.org/pub/scm/virt/kvm/kvm.git https://git.kernel.org/pub/scm/virt/kvm/kvm.git
从这3个URL下载的内容完全一致,根据自己实际情况选择其中任一个下载即可。Linux内核相关的项目一般都使用Git[4]作为源代码管理工具,KVM当然也是用Git管理源码的。可以使用git clone命令来下载KVM的源代码,也可以使用Git工具的其他命令对源码进行各种管理,这里不详述Git的各种命令。
kvm.git的下载方式和过程,为如下命令行所示:
[root@jay-linux ~] cd kvm_demo [root@jay-linux kvm_demo]# git clone\ git://git.kernel.org/pub/scm/virt/kvm/kvm.git kvm.git Initialized empty Git repository in /root/kvm_demo/kvm.git/.git/ remote: Counting objects: 2556717, done. remote: Compressing objects: 100% (399423/399423), done. Receiving objects: 100% (2556717/2556717), 517.22 MiB | 11.21 MiB/s, done. remote: Total 2556717 (delta 2141777), reused 2546109 (delta 2131175) Resolving deltas: 100% (2141777/2141777), done. [root@jay-linux kvm_demo]# cd kvm.git [root@jay-linux kvm.git]# pwd /root/kvm_demo/kvm.git
3.2. 下载linux.git
Linux内核的官方网站为http://kernel.org,其中源代码管理网为http://git.kernel.org,可以在此网站上找到最新的linux.git代码。在源码管理网站上,我们看到有多个linux.git,我们选择Linus Torvalds[5]的源码库(也即是Linux内核的主干)。在内核源码的网页http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git中可以看到,其源码仓库也有如下3个链接可用:
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
这3个URL中源码内容是完全相同的,可以用用git clone命令复制到本地,其具体操作方式与前一种(kvm.git)的下载方式完全一样。
3.3. 下载Linux的Tarball
在Linux官方网站(http://kernel.org/)上,也提供Linux内核的Tarball文件下载;除了在其首页上单击一些Tarball之外,也可以到如下网址下载Linux内核的各个版本的Tarball。
ftp://ftp.kernel.org/pub/linux/kernel/ http://www.kernel.org/pub/linux/kernel/
kernel.org还提供一种rsync的方式下载,此处不详细叙述,请参见其官网首页的提示。
以用wget下载linux-3.4.1.tar.gz为例,有如下的命令行代码:
[root@jay-linux kvm_demo]# wget\ http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.1.tar.gz --2012-06-05 23:06:26-- http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.1.tar.gz Resolving www.kernel.org... 149.20.20.133, 149.20.4.69 Connecting to www.kernel.org|149.20.20.133|:80...connected Length: 101055487 (96M) [application/x-gzip] Saving to: "linux-3.4.1.tar.gz" 100%[====================================================================== ===============>] 101,055,487 9.13M/s in 11s 2012-06-05 23:06:37 (8.79 MB/s) - "linux-3.4.1.tar.gz" saved [101055487/101055487] [root@jay-linux kvm_demo]# ls -l total 98692 drwxr-xr-x 24 root root 4096 Jun 5 23:05 kvm.git -rw-r--r-- 1 root root 101055487 Jun 5 02:36 linux-3.4.1.tar.gz [root@jay-linux kvm_demo]# tar -zxf linux-3.4.1.tar.gz [root@jay-linux kvm_demo]# ls -l total 98696 drwxr-xr-x 24 root root 4096 Jun 5 23:05 kvm.git drwxrwxr-x 23 root root 4096 Jun 1 15:18 linux-3.4.1 -rw-r--r-- 1 root root 101055487 Jun 5 02:36 linux-3.4.1.tar.gz
3.4. 通过kernel.org的镜像站点下载
由于Linux的源代码量比较大,如果只有美国一个站点可供下载,那么速度会较慢,服务器压力也较大。所以,kernel.org在世界上多个国家和地区都有一些镜像站点,而且一些Linux开源社区的爱好者们也自发建立了不少kernel.org的镜像,在中国的镜像站点中,推荐大家从如下两个镜像站点下载Linux相关的代码及其他源码(在本书写作之时,它们并没有提供git形式的代码仓库kvm.git或linux.git的下载),访问速度比较快。
一个是清华大学开源镜像站:http://mirror.tuna.tsinghua.edu.cn/,其中的链接地址http://mirror.tuna.tsinghua.edu.cn/kernel/linux/kernel/与http://www.kernel.org/pub/linux/kernel/就是同步的,用起来比较方便。
另外一个是北京交通大学的一个开源镜像站:
http://mirror.bjtu.edu.cn/kernel/linux/kernel/
还有如下两个镜像站可以推荐给大家:
网易开源镜像站,http://mirrors.163.com/
搜狐开源镜像站,http://mirrors.sohu.com/
(在本书写作之时,网易和搜狐的两个镜像站主要提供了一些Linux发行版的ISO及其软件仓库,而没有提供linux kernel的源码下载。)
配置KVM
上面三种方式下载的源代码都是可以同样地进行配置和编译,本章以开发中的最新源代码仓库kvm.git来讲解KVM的配置和编译等。KVM是作为Linux内核中的一个module存在的,而kvm.git是一个包含了最新的KVM模块开发中代码完整的Linux内核源码仓库。它的配置方式,与普通的Linux内核配置完全一样,只是需要注意将KVM相关的配置选择为编译进内核或者编译为模块。
在kvm.git(Linux kernel)代码目录下,运行“make help”命令可以得到一些关于如何配置和编译kernel的帮助手册,命令行如下:
[root@jay-linux kvm.git]# make help Cleaning targets: clean - Remove most generated files but keep the config and enough build support to build external modules mrproper - Remove all generated files + config + various backup files distclean - mrproper + remove editor backup and patch files Configuration targets: config - Update current config utilising a line-oriented program nconfig - Update current config utilising a ncurses menu based program menuconfig - Update current config utilising a menu based program xconfig - Update current config utilising a QT based front-end <!-此处省略数十行帮助信息 -> make W=n [targets] Enable extra gcc checks, n=1,2,3 where 1: warnings which may be relevant and do not occur too often 2: warnings which occur quite often but may still be relevant 3: more obscure warnings, can most likely be ignored Multiple levels can be combined with W=12 or W=123 Execute "make" or "make all" to build all targets marked with [*] For further info see the ./README file
对KVM或Linux内核配置时常用的配置命令的一些解释如下:
(1)make config
基于文本的最为传统的也是最为枯燥的一种配置方式,但是它可以适用于任何情况之下,这种方式会为每一个内核支持的特性向用户提问,如果用户回答“y”,则把特性编译进内核;回答“m”,则该特性作为模块进行编译;回答“n”,则表示不对该特性提供支持。输入“?”则显示该特性的帮助信息,在了解之后再决定处理该特性的方式;在回答每个问题前,必须考虑清楚,如果在配置过程中因为失误而给了错误的回答,就只能按“ctrl+c”强行退出然后重新配置了。
(2)make oldconfig
make oldconfig和make config类似,但是它的作用是在现有的内核设置文件基础上建立一个新的设置文件,只会向用户提供有关新内核特性的问题,在新内核升级的过程中,make oldconfig非常有用,用户将现有的配置文件.config复制到新内核的源码中,执行make oldconfig,此时,用户只需要回答那些针对新增特性的问题。
(3)make silentoldconfig
和上面make oldconfig一样,但在屏幕上不再出现已在.config中配置好的选项。
(4)make menuconfig
基于终端的一种配置方式,提供了文本模式的图形用户界面,用户可以通过光标移动来浏览所支持的各种特性。使用这用配置方式时,系统中必须安装有ncurses库,否则会显示“Unable to find the ncurses libraries”的错误提示。其中“y”、“n”、“m”、“?”键的选择功能与前面make config中介绍的一致。
(5)make xconfig
基于XWindow的一种配置方式,提供了漂亮的配置窗口,不过只有能够在X Server上运行X桌面应用程序时才能够使用,它依赖于QT,如果系统中没有安装QT库,则会出现“Unable to find any QT installation”的错误提示。
(6)make gconfig
与make xconfig类似,不同的是make gconfig依赖于GTK库。
(7)make defconfig
按照内核代码中提供的默认配置文件对内核进行配置(在Intel x86_64平台上,默认配置为arch/x86/configs/x86_64_defconfig),生成.config文件可以用作初始化配置,然后再使用make menuconfig进行定制化配置。
(8)make allyesconfig
尽可能多地使用“y”设置内核选项值,生成的配置中包含了全部的内核特性。
(9)make allnoconfig
除必须的选项外,其他选项一律不选 (常用于嵌入式Linux系统的编译)。
(10)make allmodconfig
尽可能多地使用“m”设置内核选项值来生成配置文件。
(11)make localmodconfig
会执行 lsmod 命令查看当前系统中加载了哪些模块 (Modules),并将原来的.config中不需要的模块去掉,仅保留前面 lsmod 命令查出来的这些模块,从而简化了内核的配置过程。这样做确实方便了很多,但是也有个缺点:该方法仅能使编译出的内核支持当前内核已经加载的模块。因为该方法使用的是 lsmod 查询得到的结果,如果有的模块当前没有加载,那么就不会编到新的内核中。
下面以make menuconfig为例介绍一下如何选择KVM相关的配置。运行make menuconfig后显示的界面如图3-6所示。
选择了Virtualization之后,进入其中进行详细配置,包括选中KVM、选中对处理器的支持(比如:KVM for Intel processors support,KVM for AMD processors support)等,如图3-7所示。
在配置完成之后,就会在kvm.git的目录下面生成一个.config文件,最好检查一下KVM相关的配置是否正确。在本次配置中,与KVM直接相关的几个配置项的主要情况如下:
CONFIG_HAVE_KVM=y CONFIG_HAVE_KVM_IRQCHIP=y CONFIG_HAVE_KVM_EVENTFD=y CONFIG_KVM_APIC_ARCHITECTURE=y CONFIG_KVM_MMIO=y CONFIG_KVM_ASYNC_PF=y CONFIG_HAVE_KVM_MSI=y CONFIG_VIRTUALIZATION=y CONFIG_KVM=m CONFIG_KVM_INTEL=m # CONFIG_KVM_AMD is not set CONFIG_KVM_MMU_AUDIT=y
编译KVM
在对KVM源代码进行了配置之后,编译KVM就是一件比较容易的事情了。它的编译过程就完全是一个普通Linux内核编译的过程,需要经过编译kernel、编译bzImage和编译module等三个步骤。编译bzImage这一步不是必须的,在本章示例中,config中使用了initramfs,所以这里需要这个bzImage用于生成initramfs image。另外,在最新的Linux kernel代码中,根据Makefile中的定义可以看出,直接执行“make”或“make all”命令就可以将这里提及的3个步骤全部包括在内。本节是为了更好地展示编译的过程,才将编译的步骤分为这三步来来解释。
第一步,编译kernel的命令为“make vmlinux ”,其编译命令和输出如下:
[root@jay-linux kvm.git]# makevmlinux -j 20 make[1]: Nothing to be done for ‘all‘. HOSTCC arch/x86/tools/relocs CHK include/linux/version.h HOSTCC scripts/basic/fixdep CHK include/generated/utsrelease.h HOSTCC scripts/kallsyms HOSTCC scripts/pnmtologo HOSTCC scripts/genksyms/genksyms.o CC scripts/mod/empty.o <!-此处省略数千行编译时的输出信息 -> LINK vmlinux LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o LD init/built-in.o KSYM .tmp_kallsyms1.o KSYM .tmp_kallsyms2.o LD vmlinux #这里就是编译、链接后生成了启动所需的Linux kernel文件 SORTEX vmlinux sort done marker at 9725f0 SYSMAP System.map
其中,编译命令中“-j”参数并非必须的,它是让make工具用多进程来编译,比如上面命令中提到的“-j 20”,会让make工具最多创建20个GCC进程同时来执行编译任务。在一个比较空闲的系统上面,有一个推荐值作为-j参数的值,即大约为2倍于系统上的CPU的core的数量(CPU超线程也算core)。
第二步,执行编译bzImage的命令“make bzImage”,其输出如下:
[root@jay-linux kvm.git]# make bzImage make[1]: Nothing to be done for ‘all‘. make[1]: Nothing to be done for ‘relocs‘. CHK include/linux/version.h CHK include/generated/utsrelease.h CALL scripts/checksyscalls.sh CHK include/generated/compile.h make[3]: ‘arch/x86/realmode/rm/realmode.bin‘ is up to date. CC arch/x86/boot/a20.o AS arch/x86/boot/bioscall.o <!-此处省略数十行编译时的输出信息 -> CC arch/x86/boot/video-bios.o LD arch/x86/boot/setup.elf OBJCOPY arch/x86/boot/setup.bin OBJCOPY arch/x86/boot/vmlinux.bin HOSTCC arch/x86/boot/tools/build BUILD arch/x86/boot/bzImage #这里生成了我们需要的bzImage文件 Kernel: arch/x86/boot/bzImage is ready (#4)
第三步,编译kernel和bzImage之后编译内核的模块,命令为“make modules”,其命令行输出如下:
[root@jay-linux kvm.git]# make modules -j 20 make[1]: Nothing to be done for ‘all‘. make[1]: Nothing to be done for ‘relocs‘. CHK include/linux/version.h CHK include/generated/utsrelease.h CALL scripts/checksyscalls.sh CC [M] arch/x86/kvm/vmx.o <!-此处省略数千行编译时的输出信息 -> IHEX firmware/mts_gsm.fw IHEX firmware/mts_edge.fw H16TOFW firmware/edgeport/boot.fw H16TOFW firmware/edgeport/boot2.fw H16TOFW firmware/edgeport/down.fw H16TOFW firmware/edgeport/down2.fw IHEX firmware/edgeport/down3.bin IHEX2FW firmware/whiteheat_loader.fw IHEX2FW firmware/whiteheat.fw IHEX2FW firmware/keyspan_pda/keyspan_pda.fw IHEX2FW firmware/keyspan_pda/xircom_pgs.fw
安装KVM
编译完KVM之后,下面介绍如何安装KVM。
KVM的安装包括两个步骤:module的安装、kernel与initramfs的安装。
(1)安装module
通过“make modules_install”命令可以将编译好的module安装到相应的目录之中,在默认情况下module被安装到/lib/modules/$kernel_version/kernel目录之中。
[root@jay-linux kvm.git]# make modules_install INSTALL arch/x86/crypto/aes-x86_64.ko INSTALL arch/x86/kernel/microcode.ko INSTALL arch/x86/kvm/kvm-intel.ko INSTALL arch/x86/kvm/kvm.ko INSTALL arch/x86/oprofile/oprofile.ko <!-此处省略千余行安装时的输出信息 -> INSTALL /lib/firmware/edgeport/down3.bin INSTALL /lib/firmware/whiteheat_loader.fw INSTALL /lib/firmware/whiteheat.fw INSTALL /lib/firmware/keyspan_pda/keyspan_pda.fw INSTALL /lib/firmware/keyspan_pda/xircom_pgs.fw DEPMOD 3.5.0-rc2+
安装好module之后,可以查看一下相应的安装路径,可看到kvm模块也已经安装,如下所示:
[root@jay-linux kvm.git]# ls -l /lib/modules/3.5.0-rc2+/kernel/ total 28 drwxr-xr-x 3 root root 4096 Jun 13 08:58 arch drwxr-xr-x 3 root root 4096 Jun 13 08:58 crypto drwxr-xr-x 36 root root 4096 Jun 13 08:58 drivers drwxr-xr-x 25 root root 4096 Jun 13 08:58 fs drwxr-xr-x 5 root root 4096 Jun 13 08:58 lib drwxr-xr-x 22 root root 4096 Jun 13 08:58 net drwxr-xr-x 9 root root 4096 Jun 13 08:58 sound [root@jay-linux kvm.git]# ls -l /lib/modules/3.5.0-rc2+/kernel/arch/x86/kvm/total 528 -rw-r--r-- 1 root root 176861 Jun 13 08:58 kvm-intel.ko -rw-r--r-- 1 root root 357867 Jun 13 08:58 kvm.ko
(2)安装kernel和initramfs
通过“make install”命令可以安装kernel和initramfs,命令行输出如下:
[root@jay-linux kvm.git]# make install sh /root/kvm_demo/kvm.git/arch/x86/boot/install.sh 3.5.0-rc2+ arch/x86/boot/bzImage \ System.map "/boot" [root@jay-linux kvm.git]# ls -l /boot/ -rw-r--r-- 1 root root 2775664 Jun 13 08:45 vmlinuz-3.5.0-rc2+ -rw-r--r-- 1 root root 1825462 Jun 13 08:45 System.map-3.5.0-rc2+ lrwxrwxrwx 1 root root 24 Jun 13 08:45 vmlinuz -> /boot/vmlinuz-3.5.0-rc2+ lrwxrwxrwx 1 root root 27 Jun 13 08:45 System.map -> /boot/System.map-3.5.0-rc2+ dr-xr-xr-x 4 root root 4096 Jun 13 08:45 ./ -rw-r--r-- 1 root root 4672632 Jun 13 08:45 initramfs-3.5.0-rc2+.img drwxr-xr-x 2 root root 4096 Jun 13 08:45 grub/
可见,在/boot目录下生成了内核(vmlinuz)和initramfs等内核启动所需的文件。
在运行make install之后,grub配置文件(如:/boot/grub/grub.conf)中也自动添加了一个grub选项,如下所示:
title Red Hat Enterprise Linux Server (3.5.0-rc2+) root (hd0,0) kernel /boot/vmlinuz-3.5.0-r2+ ro root=UUID=1a65b4bb-cd9b-4bbf-97ff-7e1f7698d3db r initrd /boot/initramfs-3.5.0-r2+.img
检查了grub之后,重新启动系统,选择刚才为了KVM而编译、安装的内核启动。
系统启动后,登录进入系统,在通常情况下,系统启动时默认已经加载了kvm和kvm_intel这两个模块;如果没有加载,请手动用modprobe命令依次加载kvm和kvm_intel模块。
[root@jay-linux ~]# modprobe kvm [root@jay-linux ~]# modprobe kvm_intel [root@jay-linux ~]# lsmod | grep kvm kvm_intel 112487 0 kvm 206544 1 kvm_intel
确认KVM相关的模块加载成功后,检查/dev/kvm这个文件,它是kvm内核模块提供给用户空间的qemu-kvm程序使用的一个控制接口,它提供了客户机(Guest)操作系统运行所需要的模拟和实际的硬件设备环境。
[root@jay-linux ~]# ls -l /dev/kvm crw-rw---- 1 root root 10, 232 Jun 6 15:45 /dev/kvm
4. qemu-kvm的编译与安装 (重要)
除了在内核空间的kvm模块之外,在用户空间需要QEMU[6]来模拟所需要CPU和设备模型以及用于启动客户机进程,这样才有了一个完整的KVM运行环境。而qemu-kvm是为了针对KVM专门做了修改和优化的QEMU分支[7],在本书写作的2012年,qemu-kvm分支里面的小部分特性还没有完全合并进入到qemu的主干代码之中,所以本书中采用qemu-kvm来讲解。
下载qemu-kvm源代码
目前的QEMU项目针对KVM的代码分支qemu-kvm也是由Redhat公司的Gleb Natapov和Paolo Bonzini作维护者(Maintainer),代码也是托管在kernel.org上。
qemu-kvm开发代码仓库的网页连接为:http://git.kernel.org/?p=virt/kvm/qemu-kvm.git
其中,可以看到有如下3个URL连接可供下载开发中的最新qemu-kvm的代码仓库。
git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git http://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git https://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git
可以根据自己实际需要选择3个中任一个用git clone命令下载即可,它们是完全一样的。
另外,可以到sourceforge.net的如下链接中根据需要下载qemu-kvm各个发布版本的代码压缩包(笔者建议使用最新的正式发布版本,因为它的功能更多,同时也比较稳定):
http://sourceforge.net/projects/kvm/files/qemu-kvm/ http://qemu-project.org/Download (从2013年开始直接到这里下载普通的QEMU)
在本节后面讲解编译时,是以下载开发中的最新的qemu-kvm.git为例的,获取其代码仓库过程如下:
[root@jay-linux kvm_demo]# git clone\ git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git qemu-kvm.git Initialized empty Git repository in /root/kvm_demo/qemu-kvm.git/.git/ remote: Counting objects: 145222, done. remote: Compressing objects: 100% (35825/35825), done. remote: Total 145222 (delta 114656), reused 137663 (delta 107444) Receiving objects: 100% (145222/145222), 40.83 MiB | 10.33 MiB/s, done. Resolving deltas: 100% (114656/114656), done. [root@jay-linux kvm_demo]# cdqemu-kvm.git [root@jay-linux kvm.git]# pwd /root/kvm_demo/qemu-kvm.git
配置和编译qemu-kvm
qemu-kvm的配置并不复杂,在通常情况下,可以直接运行代码仓库中configure文件进行配置即可。当然,如果对其配置并不熟悉,可以运行“./configure --help”命令查看配置的一些选项及其帮助信息。
显示配置的帮助手册信息如下:
[root@jay-linux qemu-kvm.git]# ./configure --help Usage: configure [options] Options: [defaults in brackets after descriptions] Standard options: --help print this message --prefix=PREFIX install in PREFIX [/usr/local] --interp-prefix=PREFIX where to find shared libraries, etc. use %M for cpu name [/usr/gnemul/qemu-%M] --target-list=LIST set target list (default: build everything) Available targets: i386-softmmu x86_64-softmmu <!-此处省略百余行帮助信息的输出 -> --disable-guest-agent disable building of the QEMU Guest Agent --enable-guest-agent enable building of the QEMU Guest Agent --with-coroutine=BACKEND coroutine backend. Supported options: gthread, ucontext, sigaltstack, windows NOTE: The object files are built at the place where configure is launched
执行configure文件进行配置的过程如下:
[root@jay-linux qemu-kvm.git]# ./configure Install prefix /usr/local BIOS directory /usr/local/share/qemu binary directory /usr/local/bin library directory /usr/local/lib include directory /usr/local/include config directory /usr/local/etc Manual directory /usr/local/share/man ELF interp prefix /usr/gnemul/qemu-%M Source path /root/kvm_demo/qemu-kvm.git C compiler gcc Host C compiler gcc <!--此处省略数十行 --> VNC support yes #通常需要通过VNC连接到客户机中 <!--此处省略十余行 --> KVM support yes #这是对KVM的支持 TCG interpreter no KVM device assig. yes #这是对KVM中VT-d功能的支持 <!--此处省略十余行 --> OpenGL support yes libiscsi support no build guest agent yes coroutine backend ucontext
需要注意的是,上面命令行输出的KVM相关的选项需要是配置为yes,另外,一般VNC的支持也是配置为yes的(因为通常需要用VNC连接到客户机中)。
经过配置之后,进行编译就很简单了,直接执行make即可进行编译,如下所示:
[root@jay-linux qemu-kvm.git]# make -j 20 GEN config-host.h GEN trace.h GEN qemu-options.def GEN qmp-commands.h GEN qapi-types.h GEN qapi-visit.h GEN tests/test-qapi-types.h GEN tests/test-qapi-visit.h GEN tests/test-qmp-commands.h CC libcacard/cac.o CC libcacard/event.o <!--此处省略数百行的编译时输出信息 --> CC x86_64-softmmu/target-i386/cpu.o CC x86_64-softmmu/target-i386/machine.o CC x86_64-softmmu/target-i386/arch_memory_mapping.o CC x86_64-softmmu/target-i386/arch_dump.o CC x86_64-softmmu/target-i386/kvm.o CC x86_64-softmmu/target-i386/hyperv.o LINK x86_64-softmmu/qemu-system-x86_64
可以看到,最后有编译生成qemu-system-x86_64文件,它就是我们常用的qemu-kvm的命令行工具(在多数Linux发行版中自带的qemu-kvm软件包的命令行是qemu-kvm,只是名字不同而已)。
安装qemu-kvm
编译完成之后,运行“make install”命令即可安装qemu-kvm,其过程如下:
[root@jay-linux qemu-kvm.git]# make install | tee make-install.log install -d -m 0755 "/usr/local/share/qemu" install -d -m 0755 "/usr/local/etc/qemu" install -c -m 0644 /root/kvm_demo/qemu-kvm.git/sysconfigs/target/target-x86_64.conf "/usr/local/etc/qemu" install -c -m 0644 /root/kvm_demo/qemu-kvm.git/sysconfigs/target/cpus-x86_64.conf "/usr/local/share/qemu" install -d -m 0755 "/usr/local/bin" install -c -m 0755 vscclient qemu-ga qemu-nbd qemu-img qemu-io "/usr/local/bin" install -d -m 0755 "/usr/local/libexec" <!--此处省略数行的安装时输出信息 --> make[1]: Entering directory ‘/root/kvm_demo/qemu-kvm.git/x86_64-softmmu‘ install -m 755 qemu-system-x86_64 "/usr/local/bin" strip "/usr/local/bin/qemu-system-x86_64" make[1]: Leaving directory ‘/root/kvm_demo/qemu-kvm.git/x86_64-softmmu‘
qemu-kvm安装过程的主要任务有这几个:创建qemu的一些目录,复制一些配置文件到相应的目录下,复制一些firmware文件(如:sgabios.bin, kvmvapic.bin)到目录下以便qemu-kvm的命令行启动时可以找到对应的固件提供给客户机使用,复制keymaps到相应的目录下以便在客户机中支持各种所需键盘类型,复制qemu-system-x86_64、qemu-img等可执行程序到对应的目录下。下面的一些命令行检查了qemu-kvm被安装了之后的系统状态。
[root@jay-linux qemu-kvm.git]# which qemu-system-x86_64 /usr/local/bin/qemu-system-x86_64 [root@jay-linux qemu-kvm.git]# which qemu-img /usr/local/bin/qemu-img [root@jay-linux qemu-kvm.git]# ls /usr/local/share/qemu/ bamboo.dtb mpc8544ds.dtb petalogix-ml605.dtb pxe-pcnet.rom slof.bin vgabios-vmware.bin bios.bin multiboot.bin petalogix-s3adsp1800.dtb pxe-rtl8139.rom spapr-rtas.bin cpus-x86_64.conf openbios-ppc ppc_rom.bin pxe-virtio.rom vgabios.bin keymaps openbios-sparc32 pxe-e1000.rom qemu-icon.bmp vgabios-cirrus.bin kvmvapic.bin openbios-sparc64 pxe-eepro100.rom s390-zipl.rom vgabios-qxl.bin linuxboot.bin palcode-clipper pxe-ne2k_pci.rom sgabios.bin vgabios-stdvga.bin [root@jay-linux qemu-kvm.git]# ls /usr/local/share/qemu/keymaps/ ar common de en-gb es fi fr fr-ca hr is ja lv modifiers nl-be pl pt-br sl th bepo da de-ch en-us et fo fr-be fr-ch hu it lt mk nl no pt ru sv tr
由于qemu-kvm是用户空间的程序,安装之后不用重启系统,直接用qemu-system-x86_64、qemu-img这样的命令行工具即可使用qemu-kvm了。
5.客户机(Guest)的安装
安装客户机(Guest)之前,我们需要创建一个镜像文件或者磁盘分区等来存储客户机中的系统和文件,关于客户机镜像有很多种的制作和存储方式(将在后面的第4章中进行详细的介绍),本节只是为了快速地演示安装一个客户机,采用了本地创建一个镜像文件,然后让镜像文件作为客户机的硬盘,将客户机操作系统(以RHEL6.3为例)安装在其中。
首先,需要创建一个镜像文件,可以使用dd工具,如下的命令行创建了一个8GB大小的镜像文件rhel6u3.img:
[root@jay-linux kvm_demo]# dd if=/dev/zero of=rhel6u3.img bs=1M\ count=8192 8192+0 records in 8192+0 records out 8589934592 bytes (8.6 GB) copied, 76.9331 s, 112 MB/s
然后,准备一个RHEL6.3安装所需的ISO文件,如下所示:
[root@jay-linux kvm_demo]# ls RHEL6.3-Server-x86_64-DVD1.iso RHEL6.3-Server-x86_64-DVD1.iso
启动客户机,并在其中用准备好的ISO安装系统,命令行如下:
[root@jay-linux kvm_demo]#qemu-system-x86_64 -m 2048 -smp 4–boot order=cd -hda /root/kvm_demo/rhel6u3.img -cdrom /root/kvm_demo/ RHEL6.3-Server-x86_64-DVD1.iso VNC server running on ‘::1:5900‘
其中,-m 2048是给客户机分配2048MB内存,-smp 4是给客户机分配4个CPU,-boot order=cd是指定系统的启动顺序为光驱(c: CD-ROM)、硬盘(d:hard Disk),-hda **是分配给客户机的IDE硬盘(即前面准备的镜像文件),-cdrom **是分配客户机的光驱。在默认情况下,QEMU会启动一个VNC server端口(如上面的::1:5900),可以用vncviewer[8]工具来连接到QEMU的VNC端口查看客户机。
通过启动时的提示,这里可以使用“vncviewer :5900”命令连接到QEMU启动的窗口。根据命令行制定的启动顺序,当有CDROM时,客户机默认会从光驱引导,启动后即可进入到客户机系统安装界面如图3-8所示。
可以选择Install安装客户机操作系统,和安装普通Linux系统类似,根据需要做磁盘分区、选择需要的软件包等,安装过程中的一个快照如图3-9所示。
在系统安装完成后,客户机中安装程序提示,如图3-10所示。
和安装普通的Linux系统一样,完成安装后,重启系统即可进入到刚才安装的客户机操作系统。
6.启动属于你的第一个KVM客户机
在安装好了系统之后,就可以使用镜像文件来启动并登录到自己安装的系统之中了。通过如下的命令行即可启动一个KVM的客户机。
[root@jay-linux kvm_demo]# qemu-system-x86_64 -m 2048 -smp 4 –hda /root/kvm_demo/rhel6u3.img VNC server running on ‘::1:5900‘
用vncviewer命令(此处命令为vncviewer :5900)查看客户机的启动情况,客户机启动过程中的状态,如图3-11所示。
客户机启动完成后的登录界面如图3-12所示。
在通过VNC链接到QEMU窗口后,可以按快捷键“Ctrl+Alt+2”切换到QEMU监视器窗口,在监视器窗口中可以执行一些命令,比如执行“info kvm”命令来查看当前QEMU是否使用着KVM,如图3-13所示(显示为kvm support: enabled)。
用快捷键“Ctrl+Alt+1”切换回普通的客户机查看窗口,就可以登录或继续使用客户机系统了。至此,你就已经启动了属于自己的第一个KVM客户机,尽情享受KVM虚拟化带来的快乐吧!
备注:
编译kvm和qemu-kvm是掌握KVM必须的最基础也是不可或缺的技能。其中的配置和编译kvm(或Linux kernel)是最复杂也是非常重要的环节,理解这环节对Linux kernel相关技术(包括KVM)的学习具有非常重要的价值。
参考: http://book.51cto.com/art/201311/416155.htm
本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1554807
Linux -- 构建KVM虚拟化环境