西格玛向量™

U盘中打造属于自己的Linux (三) :内核编译(中)大刀向内核的头上砍去

作者: 西玛哒   分类: IT悟语, Linux, 老西常谈   标签:    评论: 0

## 接上文  我们了解了makefile的使用方法和make命令

//———————————

  开始本章之前,强调两点,首先进行操作不要在熄灯之后,没电了后果自负。

   其次,你的宿主机内要有起码2~3个G的自由空间在你的工作目录下,别被5X.XXMB的内核骗了! 编译产生的中间文件有如滔滔江水绵绵不绝……..

//——————————–

  现在我们就可以随心所欲的对手中的内核进行操作了,在将其制作成为“成品”之前,我们可以随意制造“模具”以便让我们的Linux内核用于不同的用途。

我们以一个默认配置的内核开始 了解一些常用的内核配置:

#make defconfig

我们以默认的为底 起码能用。

#make menuconfig

出现内核配置选单:

  ok 这就是传说中的高手、牛人们与内核战斗,获得各种有超级通途的神奇内核的地方。

  我们不一定立刻成为牛人,但我们可以跟着牛人们总结出来的东西走,网上有N多关于内核编译选项设置的,我们随便找一些看看,发现很多东西都是用在嵌入式上的。

   我们知道 内核要做的一件重要的事情就是识别并支持机器上的各种硬件设备,向用户提供操作这些设备工作的应用接口,使用户可以用程序(命令)来调用硬件,实现相应的功能。

   因此,我们需要根据我们的需求进行修改配置我们的内核,我们回想一下需求:

    1、U盘上用的Linux,因此需要较强的适应性,得能够识别大部分的硬件才行。

    2、ext2 文件支持要有。
    3、之后要用到独立的内核 所以支持选项一定要配置进去:

##############################

  以下内容建立在默认配置的基础上:

   选择相应的配置时,有三种选择,它们分别代表的含义如下:

   “Y” / “*”- 将该功能编译进内核

    “N” /“-”- 不将该功能编译进内核

“M”- 将该功能编译成可以在需要时动态插入到内核中的模块。

    一般通过空格键或回车键控制选项是否选中。
   需要我们重点配置的选项如下:

文件系统:

File systems—>

[*] Ext2 journalling file system support
[*] Ext2 Security Labels 

    …….附近的选项请酌情选取
内核模块支持:

  Load module support->

/     Enable loadable module support / 

         * Automatic kernel loading ;

硬件支持 主要是磁盘:

Device Driver

|—->SCSI device support
|—->SCSI disk support
|—–>verbose SCSI error reporting (不是必须的,但可方便问题定位)
|—–>SCSI low-level drivers

|—->Serial ATA (SATA) support

…………

其余大部分的内核我们不用涉及其用法,因为我们强调可移植性,而我们的U盘空间不是很苛刻,因此我们用bzImage 的格式做一个大内核 ,选项中尽量使用原有的配置,将硬件设备的支持直接编入内核之中,可以保证我们之后能正常使用,当然这违背我们精致的原则,因此 本懒人向勤劳的人们提供如下链接:

http://lamp.linux.gov.cn/Linux/kernel_options.html

  这是关于整个内核配置选项的详细介绍 大家可以一步步的走一下。
  按之前的配置 我们在menu状态下完成配置后,就可以按exit按钮退出,会提示你保存.config 文件。
  完成后就可以进行编译了。
   make语句用法已经叙述过,在此不再详述:

   (# make  menuconfig 之后:)

   # make bzImage

   刷屏啊………………………………..

   建议你去吃饭… 反正要很久
    如果不报错退出,那么恭喜 再次看见

  #

    的时候  你的bzImage 就已经完成了。
   从提示上应该看得出 你的成品被放于:

  # /arch/i386/boot/bzImage       它其实是一个链接到

  # /arch/x86/boot/bzImage  …… i386< x86 算是这个平台的一个子集吧。

   这就是我们传说中的内核了,如你所见,它是用来启动的,这个文件名称可以随便定,但是最好起一个标准点的名字,比如:UsbLinux.kernel 将它复制到我们的工作目录 也就是U盘下。

( pwd …../kernel/linux-XXXXX./)

  #cp /arch/i386/boot/bzImage  /mnt/usb/boot/Usblinux.kernel   (复制并重命名)

   这个文件的用法之后再说,只是我们获得了grub.conf 和menu.lst 的一个重要参数
  kernel  XXXXXXX  
  用vi 打开上述文件,参照之前讲过的内容修改就是了。
  这时候其实真正的linux系统部分已经在你的U盘中写完了。
  下章将介绍与initrd相关的内核编译部分。

##############################################

   以下是关于内核make和宿主系统换内核的一些扩展,与U盘Linux无关。
   正常的电脑在下载源码包之后,一般需要对源码进行一下优化,与U盘linux不同,宿主机的硬件是固定的,因此在选择时一般针对自己电脑的配置进行修改:
   下面是一个有关配置的介绍链接:

http://soft.yesky.com/os/lin/370/2018870_1.shtml

      还有人用相关工具进行优化,这里不说了。
    我们在# make menuconfig
    # make bzImage
    之后,只是声称了启动内核,但是我们在配置中选为M的,也就是需要module的部分并没有编译出来。
     其实,make系列命令真正常用的用途是,在宿主机内编译整个内核后,将成品内核部署到宿主机的指定位置,我们只是借用了生成的bzImage而已,而且我们默认选项中,大部分硬件支持是以*配置选择,就是不需要模块支持编译的,因此不会用到Modules。
     这里我们看看,正常这之后我们换内核的流程。
     #make modules        //根据我们的选择,编译我们需要的模块部分。
     #make modules_install  // 我们编译模块的成品,也就是内核要用到得模块 将安装到指定位置,这个位置我们在内核配置中可以找到,但我们要知道,默认的系统标准位置是:
      /lib/modules/…….

###

    模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为安全起见,在运行

#make  modules_install

  之前最好对/lib/modules进行备份。模块通常是带有扩展名.o的文件,使用命令#lsmod可以对当前内核的模 块进行列表。 

###    

     还记得,我们之间说过,我当前的系统内核叫做:

        2.6.28-11-generic

      这里我们想要换内核,由于模块已经放到指定位置,其实我们只需要用新生成的 内核和相关文件替换掉我们原有的内核就可以,这里make给了我们一步到位的方法:

       #make install

上面的命令"make install"将:
(1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接;
(2)修改bootloader的配置文件;
(3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似的配置行:
      title Red Hat Linux (2.***)
      root(hd0, 1)
      kernel /boot/vmlinuz-2.*** ro root=LABEL=/
      initrd /boot/initrd-2.***.img

   这样新的内核就安装好了,重启系统,在grub选单下,就会看到新的内核配置

   Ubuntu 9.04 XXX 2.6.28-11-generic

   Ubuntu 9.04 XXX 2.6.29-2                     //新内核。

   为了方便管理,我们介绍一下dpkg命令,dpkg 是Debian的软件包管理系统,参数大家自己查看,这里只说其查看内核的方法:

    # dpkg –get-selections    |            grep            linux

       获得软件包信息         输送结果     查找字串         其中包含 linux 关键字

     这里会列出你安装过的带linux关键词的软件包 包括所有的内核

linux-generic install

linux-headers-2.6.28-11 install

linux-headers-2.6.28-11-generic install

linux-headers-generic install

linux-image-2.6.28-11-generic install

linux-image-generic install

linux-libc-dev install

linux-restricted-modules-2.6.28-11-generic install

    我们想要删除不用的内核 就要执行以下命令:

# apt-get remove linux-image-2.6.28-11-generic

      这样就可以实现自动删除内核文件了,还可以释放磁盘空间。

参考文献:http://os.yesky.com/lin/88/7535588.shtml

  ############################################# 

anyShare分享到: U盘中打造属于自己的Linux (三) :内核编译(中)大刀向内核的头上砍去
          
05-30
2009
loading...