(KVM连载)3.3.3 编译KVM

3.3.3 编译KVM

在对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]# make vmlinux -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参数的值,即大约等于系统上的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

master

Stay hungry, stay foolish.

5 Comments

  1. 杰哥 ,按照你的书来,配置KVM没问题,但编译KVM是报错,是不是CPU不支持虚拟化?CPU型号是Intel(R) Xeon(R) CPU E5420 ,在BIOS里只有 Advanced->Intel(R) Virtualization Technology 没看到VT和VT-d选项

    • 你这CPU时主流的服务器CPU,当然支持VT了,就是你说的那个,VT就是Virtualization Technology的缩写呢。
      另外,如果你时编译时的错误,和你硬件没有任何关系的啊,时编译环境或者源代码的问题。

      • 杰哥,问题已经解决了,是我的系统有问题,少了个bc.x86_64软件包。

  2. 杰哥,在编译内核部分,它编译到一半就自己关掉了。。这是怎么回事啊

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

*