Chinaunix首页 | 论坛 | 博客
  • 博客访问: 410144
  • 博文数量: 62
  • 博客积分: 1483
  • 博客等级: 上尉
  • 技术积分: 779
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-24 12:25
文章分类

全部博文(62)

文章存档

2012年(2)

2011年(6)

2010年(6)

2009年(48)

我的朋友

分类: LINUX

2009-09-09 21:47:55

为了学习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) |
给主人留下些什么吧!~~