编译Linux内核

1、在http://www.kernel.org/上下载内核源代码linux-2.6.32.60.tar.xz,放在/usr/src目录下。
2、进入Linux内核源码所在的目录(cd /usr/src),解压该内核代码到/usr/src/linux-2.6.32.60下:

xz -d linux-2.6.32.60.tar.xz
tar -xvf linux-2.6.32.60.tar

执行第一条命令式可能会提示找不到xz命令,这时可以输入apt-get install xz-***(后面的不记得了,呵呵)安装xz文件解析程序
3、进入Linux内核源码解压后的目录/usr/src/linux-2.6.32.60(cd /usr/src/linux-2.6.32.60)
4、sudo make mrproper         净化解压后的源代码
5、sudo make menuconfig     对内核选项进行配置
在配置过程中会发生如下错误:
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] 错误 1
make: *** [menuconfig] 错误2
解决办法:
在终端输入:

  ①sudo apt-get install ncurses-dev

  ②再cd /usr/src/linux-2.6.32.60进入内核所在目录,再次输入sudo make menuconfig就好了!

此时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,你可以用方向键来选择,用Y键来确定。经过我多次试验,大多数选项默认就行,以下几个选项必须选择(请认真核对下面每一个选项,否则编译很有可能前功尽弃):

(1)Loadable Module support选项中,一定要选上“Module unloading”和“Automatic kernel module loading”这两项;

(2)Device Drivers--->Block Devices中一定要选上Loopback device support;

Device Drivers--->Multi-device support(RAID and LVM)”处要选上“device mapper support”;

Device Drivers--->Graphics support”, 一定要选上” Support for frame buffer devices”;

Device Drivers --->;USB support --->选上”USB Mass Storage support”(如果是在实环境中,想要更多USB支持,就全选吧。我的是在虚拟机中,用不着了)

Device Drivers --->; Network device support --->;Ethernet (10 or 100Mbit) --->; <*>; AMD PCnet32 PCI support

(3) File system--->(以下9个选项是关于ext2和ext3文件系统配置,全部选上)

Second extended fs support

Ext2 extended attributes

Ext2 POSIX Access Control Lists

Ext2 Security Labels

Ext3 journalling file system support

Ext3 extended attributes

Ext3 POSIX Access Control Lists

Ext3 Security Labels

JBB (ext3) debugging support

File system--->DOS/FAT/NT Filesystems --->选上“ NTFS file system support”;

File Systems --> Miscellaneous filesystems ---><*> Compressed ROM file system support (cramfs)

 

注意:

ext2和ext3文件系统配置很重要,也是必需的,如果对Ext3、Ext2文件的支持直接编译进内核,在你reboot时机器就会当掉,出现如下错误信息:

kernel panic : no init found ,try passing init = option to kernel.....

或者是:

VFS:Cannot open root device "hdxy" 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)

或者是:

mount: error 19 mounting ext3

pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 2

umount /initrd/proc fail: 2

Freeing unused kernel memory: 244k freed

Kernel panic – not syncing: No init found. Try passing init = option to kernel

(我的机器就是在重启之后出现第三种错误,进不去系统,郁闷死,只好重装了~~~)

(4)如果你在vmware下重新编译内核,硬盘用的是scsi的,以下选项必选:

Device Drivers --->SCSI device support ---><*>SCSI disk support

Device Drivers--->SCSI device support--->SCSI low-level drivers--->;<*>; BusLogic SCSI support


6、对于配置可选择General Setup或者选择其他的自定义选项保存后退出。
7、sudo make dep         建立模块间的依赖信息
8、sudo make clean       删除配置时留下的一些不用的文件
(7、8两步可能对于一些PC没有作用)
9、sudo make bzImage     编译内核,内核较小时可以用make zImage
10、sudo make modules    编译内核模块
当然,在编译内核时,可通过make-j<n>来加速内核的编译,n一般等于CPU数量的两倍。单核,n=2;双核,n=4.即执行sudo make -j4就可以编译了!
11、sudo make modules_install   安装内核模块
12、sudo make install           安装内核

(其实也可以直接输入make CONFIG_DEBUG_SECTION_MISMATCH=Y;make modules;make modules_install;make install 这一整串命令完成编译的)
13、cd / 后在终端输入:sudo mkinitramfs 2.6.32.60 -o /boot/initrd.img-2.6.32.60-generic
14、到此为止,构建内核完毕,第十二步把内核映象和System.map拷贝到/boot/下
#sudo cp /usr/src/linux-2.6.32.60/arch/i386/boot/bzImage /boot/vmlinuz-2.6.32.60-generic
#sudo cp System.map /boot/System.map-KERNEL_VERSION
#sudo ln -s /boot/System.map-KERNEL_VERSION /boot/System.map
15、
(1)修改grub配置文件
在终端输入:sudo update-grub2,就会把刚才编译的内核加入了Grub;(此时就可以重启了,重启后在Grub启动项里多了Ubuntu, Linux 2.6.32.60-generic)
若还需修改(在Ubuntu10.04中没有采用menu.lst,而是用的grub.cfg(/boot/grub/)),则修改grub.cfg就可以了,
在终端中输入:sudo gedit /boot/grub/grub.cfg    用root账户进入grub.cfg并编辑
(或用sudo chmod +w /boot/grub/grub.cfg改变grub.cfg的权限后在进行编辑)
如将Grub中的menuentry "Ubuntu, Linux 2.6.32.60-generic"{...}修改为menuentry "Ubuntu, Linux 2.6.32.60-liqiong"{...}(Linux 2.6.32.60-generic是我们刚才编译的内核)
(2)修改default变量
在/boot/grub/grub.cfg中,设置set default="【某个数字】"(设置Grub启动项里的默认启动项)

把所有的timeout=0改为timeout=10,也就是让grub延时10s进入系统
在Grub启动项里,从0数起,我的XP在第10项,所以set default="10",即XP就是默认的启动项了。
最后重启一切都OK了!

原文地址:https://www.cnblogs.com/libao/p/2965912.html