网络安全参考 | UNIX参考 | GPS参考 | 无线参考 | 在线手册 | OSBUG.ORG | SUNNY-NETWORK.COM
天线制作 GPS 地标
网站地图 RSS订阅
高级搜索 收藏本站
Home | 业界动态 | Open source | GNU | Linux | BSD | Solaris | AIX | HP-UX | IRIX | Mac OS X | Minix | Tru64 | SCO UNIX | Network | Security | X-Window | Database | 应用服务 | Programming | 经典著作 | 永远的纪念 | 杂项
 当前位置: Home > Linux > 内核 > 文章  
Linux 初始 RAM 磁盘(initrd)概述
文章来源: IBM developerworks 文章作者: M. Tim Jones 发布时间: 2006-08-21   字体: [ ]  
 


# Create the init file
cat >> /mnt/initrd/linuxrc << EOF
#!/bin/ash
echo
echo "Simple initrd is active"
echo
mount -t proc /proc /proc
mount -t sysfs none /sys
/bin/ash --login
EOF

chmod +x /mnt/initrd/linuxrc

# Finish up...
umount /mnt/initrd
gzip -9 /tmp/ramdisk.img
cp /tmp/ramdisk.img.gz /boot/ramdisk.img.gz


initrd Linux 发行版

Minimax 是一个开放源码项目,其设计目标是成为一个全部封装在 initrd 中的 Linux 发行版。它的大小是 32MB,为了尽量小,它使用了 BusyBox 和 uClibc。除了非常小之外,它还使用了 2.6 版本的 Linux 内核,并提供了很多有用的工具。

  为了创建 initrd,我们最开始创建了一个空文件,这使用了 /dev/zero(一个由零组成的码流)作为输入,并将其写入到 ramdisk.img 文件中。所生成的文件大小是 4MB(4000 个 1K 大小的块)。然后使用 mke2fs 命令在这个空文件上创建了一个 ext2(即 second extended)文件系统。现在这个文件变成了一个 ext2 格式的文件系统,我们使用 loop 设备将这个文件挂载到 /mnt/initrd 上了。在这个挂载点上,我们现在就有了一个目录,它以 ext2 文件系统的形式呈现出来,我们可以对自己的 initrd 文件进行拼装了。接下来的脚本提供了这种功能。

  下一个步骤是创建构成根文件系统所需要的子目录:/bin、/sys、/dev 和 /proc。这里只列出了所需要的目录(例如没有库),但是其中包含了很多功能。

ext2 文件系统的替代品

尽管 ext2 是一种通用的 Linux 文件系统格式,但是还有一些替代品可以减小 initrd 映像文件以及所挂载上来的文件系统的大小。这种文件系统的例子有 romfs(ROM 文件系统)、cramfs(压缩 ROM 文件系统)和 squashfs(高度压缩只读文件系统)。如果我们需要暂时将数据写入文件系统中,ext2 可以很好地实现这种功能。最后,e2compr 是 ext2 文件系统驱动程序的一个扩展,可以支持在线压缩。

  为了可以使用根文件系统,我们使用了 BusyBox。这个工具是一个单一映像,其中包含了很多在 Linux 系统上通常可以找到的工具(例如 ash、awk、sed、insmod 等)。BusyBox 的优点是它将很多工具打包成一个文件,同时还可以共享它们的通用元素,这样可以极大地减少映像文件的大小。这对于嵌入式系统来说非常理想。将 BusyBox 映像从自己的源目录中拷贝到自己根目录下的 /bin 目录中。然后创建了很多符号链接,它们都指向 BusyBox 工具。BusyBox 会判断所调用的是哪个工具,并执行这个工具的功能。我们在这个目录中创建了几个链接来支持 init 脚本(每个命令都是一个指向 BusyBox 的链接。)

  下一个步骤是创建几个特殊的设备文件。我从自己当前的 /dev 子目录中直接拷贝了这些文件,这使用了 -a 选项(归档)来保留它们的属性。

  倒数第二个步骤是生成 linuxrc 文件。在内核挂载 RAM 磁盘之后,它会查找 init 文件来执行。如果没有找到 init 文件,内核就会调用 linuxrc 文件作为自己的启动脚本。我们在这个文件中实现对环境的基本设置,例如挂载 /proc 文件系统。除了 /proc 之外,我还挂载了 /sys 文件系统,并向终端打印一条消息。最后,我们调用了 ash(一个 Bourne Shell 的克隆),这样就可以与根文件系统进行交互了。linuxrc 文件然后使用 chmod 命令修改成可执行的。

  最后,我们的根文件系统就完成了。我们将其卸载掉,然后使用 gzip 对其进行压缩。所生成的文件(ramdisk.img.gz)被拷贝到 /boot 子目录中,这样就可以通过 GNU GRUB 对其进行加载了。

  要构建初始 RAM 磁盘,我们可以简单地调用 mkird,这样就会自动创建这个映像文件,并将其拷贝到 /boot 目录中。

  测试定制的初始 RAM 磁盘

Linux 内核中对 initrd 的支持

对于 Linux 内核来说,要支持初始 RAM 磁盘,内核必须要使用 CONFIG_BLK_DEV_RAMCONFIG_BLK_DEV_INITRD 选项进行编译。

  新的 initrd 映像现在已经在 /boot 目录中了,因此下一个步骤是使用默认的内核来对其进行测试。现在我们可以重新启动 Linux 系统了。在出现 GRUB 界面时,按 C 键启动 GRUB 中的命令行工具。我们现在可以与 GRUB 进行交互,从而定义要加载哪个内核和 initrd 映像文件。kernel 命令让我们可以指定内核文件,initrd 命令可以用来指定 initrd 映像文件。在定义好这些参数之后,就可以使用 boot 命令来引导内核了,如清单 5 所示。

 

 
推荐文章
·浅谈关于Linux系统内核的源代码
·打造适合自己Slackware机器的内
·自己动手做一个最小的Linux kern
·一个Linux爱好者的2.6.11内核编
·定制Linux系统内核,发挥Linux潜
·如何编译一个操作系统内核-Ubunt
·重新编译Linux操作系统的内核指
·快速编译Linux内核需要的模块方
·编译内核以使其支持PS并口改装手
·编译支持NTFS的Linux系统内核模
·配置、编译Linux系统内核的实用
·Linux操作系统的内核编译详细步
·Linux操作系统的内核编译内幕详
·Linux基础知识:内核编译-内核管
 

 
↑返回顶部   打印本页   关闭窗口↓  

Google
 
Web oldhand.org unixreference.net meshmea.org
相关分类
热点文章
·Linux中的Ramdisk与Init
·一个Linux爱好者的2.6.1
·自己动手做一个最小的Li
·如何在Linux系统中添加
·如何编译一个操作系统内
·udev轻松上路
·Linux2.6内核驱动移植
·浅谈关于Linux系统内核
相关文章
·一个 Debian bittorrent
·Linux PDA和手持PC一览
·嵌入式Linux系统中的GUI
·QTE/Qtopia在Liod-270上
·如何使Linux起到防火墙
·关于Linux系统安全管理
·Bootloader存在的必要性
·ARM的嵌入式Linux移植体
更多...
 
 

Copyright(c) 2001-2009 OLDHAND ORGANIZATION, All Rights reserved.
Power by DedeCms 织梦内容管理系统