|
发表于 2009-3-1 10:26:06
|
显示全部楼层
不知道这些能不能解答老刀的 问题。
==================================================================
在Debian4.3下编译linux-2.6.28内核小结 (2009-02-21 18:52:36)
标签:linux 内核编译 bad gzip magic numbers unpacking initramfs 杂谈 分类:技术天地
从我自己所找到的资料来看,编译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 ... <o> 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) ***
<M> |-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) ***
<M> |-SCSI disk support
<M> Serial ATA (prod) and Parallel ATA (experimental) drivers
|-ATA ACPI Support
|-SATA Port Multiplier support
<M> |-AHCI SATA support
[M] |-ATA SFF support
=================================================================================
俺也是新手,其实对LINUX的理解非常浅薄,在这篇博文中讲了一点儿自己在编译内核时的体会,有错误的地方,请前辈们多指教。 |
|