首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 应用>文章内容
Linux系统内存磁盘初始化技术详细解析
来源:www.unix5.com 作者:riechelr_hl 发布时间:2007-05-30  

 

3 创建initrd的工具。

 

现在,让我们回到一开始的讨论:initrd的镜像是如何被创建的?在传统的linux系统中,initrd是在linux build的时候被创建的。像mkinitrd这样的许许多多的工具,都能够用于通过必须的库和模块来自动构建一个用于过渡到真实根文件系统的initrd。事实上,mkinitrd工具是一个脚本文件,因此,我们能够很清楚得看到,这个过程是如何进行的。同样的,YAIRD (Yet Another Mkinitrd)工具,也允许我们自定制每一个initrd被构建的阶段。

4 自己动手,打造自定义的初始化内存盘

 

由于很多基于linux的嵌入式系统都没有硬盘驱动器,initrd也可以做为永久性的根文件系统。下面我就将告诉你们,如何创建一个initrd镜像。我使用的是标准linux桌面系统,因此大家即使没有嵌入式目标设备也可以照着做。除了交叉编译以外,嵌入式目标文件的构建过程是相同的。

 

 

#!/bin/bash 

# Housekeeping... 

rm -f /tmp/ramdisk.img 

rm -f /tmp/ramdisk.img.gz 

# Ramdisk Constants 

RDSIZE=4000 

BLKSIZE=1024 

# Create an empty ramdisk image 

dd if=/dev/zero of=/tmp/ramdisk.img bs=$BLKSIZE count=$RDSIZE 

# Make it an ext2 mountable file system 

/sbin/mke2fs -F -m 0 -b $BLKSIZE /tmp/ramdisk.img $RDSIZE 

# Mount it so that we can populate 

mount /tmp/ramdisk.img /mnt/initrd -t ext2 -o loop=/dev/loop0 

# Populate the filesystem (subDirectorIEs) 

mkdir /mnt/initrd/bin 

mkdir /mnt/initrd/sys 

mkdir /mnt/initrd/dev 

mkdir /mnt/initrd/proc 

# Grab busybox and create the symbolic links 

pushd /mnt/initrd/bin 

cp /usr/local/src/busybox-1.1.1/busybox . 

ln -s busybox ash 

ln -s busybox mount 

ln -s busybox echo 

ln -s busybox ls 

ln -s busybox cat 

ln -s busybox ps 

ln -s busybox dmesg 

ln -s busybox sysctl 

popd 

# Grab the necessary dev files 

cp -a /dev/console /mnt/initrd/dev 

cp -a /dev/ramdisk /mnt/initrd/dev 

cp -a /dev/ram0 /mnt/initrd/dev 

cp -a /dev/null /mnt/initrd/dev 

cp -a /dev/tty1 /mnt/initrd/dev 

cp -a /dev/tty2 /mnt/initrd/dev 

# Equate sbin with bin 

pushd /mnt/initrd 

ln -s bin sbin 

popd 

# 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的话,你需要首先创建一个空文件,将/dev/zero(0字符流)做为ramdisk.img的输入。得到的文件大小大约是4MB(有4000个1K的块组成)。接下来,用mke2fs命令来创建一个使用这个空文件的ext2文件系统。现在,这个文件就是一个ext2文件系统。ok,接下来,以回路设备的形式挂载这个文件到/mnt/initrd,现在,你就在挂载点拥有一个代表着ext2文件系统的目录,并用与存放你的initrd。其他大多数的脚本语句都是用于实现这个功能。

 

下一步,就是创建一些必须的子目录,用于生成你的根文件系统: /bin, /sys, /dev, 和 /pro。这里只需要少数几个目录,例如,没有/lib。但是它们已经包含了大部分功能。

 

如果想让你的根文件系统发挥更大的作用,请使用 BusyBox。这个工具是一个包含了许多独立工具的镜像,这些独立的工具你都能在linux中找到( ash, a等等wk, sed, insmod)。BusyBox的优势在于,它把它们集合在了一起,并分享了公用的部分,从而极大缩小了镜像的体积。这对于嵌入式系统来讲,是非常理想的。请将BustBox镜像从它的源目录中复制出来,到你的/bin目录下,这样,很多指向BusyBox工具集的符号链接将被创建,BusyBox能确定哪一个工具将被使用,并自动引用它。这个/bin目录下被创建的链接的小型集合将用于对启动脚本的支持。

 

再下一步,就是一小部分特殊设备文件的创建。我从我的/dev文件夹中直接拷贝了出来,别忘了加上-a选项来保持它们原有的属性。

 

倒数第二步,就是生成linuxrc文件。在内核挂载了内存盘之后,它将搜索并执行相关的启动文件,如果没有找到,内核就将linuxrc文件做为其启动脚本。你最好在这个文件中对环境变量做一些基本设置,例如挂载/proc文件系统等。除了/proc外,我还挂载了/sys文件系统,将消息发送给终端。最后,我调用ash并通过它和根文件系统交互。最后记住,用chmod把linuxrc文件的属性改为可执行。

 

最后,你的根文件系统算是ok了。现在它并没有被挂载,用gzip将它压缩,并将压缩后的文件ramdisk.img.gz拷贝到/boot目录下,这样它就能被GRUB调用。

共3页: 上一页 [1] 2 [3] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·Linux系统调用列表(详解)
·MBR如果被覆盖了怎麽办?
·Linux系统下用户和用户组所有权
·Linux操作系统下配置IPTables方
·linux应用技巧集囊(新手遍)
·Linux操作系统配置基础祥解:GRU
·Linux循序渐进 进程管理及作业控
·Linux操作系统Gaim玩转QQ与MSN--
·Linux内存映射技术
·UNIX系统操作入门篇
·linux系统管理--从头开始对ubunt
·UNIX系统应急响应工具上(初级)
  相关文章
·Linux系统开启Telnet服务的详细
·Linux内存映射技术
·linux inittab详解
·Linux操作系统:LVS ipvsadm命令
·在 Linux 上进行自动备份
·使用 ssh 进行安全的连接
·Linux系统:让内存不再泄漏的实
·shell编程技巧
·Linux操作系统的日志管理常用技
·Linux系统调用列表(详解)
·Linux操作系统配置基础祥解:GRU
·linux应用技巧集囊(新手遍)

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!