编译完成新内核后,会生成几个文件,这些文件是内核启动所需要的,这里简单介绍一下。
vmlinux,编译出来的最原始的内核文件,没有压缩,位于源码根目录下。该内核文件不能用来启动系统。
vmlinuz,这个就是我们要引导的内核,它一般是一个链接文件,位于根目录下。真正的文件位于/boot文件夹下。z表示压缩的内核,vm表示virtual memory的意思。linux支持虚拟内存,可利用硬盘空间作为虚拟内存使用。在编译内核时,通过make zImage或make bzImage生成zImage或bzImage原始压缩内核文件,这些内核文件位于debian:/usr/src/linux-2.6.23.9/arch/i386/boot#目录下;接着我们会把它拷贝到/boot目录下并改名为vmlinuz;最后在根目录下创建一个到该文件的同名链接文件。bzImage表示big zImage的意思,zImage是老式的内核文件格式,在新的内核版本中已不使用了,现在生成的内核是bzImage格式的内核文件。这两种内核文件的区别是,zImage解压缩内核到低端内存中(第一个640K),bzImage解压缩内核到高端内存中(1M以上)
这两个内核文件都是使用gzip软件压缩的,但文件头部内嵌有gzip解压缩代码,能在启动时自动解压缩内核。使用gzip是不能正常解压内核的。
在源码根目录生成的vmlinux是一个没有压缩的内核文件。
如果在/boot目录下存在多个版本的内核文件,则可用vmlinuz-xxxx的方式命名。但根目录下的vmlinuz链接文件名一般不变。
initrd-x.x.x.img,initrd是"initial ramdisk"的简写。作用是在内核引导前加载相应的硬件模块,为内核引导做准备。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题。initrd可使用mkinitramfs工具创建。
System.map,内核符号映射文件,位于/boot目录下,与内核名要对应。内核编译完成后,在源码根目录下就会生成一个System.map文件。我们要把它拷贝到/boot目录下并改成相关的名称。如内核名为vmlinuz-2.6.23.9,则这个内核符号映射文件就应该命名为System.map-2.6.23.9。