LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1895|回复: 9

initrd.img的疑问

[复制链接]
发表于 2006-7-27 19:26:05 | 显示全部楼层 |阅读模式
这几天在为编译内核做准备,initrd.img总有一些问题:
引用:
1.什么是 Initrd

    initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的"某个文件",完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。这里提到的"某个文件",Linux2.6 内核会同以前版本内核的不同,所以这里暂时使用了"某个文件"这个称呼,后面会详细讲到。第一阶段启动的目的是为第二阶段的启动扫清一切障爱,最主要的是加载根文件系统存储介质的驱动模块。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。

Linux2.6 内核对 Initrd 的处理流程

    linux2.6 内核支持两种格式的 initrd,一种是 linux2.4 内核那种传统格式的文件系统镜像-image-initrd,它的制作方法同 Linux2.4 内核的 initrd 一样,其核心文件就是 /linuxrc.另外一种格式的 initrd 是 cpio 格式的,这种格式的 initrd 从 linux2.5 起开始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init,本文将这种 initrd 称为 cpio-initrd.尽管 linux2.6 内核对 cpio-initrd和 image-initrd 这两种格式的 initrd 均支持,但对其处理流程有着显著的区别。


debianer:/boot# file initrd.img-2.6.*
initrd.img-2.6.15-1-686: gzip compressed data, from Unix, last modified: Fri Jul 21 14:03:39 2006, max compression
initrd.img-2.6.8-2-386:  Linux Compressed ROM File System data, little endian size 4317184 version #2 sorted_dirs CRC 0xb3f624b6, edition 0, 2472 blocks, 309 files
主要问题:两个文件属性的不同是不是由于initrd.img的建立方法不同?

我做了一个小实验:

debianer:/tmp# mkinitrd  -o /tmp/initrd.img  2.6.15-1-686
//自己mkinitrd一个initrd.img
debianer:/tmp# ls -la /tmp/initrd.img
-rw-r--r-- 1 root root 5197824 2006-07-27 19:12 /tmp/initrd.img

debianer:/tmp# file initrd.img
initrd.img: Linux Compressed ROM File System data, little endian size 5197824 version #2 sorted_dirs CRC 0xf403344f, edition 0, 2961 blocks, 346 files

这样建立的initrd.img的属性和原来的不同:
debianer:/tmp# file /boot/initrd.img-2.6.15-1-686
/boot/initrd.img-2.6.15-1-686: gzip compressed data, from Unix, last modified: Fri Jul 21 14:03:39 2006, max compression

是不是说mkinitrd命令建立的initrd镜象属性都是这样的?

如果编译内核,自己建立initrd.img时,如果选择cpio 格式的?

编译时最后make install命令是不是自动建立了initrd.img?
如果建立了,那是什么格式的呢?
image-initrd ? cpio-initrd?
谢谢了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2006-7-27 19:33:04 | 显示全部楼层
好像不能发在这里,要是不合适版主就帮我挪一下
回复 支持 反对

使用道具 举报

发表于 2006-7-27 20:27:12 | 显示全部楼层
Post by azhoulinux
这几天在为编译内核做准备,initrd.img总有一些问题:
引用:
1.什么是 Initrd

    initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的"某个文件",完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。这里提到的"某个文件",Linux2.6 内核会同以前版本内核的不同,所以这里暂时使用了"某个文件"这个称呼,后面会详细讲到。第一阶段启动的目的是为第二阶段的启动扫清一切障爱,最主要的是加载根文件系统存储介质的驱动模块。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。

Linux2.6 内核对 Initrd 的处理流程

    linux2.6 内核支持两种格式的 initrd,一种是 linux2.4 内核那种传统格式的文件系统镜像-image-initrd,它的制作方法同 Linux2.4 内核的 initrd 一样,其核心文件就是 /linuxrc.另外一种格式的 initrd 是 cpio 格式的,这种格式的 initrd 从 linux2.5 起开始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init,本文将这种 initrd 称为 cpio-initrd.尽管 linux2.6 内核对 cpio-initrd和 image-initrd 这两种格式的 initrd 均支持,但对其处理流程有着显著的区别。
initrd 这个玩意,在不同发行版有不同的 mkinitrd 脚本,产生不同的内容及格式,说得好听点就是条条大道通罗马,说得不好听就是毫无标准,各出奇谋,五花八门,乱七八糟!

Debian 下的 initrd 跟 LFS、Gentoo 等明显不同,既然你发在 Debian 版,便依 Debian 的特徵来回答好了

initrd 的格式其实不单止有 cpio,还有 cramfs,或者 ext2 等
Post by azhoulinux
debianer:/boot# file initrd.img-2.6.*
initrd.img-2.6.15-1-686: gzip compressed data, from Unix, last modified: Fri Jul 21 14:03:39 2006, max compression
initrd.img-2.6.8-2-386:  Linux Compressed ROM File System data, little endian size 4317184 version #2 sorted_dirs CRC 0xb3f624b6, edition 0, 2472 blocks, 309 files
主要问题:两个文件属性的不同是不是由于initrd.img的建立方法不同?

我做了一个小实验:

