内核调试 · 2013-04-14 0

VMware下CentOS 6编译内核

环境信息:
    VMware下安装的CentOS 6.2
    VMware Workstation 9.0.0
    Linux version 2.6.32-220.el6.i686

环境准备:
    下载linux内核源码:
    下载的源码版本:linux-2.6.34.14

编译操作:
    1)解压源码,习惯性地解压到了/usr/src下面,实际上任意位置都无妨。
    tar -xvf linux-2.6.34.14.tar.xz
    2)cd进入解压后的源码目录内,执行环境清空操作。
   make mrproper
   3)准备配置文件,在/boot目录下面有个安装系统时生成的config-*文件,可以基于该文件上面进行配置编译。
   cp /boot/config-* ./.config
   4)配置内核信息。
   make menuconfig
   配置:

 Executable file formats / Emulations

    只选择了kernel support for ELF binaries

   Networking support

可以不管

   Device Drivers

Connector- unified userspace <-> kernelspace linker
Block devices–>
Normal floppy disk support
loopback device support
network block device support
RAM block device support

SCSI device support//如果是ide硬盘,这个可以全都不选,选择ata相关的

* SCSI device support
legacy /proc/scsi/ support
scsi disk support
scsi cdrom support
scsi generic support
Probe all LUNs on each SCSI device
 SCSI low-level drivers
* BusLogic SCSI support

PS: IDE硬盘,则选择(下面以我选择的为例,可能不是最精简的)
<*>  ATA/ATAPI/MFM/RLL support (DEPRECATED)
<*>   generic ATA/ATAPI disk support
[*]     ATA disk support
<*>   generic/default IDE chipset support
<*>   Generic PCI IDE Chipset Support
<*> Serial ATA and Parallel ATA drivers
<*>   AHCI SATA support

Fusion MPT device support
Fusion MPT ScsiHost drivers for SPI

I2C support
I2C hardware bus support
Intel PIIX4 and compatible
       USB support
*  USB Mass Storage support

      Device Drivers
Network device support
Ethernet (10 or 100Mbit) / Ethernet driver support
* AMD PCnet32 PCI support
 Virtualization
可以不管
此外需要将系统上安装好的文件系统类型全部选上(我这里将其选为built-in类型,而非模块)。
比如我的:
<*> The Extended 4 (ext4) filesystem
[*]   Ext4 extended attributes
[*]     Ext4 POSIX Access Control Lists
[*]     Ext4 Security Labels
[*]   EXT4 debugging support
[*] JBD (ext3) debugging support
[*] JBD2 (ext4) debugging support

5)编译内核,为了加快编译速度,可以添加选项-jn,其中n替换为线程数值,一般是CPU核数的两倍。
make -j8 all
6)安装内核模块。
make modules_install
PS:其实在make all和make modules_install中间还有两条命令可以操作,就是make bzImage(压缩内核)和make modules(编译模块),但是这两条命令无关紧要,可以不管。
7)将编译生成的内核文件拷贝到对应位置去,其实可以很简单就用make install命令即可,只是会自动添加一些其他东西上去,故未采用。
cp -v System.map /boot/System.map-2.6.34.14
cp -v arch/i386/boot/bzImage /boot/vmlinuz-2.6.34.14
cp -v .config /boot/config-2.6.34.14
rm -f System.map vmlinuz
ln -s vmlinuz-2.4.18 vmlinuz
ln -s System.map-2.4.18 System.map
注:
其实除了cp -v arch/i386/boot/bzImage /boot/vmlinuz-2.6.34.14是必须的之外,其余的操作可以不管。
8)为新内核创建一个ramdisk,否则系统不能引导。
mkinitrd /boot/initramfs-2.6.34.14.img 2.6.34.14
PS:后面的2.6.34.14是根据版本来填的,具体可以依据/lib/modules目录里面的目录名来填。
如果不创建ramdisk,很容易遇到一个这样的报错:

VFS:Cannot open root device “sda” or unknow-block(0,0)

Please append a correct “root=” boot option

kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)
很让人头疼的,就这玩意折腾了我N个小时了。

   9)配置grub信息。
   vim /etc/grub.conf
   新增内容:
   title CentOS (2.6.34.14)
    root (hd0,0)
    kernel /boot/vmlinuz-2.6.34.14 ro root=UUID=5ee1b1da-0889-47c0-ae3f-13b64bafeb28
    initrd /boot/initramfs-2.6.34.14.img
    PS;root=UUID=5ee1b1da-0889-47c0-ae3f-13b64bafeb28,这个是对系统上已有的grub配置“抄袭”过来的,别照搬~
   10)至此为止,已经搞定了。
   reboot
   复位系统开始引导新内核。