Chinaunix首页 | 论坛 | 博客
  • 博客访问: 233467
  • 博文数量: 69
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 570
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-13 16:57
文章分类

全部博文(69)

文章存档

2011年(1)

2010年(5)

2009年(63)

我的朋友

分类: LINUX

2009-04-21 14:01:39

从我自己所找到的资料来看,编译linux内核有两种方法。

我先说说新方法,这种方法很简单。反正我是一次成功。当然,这些操作都需要以root用户进行。我首先用光盘安装了Debian-etch4.3的最小系统。在这样的系统下,还需要安装一些工具包后方可进行内核编译。

为完成内核编译,Debian4.3还需要安装的包如下:

# apt-get install gcc
# apt-get install make
# apt-get install libc6-dev
# apt-get install bzip
# apt-get install ncurse-dev
# apt-get install initrd-tools 
   ##如果要使用mkinitrd命令,就必须安装这个包

有了以上包的,应该可以用传统方法编译内核。

如果想用新方法编译内核,那么还需要下面的包:
# apt-get install kernel-package
# apt-get install apt-get install fakeroot

安装了kernel-package包后,我建议,当编译过程中遇到什么问题的时候,就打开这个文件看看:/usr/share/kernel-package/docs/README

做好了上述的准备工作,我们开始按下面的步骤编译、安装内核

将内核的源文件复制到相关的目录下,然后解压缩。我是将源代码复制到了/usr/src目录下
# tar xvf linux-2.6.28.tar.bz2
# cd /usr/src/linux-2.6.28


作一些清理工作。当然,如果解压缩后第一次编译,可以不做这些
# make clean
# make mrproper


把当前内核的配置作为模板
# cp /boot/config-2.6.18-6-k7 .config


先不要对内核配置文件做任何改动,直接开始编译。如果按config-2.6.18-6-k7的配置编译新内核后能正常启动,再进行内核配置。因为我是在字符界面的菜单模式下进行相关操作的,所以使用下面的命令:

# make menuconfig

出现内核配置的界面后,就可以根据自己的电脑的硬件情况进行相应的选择。

开始编译
# make-dpkg clean
# fakeroot make-kpkg --initrd linux_image

上面的这两条命令正确执行完后,我们会在/usr/src目录下看到这样的一个debian包:
linux-image-2.6.28_2.6.28-10.00.Custom_i386.deb

安装这个包,就能完成新内核的安装。
# dpkg -i linux-image-2.6.28_2.6.28-10.00.Custom_i386.deb

上面的命令自动完成menu.lst文件的修改,在其中加入了如下的内容:

title           Debian GNU/Linux, kernel 2.6.28
root            (hd0,4)
kernel          /boot/vmlinuz-2.6.28 root=/dev/hda5 ro
initrd          /boot/initrd.img-2.6.28
savedefault

title           Debian GNU/Linux, kernel 2.6.28 (single-user mode)
root            (hd0,4)
kernel          /boot/vmlinuz-2.6.28 root=/dev/hda5 ro single
initrd          /boot/initrd.img-2.6.28
savedefault

重新启动电脑,可以看到GRUB的启动界面已经被修改。选择运行kernel 2.6.28的菜单,看看LINUX能否正常启动。


我们再看看传统的方法。我在用这一方法编译内核时,遇到了一些麻烦。实际上,我在debian3.1环境下编译过内核2.4.X,虽然也有一些周折,但最 终还是成功的。我还是直接说编译过程中的所需要运行的命令吧。我将linux-2.6.28.tar.bz2复制到了/usr/src目录下。

# tar xvf linux-2.6.28.tar.bz2
# cd /usr/src/linux-2.6.28

# make clean
# make mrproper

# make
# make modules_install

# cp -v /arch/i386/boot/bzImage /boot/vmlinuz-2.6.28
# cd ../../..
# cp System.map /boot/System.map-2.6.28
# mkinitramfs -o /boot/initrd.img-2.6.28 2.6.28
# cp .config /boot/config-2.6.28

当然,还要修改/boot/grub/menu.lst,加入如下的内容:

title           Debian GNU/Linux, kernel 2.6.28
root            (hd0,4)
kernel          /boot/vmlinuz-2.6.28 root=/dev/hda5 ro
initrd          /boot/initrd.img-2.6.28
savedefault

做完这些工作,重新启动电脑,看看是否可以正常进入LINUX系统。


我在编译过程中遇到的几个问题:

1、用传统方法编译内核,启动后显示'Unpacking initramfs ... Kernel panic - not syncing:bad gzip magic numbers' 错误,启动进程就不能进行下去。

经过多次实验,我认为是使用mkinitrd命令制作initrd.img文件带来的问题。我用mkinitramfs命令制作initrd.img文件,就可以使启动正常。操作格式如下:

# mkinitramfs -o /boot/initrd.img-2.6.28 2.6.28

在上述的命令中,-o /boot/initrd.img-2.6.28指明了生成initrd.img-2.6.28文件的输出路径,
其后的空格后的2.6.28指明要将路径/lib/modules/2.6.28下的驱动模块加入initrd.img-2.6.28文件中。如果没有这 一参数,加入initrd.img-2.6.28文件中的则是当前版本的驱动模块。例如,如果当前正在运行的linux操作系统的内核版本是 2.6.18,那么,/lib/modules下就会有2.6.18子目录,下面的命令虽然是想生成2.6.28版本的initrd.img文件,但实际 上是将/lib/modules/2.6.18下的驱动模块加入:
# mkinitramfs -o /boot/initrd.img-2.6.28

就我目前的理解,我认为用传统方法生成initrd.img文件产生错误的原因在于,现在网上流传的编译内核的方法是基于非常低的内核版本,在这些版本 中,启动压缩文件为initrd格式,所以那些资料都教大家用mkinit生成initrd.img。而在较高版本的内核的编译选项中,用 initramfs代替了原先的initrd,用mkinitrd命令生成initrd.img文件自然就会产生格式错误,所以必须用 mkinitramfs命令代替mkinitrd命令生成initrd.img。initramfs的选项在内核编译选项菜单下的位置(linux- 2.6.28)是:

General Setup
|---[M] Initial RAM filesytem and RAM disk (initramfs/initrd) support


2、让内核识别USB设备
要使编译选项中的下列选项被选中:
     Device Drivers
     |-SCSI device support
 {M}   |-SCSI device support
     *** SCSI support type (disk, tape, CD-ROM) ***
    |-SCSI disk support
 [*] |-USB support
 <*>   |-Support for Host-side USB
     *** Miscellaneous USB options ***  
 [*]     |-USB device filesystem
 [*]     |-USB device class-devices (DEPRECATED)
     *** USB Host Controller Drivers ***
 [*]     |-EHCI HCD (USB 2.0) support
 [*]     |-OHCI HCD support
 [*]     |-UHCI HCD support
     *** NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may al
     *** see USB_STORAGE Help for more information ***
 [*]     |-USB Mass Storage support
 
3、让内核识别SATA硬盘
 在菜单模式下配置内核选项进,选中下面的内容:
     Device Drivers
     |-SCSI device support
{M}  |-SCSI device support
     *** SCSI support type (disk, tape, CD-ROM) ***
  |-SCSI disk support

  Serial ATA (prod) and Parallel ATA (experimental) drivers
[*]  |-ATA ACPI Support
[*]  |-SATA Port Multiplier support
  |-AHCI SATA support
[M]  |-ATA SFF support 
阅读(2399) | 评论(0) | 转发(0) |
0

上一篇:command

下一篇:hello world 驱动

给主人留下些什么吧!~~