|
|
发表于 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? |
|