Using the initial RAM disk (initrd)
时间:2006-09-14 来源:jiok
Using the initial RAM disk (initrd)
===================================
//使用initrd (在嵌入式系统中我们是比较常见的)
initrd提供通过boot loader导入ramdisk的能力,这个ramdisk能做为一个根文件系统加载并且
程序能从这里运行.然后,一个新的根文件系统能被加载从不同的设备上.以前的根可以移动一个
目录下也可以unmount. initrd的主要设计目的是允许系统从两个阶段启动,一个加有驱动的小内核,一个是从initrd导入
附加模块.
这个文档给我们一个使用的简短概述,一个详细的启动过程的讨论在[1]中. 操作
---------
当使用initrd时,系统的典型导入如下:
1)导入内核和ramdisk
2)内核转化initrd为一个"正常的ramdisk"并且释放initrd使用的内存.
3)initrd被加载为根读写.
4)/linuxrc被执行,(这是能有效执行的,包括shell脚本,这被运行用uid0(root),并且能做初始化 的所有工作)
5)linuxrc加载"真正的"根文件系统.
6)linuxrc置根文件系统于根目录.
7)一个通常的启动过程(例如:/sbin/init的调用)被完成在根文件系统中.
8)initrd被移除. 注意:改变根文件目录没有包括unmount initrd,因此initrd中的程序是可以继续被访问的. 启动命令行选项
initrd 添加下列新选项:
initrd=<path>
导入指定的文件进入初始的RAMdisk,当使用LILO,你必须指定ramdisk image在/etc/lilo.conf
中,使用initrd配置变量.
noinitrd
initrd数据是被保护的,但这不能转换为ramdisk即使一个"正常的"根文件系统被加载.initrd
数据能读从/dev/initrd.注意这数据在initrd中的是有结构的,并且没有必要是一个文件系统
映象.这个选项用于debug.
注意:/dev/initrd是只读的并且只能一次使用,一但最后一个程序把它关闭,所有的数据是释放
的并且/dev/initrd不能再被打开.
root=/dev/ram0(没有devfs)
root=/dev/rd/0(有devfs)
安装
-------------
首先,对于initrd目录必须创建一个根文件系统.
#mkdir /initrd
名字是没有关系的.更多的细节能发现在man page. 如果根文件系统在启动的过程中被创建,根文件系统的创建程序应该创建/initrd目录. 如果initrd没有加载由于某种原因,它的内容仍然是可能被访问,如果下面设备被创建,
(注意:这不能工作如果没有devfs):
# mknod /dev/initrd b 1 250
# chmod 400 /dev/initrd 第二,内核必须在编译过程中包含ramdisk支持和支持ramdisk初始化.至少所有的需要从initrd中执行程序的组件必须编译到内核中. 第三,你必须去创建ramdisk映象,这可以能过创建一个文件系统在块设备上做到,复制需要的
文件,然后复制块设备的内容到initrd中,在最近的内核中,至少有三种类型的设备是合适的:
-floppy
-ramdisk
-loopback(这是最合适的) 我们将描述loopback的制作方法:
1)内核配置时包含loopback块设备.
2)创建一个适当大小的空的文件系统,例如:
# dd if=/dev/zero of=initrd bs=300k count=1
# mke2fs -F -m0 initrd
(如果空间小,你可能想去使用一个比较小的文件系统去取代EXT2)
3)加载文件系统
# mount -t ext2 -o loop initrd /mnt
4)创建一个控制区设备
# mkdir /mnt/dev
# mknod /mnt/dev/console c 5 1
5)复制所有需要在initrd中使用的文件,不要忘记最重要的文件/linuxrc.
6)在initrd环境下正确的操作常常用测试,
# chroot /mnt /linuxrc
7)unmount 文件系统
# umount /mnt
8)压缩initrd
# gzip -9 initrd
对于initrd的试验,你可能想去节约floppy并且只添加一个符号从/linuxrc链接到/bin/sh
你可以去试验一个newlib去创建一个更小的initrd. 最后,你必须去启动内核并且导入initrd.几乎所有的linux引导程序都支持initrd.因为启动
过程与老的机制也是兼营的,下面是一个命令参数.
root=/dev/ram0 init=/linuxrc rw
如果没有使用devfs,否则
root=/dev/rd/0 init=/linuxrc rw
如果使用了(rw仅仅是去写initrd)
With LOADLIN, you simply execute LOADLIN <kernel> initrd=<disk_image>
e.g. LOADLIN C:\LINUX\BZIMAGE initrd=C:\LINUX\INITRD.GZ root=/dev/ram0
init=/linuxrc rw
在LILO中,你添加这个选项INITD=<path>在一个全局的段中或者在/etc/lilo.conf
image = /bzImage
initrd = /boot/initrd.gz
append = "root=/dev/ram0 init=/linuxrc rw"
并且运行/sbin/lilo
对于其它的bootloader,请参考相关的文档.
现在你能启动and享受使用initrd.
===================================
//使用initrd (在嵌入式系统中我们是比较常见的)
initrd提供通过boot loader导入ramdisk的能力,这个ramdisk能做为一个根文件系统加载并且
程序能从这里运行.然后,一个新的根文件系统能被加载从不同的设备上.以前的根可以移动一个
目录下也可以unmount. initrd的主要设计目的是允许系统从两个阶段启动,一个加有驱动的小内核,一个是从initrd导入
附加模块.
这个文档给我们一个使用的简短概述,一个详细的启动过程的讨论在[1]中. 操作
---------
当使用initrd时,系统的典型导入如下:
1)导入内核和ramdisk
2)内核转化initrd为一个"正常的ramdisk"并且释放initrd使用的内存.
3)initrd被加载为根读写.
4)/linuxrc被执行,(这是能有效执行的,包括shell脚本,这被运行用uid0(root),并且能做初始化 的所有工作)
5)linuxrc加载"真正的"根文件系统.
6)linuxrc置根文件系统于根目录.
7)一个通常的启动过程(例如:/sbin/init的调用)被完成在根文件系统中.
8)initrd被移除. 注意:改变根文件目录没有包括unmount initrd,因此initrd中的程序是可以继续被访问的. 启动命令行选项
initrd 添加下列新选项:
initrd=<path>
导入指定的文件进入初始的RAMdisk,当使用LILO,你必须指定ramdisk image在/etc/lilo.conf
中,使用initrd配置变量.
noinitrd
initrd数据是被保护的,但这不能转换为ramdisk即使一个"正常的"根文件系统被加载.initrd
数据能读从/dev/initrd.注意这数据在initrd中的是有结构的,并且没有必要是一个文件系统
映象.这个选项用于debug.
注意:/dev/initrd是只读的并且只能一次使用,一但最后一个程序把它关闭,所有的数据是释放
的并且/dev/initrd不能再被打开.
root=/dev/ram0(没有devfs)
root=/dev/rd/0(有devfs)
安装
-------------
首先,对于initrd目录必须创建一个根文件系统.
#mkdir /initrd
名字是没有关系的.更多的细节能发现在man page. 如果根文件系统在启动的过程中被创建,根文件系统的创建程序应该创建/initrd目录. 如果initrd没有加载由于某种原因,它的内容仍然是可能被访问,如果下面设备被创建,
(注意:这不能工作如果没有devfs):
# mknod /dev/initrd b 1 250
# chmod 400 /dev/initrd 第二,内核必须在编译过程中包含ramdisk支持和支持ramdisk初始化.至少所有的需要从initrd中执行程序的组件必须编译到内核中. 第三,你必须去创建ramdisk映象,这可以能过创建一个文件系统在块设备上做到,复制需要的
文件,然后复制块设备的内容到initrd中,在最近的内核中,至少有三种类型的设备是合适的:
-floppy
-ramdisk
-loopback(这是最合适的) 我们将描述loopback的制作方法:
1)内核配置时包含loopback块设备.
2)创建一个适当大小的空的文件系统,例如:
# dd if=/dev/zero of=initrd bs=300k count=1
# mke2fs -F -m0 initrd
(如果空间小,你可能想去使用一个比较小的文件系统去取代EXT2)
3)加载文件系统
# mount -t ext2 -o loop initrd /mnt
4)创建一个控制区设备
# mkdir /mnt/dev
# mknod /mnt/dev/console c 5 1
5)复制所有需要在initrd中使用的文件,不要忘记最重要的文件/linuxrc.
6)在initrd环境下正确的操作常常用测试,
# chroot /mnt /linuxrc
7)unmount 文件系统
# umount /mnt
8)压缩initrd
# gzip -9 initrd
对于initrd的试验,你可能想去节约floppy并且只添加一个符号从/linuxrc链接到/bin/sh
你可以去试验一个newlib去创建一个更小的initrd. 最后,你必须去启动内核并且导入initrd.几乎所有的linux引导程序都支持initrd.因为启动
过程与老的机制也是兼营的,下面是一个命令参数.
root=/dev/ram0 init=/linuxrc rw
如果没有使用devfs,否则
root=/dev/rd/0 init=/linuxrc rw
如果使用了(rw仅仅是去写initrd)
With LOADLIN, you simply execute LOADLIN <kernel> initrd=<disk_image>
e.g. LOADLIN C:\LINUX\BZIMAGE initrd=C:\LINUX\INITRD.GZ root=/dev/ram0
init=/linuxrc rw
在LILO中,你添加这个选项INITD=<path>在一个全局的段中或者在/etc/lilo.conf
image = /bzImage
initrd = /boot/initrd.gz
append = "root=/dev/ram0 init=/linuxrc rw"
并且运行/sbin/lilo
对于其它的bootloader,请参考相关的文档.
现在你能启动and享受使用initrd.
相关阅读 更多 +