西格玛向量™

U盘中打造属于自己的Linux (三) :内核编译(下)initrd简介与内核配置

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

# 至此 我们已经搞定了内核部分,下面我们就要对文件系统开刀  先来看一下我们目前的进度:
/mnt/usb:

  boot/ grub/ grub.conf ; menu.lst ; stage **

               usblinux.kernel

  可以看出 我们满足grub的启动需求就只剩下

  initrd XXXXXXXX

  这个参数了

  那么 initrd是什么呢?

  简单说,就是一个临时文件系统,它以一个压缩包 或叫镜像的形式存在

  系统启动时 这个镜像将自己解压到内存中,并且提供一个init() 函数接口给内核

  从而使内核调用这个文件系统中的文件 完成初始化工作 为用户提供shell环境。

  我们不关心历史 Linux的技术革新换代 关于启动的方式也发生了很多变化,对于Linux 2.6的内核,initrd有很多新的特性,

  详细可以点击:

Linux2.6 内核的 Initrd 机制解析

   了解详情。

   说了这么多 ,initrd就是一个压缩包 里面是一个包含了配置好了的 init 的小型文件系统,

   我们的BootLoader执行了加载(其实也是解压)内核 ,识别硬件的后, 将把initrd 解压,

   在start_kernle () 后 会寻找执行initrd中的 init()

    因此  initrd是重要的一环,关系到系统内核能否启动。

 U盘中打造属于自己的Linux (三) :内核编译(下)initrd简介与内核配置

   (引用: 朱明 Linux教程 2009 06 启动与关闭 16)

    了解了initrd的作用 再看看initrd的组成:

      2.6内核的initrd一般都是 cpio 格式的 这种initrd的格式又被称为 iniramfs。

CPIO:Linux下的一种新的内核启动镜像所附带的虚拟磁盘格式。他与传统的Image格式比较而言有一些改进,主要体现在打包速度和启动引导方式上。

     cpio 可以从 cpio 或 tar 格式的归档包中存入和读取文件, 归档包是一种包含其他文件和有关信息的文件。 有关信息包括:文件名, 属主, 时标(timestamp), 和访问权限。 归档包可以是磁盘上的 其他文件, 也可以是磁带或管道.

     (以上内容来自wikipedia)

    initramfs 是rootfs的一种,有一些新特性,这里不做详细介绍,这里有一篇

    !!参考文献

精通initramfs构建step by step

    是后文参考的基础,强烈建议大家自己看一下。
   其实 在上一节内核编译的过程中,我们的内核源码已经为我们形成了一个initramfs 它默认和我们生成的bzImage绑定在了一起,因此我们并未看到它的存在,下面我们看一下内核中的相关配置。

   首先我们要确保一下参数:

   Executable file  formats

     –> kernel support for ELF  binaries    选中则可使内核支持ELF格式的可执行文件。

   File systems —>

   Pseudo filesystems —>

  /proc file system support /

   Virtual memory file system support (former shm fs)    支持虚拟文件系统

   按照默认配置,编译2.6版本的linux内核时,编译系统总会创建initramfs,然后把它与编译好的内核连接在一起。内核源代码树中的usr目录就是专门用于构建内核中的initramfs的,其中的initramfs_data.cpio.gz文件就是initramfs。缺省情况下,initramfs是空的,X86架构下的文件大小是134个字节。

    我们在之后的配置中,需要分析理解initrd的构成,因此我们需要独立的initrd 也就是 grub.conf中:

     initrd XXXXXXXX

    这个参数,因此 我们要修改内核配置,支持独立的内核。
Device Driver –>

           Block device     选择

               RAMfilesystem and RAMdisk ( initramfs/initrd ) support  (支持ram文件)

        General Setup –>

              initramfs source file(s)        配置项原有的内容清空。

     我们在/mnt下

     # mkdir initrd

      创建一个叫做initrd的文件夹 这是我们之后创建initrd的工作目录

      其实我们也可以将上面的 initramfs source file(s) 选项中参数设为/mnt/initrd  在initrd中的文件写完之后编译内核  ,这是内核会自动从initrd文件夹中取出文件 压缩为initrd 但我们不用这种方法 直接用cpio压缩 这样更灵活。
       到此 与initrd相关的内核配置就结束了,它的组成 ,形成和使用我们下章再说。

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

其实 到此为止 U盘linux已经可以成功了。

    # cp /boot/initrd.img -XXXXX- XXXX   /mnt/usb/usblinux.img

   由于内核,grub已经到位 我们完全可以吧宿主机的initrd直接拿来使用 是一样的。

   修改 grub.conf   /   menu.lst

   initrd    usblinux.img

   不要忘记 修改grub配置后 要重新安装grub!
   用你的U盘引导 OK 你已经可以看到 在一堆加载硬件的提示之后会有:

    (initramfs)_

    这就是一个内存中的linux 虽然掉电丢失,但常用的操作都完全可以执行 甚至还有vi!

    如果你的要求不高 那么恭喜 到此你就已经可以交稿了。

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

anyShare分享到: U盘中打造属于自己的Linux (三) :内核编译(下)initrd简介与内核配置
          
05-30
2009
loading...