为了学习modules编程,不得不重新编译linux内核,因为ubuntu自带那个内核不是标准的内核,有大量的改动。
起初编译了半小时,发现make报错,是空间不够。
root@lzd-laptop:/usr/src/my_sda5/linux-2.6.30.6# df -h
Filesystem Size Used Avail Use% Mounted on
/host/ubuntu/disks/root.disk
1.4G 884M 465M 66% /
2.9G 2.1G 737M 74% /usr
/dev/sda5 4.9G 2.1G 2.9G 43% /usr/src/my_sda5
root@lzd-laptop:/usr/src/my_sda5/linux-2.6.30.6#
看到上面的结果,我哭了,不够用。还得重装ubuntu?不甘心。
然后我把windows分区挂到了/usr/src/sda5目录下,make的时候发现不能创建符号连接,vfat不支持ext3的符号连接,这时我又了。
重新装ubuntu吧,装完后。
lzd@lzd-laptop:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda4 8.2G 2.4G 5.4G 31% /
/dev/sda2 198M 17M 171M 9% /boot
lzd@lzd-laptop:~$
ok(血的教训,不要太吝啬,给ubuntu大点的空间,不然编译内核时不够用)
1.下载内核源代码
2.登录为root用户
$su
3.解压内核到指定目录,就用/usr/src吧。
#tar xvjf linux-2.6.25.7.tar.bz2 -C your_dir(建议打上最新的补丁)
#cd linux_dir
#patch -p1 <../patch_file
4.#make mrproper (确保源代码目录下没有不正确的.o文件 .config文件等,刚下载的内核就不用了)
5.把ubuntu系统默认的配置文件拷贝过来
#cp /boot/config* .config
6.#make menuconfig(需要这个图形库#apt-get install libncurses5-dev)
把modules的支持选上,配置的时候要注意在alsa中选上你的声卡驱动,因为ubuntu的默认配置是不安装alsa的,
所以这里要配置下你的声卡,不然会没声音的哦。 血的教训。
7.#make(漫长的等待,从6点编译到8点,听说有加速的软件,没用过,以后在弄)
内核与modules都编译好了。
8.make install
很妙的install呵呵,省的你自己把内核镜像文件拷贝到/boot了,它还自动的创建了些软连接
如下:
root@lzd-laptop:/boot# ls -l
total 14550
-rw-r--r-- 1 root root 422667 2008-06-18 14:11 abi-2.6.24-19-generic
lrwxrwxrwx 1 root root 13 2009-09-10 08:11 config -> config-2.6.31
-rw-r--r-- 1 root root 80049 2008-06-18 14:11 config-2.6.24-19-generic
-rw-r--r-- 1 root root 95705 2009-09-10 08:11 config-2.6.31 (我的新配置,呵呵,其实跟上面的差不多)
drwxr-xr-x 2 root root 1024 2009-09-10 08:19 grub
-rw-r--r-- 1 root root 7888309 2009-09-09 16:04 initrd.img-2.6.24-19-generic
drwx------ 2 root root 12288 2009-09-09 19:47 lost+found
-rw-r--r-- 1 root root 103204 2007-09-28 06:06 memtest86+.bin
lrwxrwxrwx 1 root root 17 2009-09-10 08:11 System.map -> System.map-2.6.31 (install的功劳)
-rw-r--r-- 1 root root 905146 2008-06-18 14:11 System.map-2.6.24-19-generic
-rw-r--r-- 1 root root 1008830 2009-09-10 08:11 System.map-2.6.31
lrwxrwxrwx 1 root root 14 2009-09-10 08:11 vmlinuz -> vmlinuz-2.6.31 (install的功劳)
-rw-r--r-- 1 root root 1920472 2008-06-18 14:11 vmlinuz-2.6.24-19-generic
-rw-r--r-- 1 root root 2387840 2009-09-10 08:11 vmlinuz-2.6.31 (install的功劳)
root@lzd-laptop:/boot#
9.make modules_install
之前ubuntu的模块文件夹 2.6.24-19-generic 大小:
root@lzd-laptop:/lib/modules/2.6.24-19-generic# du -sh
109M .
之后新内核 2.6.31 文件夹的大小:
root@lzd-laptop:/lib/modules/2.6.31# du -sh
519M .
我的modules还真多,呵呵。
10.制作initrd镜像,不用学内核的配置,就是make menuconfig应该怎么选。呵呵,懒人之道。
#mkinitramfs -o initrd.img-2.6.31 2.6.31 ,将在当前目录下生成initrd.img-2.6.31这个镜像。
不知道它和ramdisk有多大的区别?initrd是什么?请看后面。
root@lzd-laptop:/boot# mkinitramfs -o initrd.img-2.6.31 2.6.31
root@lzd-laptop:/boot# ls -lh
total 67M
-rw-r--r-- 1 root root 413K 2008-06-18 14:11 abi-2.6.24-19-generic
lrwxrwxrwx 1 root root 13 2009-09-10 08:11 config -> config-2.6.31
-rw-r--r-- 1 root root 79K 2008-06-18 14:11 config-2.6.24-19-generic
-rw-r--r-- 1 root root 94K 2009-09-10 08:11 config-2.6.31
drwxr-xr-x 2 root root 1.0K 2009-09-10 13:45 grub
-rw-r--r-- 1 root root 7.6M 2009-09-09 16:04 initrd.img-2.6.24-19-generic
-rw-r--r-- 1 root root 52M 2009-09-10 14:25 initrd.img-2.6.31 (就是这个了)
drwx------ 2 root root 12K 2009-09-09 19:47 lost+found
-rw-r--r-- 1 root root 101K 2007-09-28 06:06 memtest86+.bin
lrwxrwxrwx 1 root root 17 2009-09-10 08:11 System.map -> System.map-2.6.31
-rw-r--r-- 1 root root 884K 2008-06-18 14:11 System.map-2.6.24-19-generic
-rw-r--r-- 1 root root 986K 2009-09-10 08:11 System.map-2.6.31
lrwxrwxrwx 1 root root 14 2009-09-10 08:11 vmlinuz -> vmlinuz-2.6.31
-rw-r--r-- 1 root root 1.9M 2008-06-18 14:11 vmlinuz-2.6.24-19-generic
-rw-r--r-- 1 root root 2.3M 2009-09-10 08:11 vmlinuz-2.6.31
11.配置grub
从/boot/grub/menu.lst 文件拷贝相应的条目,更改如下
## ## End Default Options ##
title Ubuntu 8.04.1, kernel 2.6.31
root (hd0,1)
kernel /vmlinuz-2.6.31 root=UUID=b8bcff90-3175-4682-9b7c-3822c99dc84e ro quiet splash locale=zh_CN
initrd /initrd.img-2.6.31
quiet
现在重启试试你的新内核吧,Good luck! :-)
附:
以下是转载前辈的文章。以后作嵌入式可能会用到。
initrd是什么?
2009-04-11 11:16
initrd是什么?
-------------------------------------------------
initrd = init ramdisk,是一个启动时存在于内存的文件系统。 initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。
Linux启动一定要用initrd么?
-------------------------------------------------
如果把需要的功能全都编译到内核中(非模块方式),只需要一个内核文件即可。initrd能够减小启动内核的体积并增加灵活性,如果你的内核以模块方式支持某种文件系统(例如ext3, UFS),而启动阶段的驱动模块放在这些文件系统上,内核是无法读取文件系统的,从而只能通过initrd的虚拟文件系统来装载这些模块。这里有些人会问: 既然内核此时不能读取文件系统,那内核的文件是怎么装入内存中的呢?答案很简单,Grub是file-system sensitive的,能够识别常见的文件系统。
如何察看initrd的内容?
-------------------------------------------------
#cd /lib/modules/`uname -r`
#mkinitrd /tmp/initrd.`uname -r`.img `uname -r`
#cd /tmp
#mv initrd.`uname -r`.img initrd.`uname -r`.img.gz(initrd使用gzip压缩,如果不改名字的话,后面无法解压缩)
#gunzip initrd.`uname -r`.img.gz
#file initrd.`uname -r`.img(不同的linux操作系统,这个文件格式有不同,在RHEL4中,这个文件是cpio的,在其他的可能是ext2的,此处使用file命令,察看格式)
如果是cpio:
#mkdir /mnt/tmp
#cd /mnt/tmp
#cpio -idmv
如果是ext2:
#mount -o loop /tmp/initrd.`uname -r` /mnt/tmp
#ls -al /mnt/tmp
如何修改initrd?
-------------------------------------------------
通过上面的操作,我们可以看到initrd的内容,然后就可以修改按照要求,比如我们可以添加一个驱动进去,在上面的/mnt/tmp下面,有一个文件叫 “init”或者“linuxrc”,查看/mnt/tmp中的这个文件内容即可知道启动时会装入哪些驱动程序。还可以更改其中的内容,例如,如果想增加另一种SCSI驱动aic7xxx.o进入到initrd.img,可以进行如下两种操作:
#cd /mnt/tmp
#vi linuxrc 加上一行“ insmod /lib/aic7xxx.o”
#cp /lib/modules/`uname -r`/scsi/aic7xxx.o lib/
#cd /
#umount /mnt/tmp
#dd if=/tmp/ininrd.`uname –r`.img | gzip > /boot/initrd2.img
或者:
#cd /mnt/tmp
#vi init加上一行 insmod /lib/aic7xxx.o
#cp /lib/modules/`uname -r`/scsi/aic7xxx.o lib/
#cd /mnt/tmp
#find –print |cpio –ov>/tmp/initrd2.img (find的时候最好不要用绝对路径,否则cpio出来的文件以后解压缩也会解到这个绝对路径上面)
#gzip /tmp/initrd2.img
#mv /tmp/initrd2.img.gz /boot/initrd2.img
至此,新的initrd文件initrd2.img中就包含了aic7xxx的驱动程序了
再将其改名拷贝至/boot目录,重启就可以观察修改后的效果。重启后无法成功引导。这是因为生成的initrd.img不对。解决如下:
生成initrd
find . | cpio -o -H newc | gzip > /mnt/sda1/boot/initrd.img-2.6.18-4-686
(注:-H newc 是必须的,否则内核会认为是ramdisk,而不是initramfs)
阅读(2335) | 评论(0) | 转发(0) |