debianer:/tmp# mkinitrd  -o /tmp/initrd.img  2.6.15-1-686
//自己mkinitrd一个initrd.img
debianer:/tmp# ls -la /tmp/initrd.img
-rw-r--r-- 1 root root 5197824 2006-07-27 19:12 /tmp/initrd.img

debianer:/tmp# file initrd.img
initrd.img: Linux Compressed ROM File System data, little endian size 5197824 version #2 sorted_dirs CRC 0xf403344f, edition 0, 2961 blocks, 346 files

这样建立的initrd.img的属性和原来的不同:
debianer:/tmp# file /boot/initrd.img-2.6.15-1-686
/boot/initrd.img-2.6.15-1-686: gzip compressed data, from Unix, last modified: Fri Jul 21 14:03:39 2006, max compression

是不是说mkinitrd命令建立的initrd镜象属性都是这样的?
2.6.14+ 以後的 kernel 已去掉了 devfs 的支持,做原来的 mkinitrd 脚本做出来 initrd 仍会依赖於 devfs 而无法启动,因此,2.6.14+ 以後的 kernel 要改用 initramfs-tools 或者 yaird 提供的脚本来做 initrd

旧的 kernel,如 stable 里的 2.6.8.x 可利用原来的 mkinitrd 脚本来做 initrd,默认格式是
cramfs,但也可以配置一下改用 ext2
Post by azhoulinux
如果编译内核,自己建立initrd.img时,如果选择cpio 格式的?

编译时最后make install命令是不是自动建立了initrd.img?
如果建立了,那是什么格式的呢?
image-initrd ? cpio-initrd?
谢谢了
initrd 并非编译内核的一部份,正常编译内核是不会自动编译 initrd 的,若用 make-kpkg 脚本去编译内核的话,其实系统也只是调用默认的 mkinitrd 脚本而矣

Clear?
回复 支持 反对

使用道具 举报

发表于 2006-7-27 20:28:17 | 显示全部楼层
Post by azhoulinux
好像不能发在这里,要是不合适版主就帮我挪一下

视乎你问的问题是否跟 Debian 有关?若然你要问的是其他发行版,那麽上述的东西又有另外的说法了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-27 22:25:34 | 显示全部楼层
我是使用debian的,版主真是太好了!解答了我许多疑问,又做了一个小实验:
debianer:/home# mkinitramfs -o /tmp/initrd.img 2.6.15-1-686
debianer:/home# cd /tmp/

debianer:/tmp# ls -la /tmp/initrd.img
-rw-r--r-- 1 root root 4689164 2006-07-27 22:18 /tmp/initrd.img

debianer:/tmp# file initrd.img
initrd.img: gzip compressed data, from Unix, last modified: Thu Jul 27 22:17:53 2006, max compression

debianer:/tmp# file /boot/initrd.img-2.6.15-1-686
/boot/initrd.img-2.6.15-1-686: gzip compressed data, from Unix, last modified: Fri Jul 21 14:03:39 2006, max compression

对比了一下,确实是不同工具建立不同initrd.img,
太谢谢版主了,你和你的图像一样酷!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-27 22:41:45 | 显示全部楼层
版主能不能推荐一些内核编译的文章给我,关于2.6系列的。
网上许多文章都是太老了,而kernel-howto好像正在修订新的,也还没有内容
再次感谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-27 22:55:33 | 显示全部楼层
debianer:/home/azhoulinux/learning/linux/Documentation/filesystems# vim ramfs-rootfs-initramfs.txt

其中Documentation是内核源代码里面的文档,找到了ramfs-rootfs-initramfs.txt这一篇,摘要如下:
What is ramfs?
--------------

Ramfs is a very simple filesystem that exports Linux's disk caching
mechanisms (the page cache and dentry cache) as a dynamically resizable
ram-based filesystem.

What is initramfs?
------------------

All 2.6 Linux kernels contain a gzipped "cpio" format archive, which is
extracted into rootfs when the kernel boots up.  After extracting, the kernel
checks to see if rootfs contains a file "init", and if so it executes it as PID
1.  If found, this init process is responsible for bringing the system the
rest of the way up, including locating and mounting the real root device (if
any).  If rootfs does not contain an init program after the embedded cpio
archive is extracted into it, the kernel will fall through to the older code
to locate and mount a root partition, then exec some variant of /sbin/init
out of that.

稍微明白了一些。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-27 22:58:46 | 显示全部楼层
debianer:/tmp/init_rd# cpio -i -v -F initrd

debianer:/tmp/init_rd# ls
bin  conf  etc  init  lib  modules  sbin  scripts

解压之后还能得到这一些信息。
各位还能不能告诉我编译内核还要注意些什么?
再次感谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-27 23:05:14 | 显示全部楼层
Post by d00m3d
i
2.6.14+ 以後的 kernel 已去掉了 devfs 的支持,做原来的 mkinitrd 脚本做出来 initrd 仍会依赖於 devfs 而无法启动,因此,2.6.14+ 以後的 kernel 要改用 initramfs-tools 或者 yaird 提供的脚本来做 initrd


Clear?

这一个可以在这里解释:
http://www.dominik-epple.de/Sarge-Linux_2.6.14-yaird/x18.html
回复 支持 反对

使用道具 举报

发表于 2006-7-28 06:36:24 | 显示全部楼层
举一反三,非常好的学习态度,加油啊!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表