- 相关推荐
一种实现嵌入式Linux的新法子
摘要 在Linux中会遇到由于文件系统 毁坏,需要 人工修复而导致系统 无法正常启动的现象。本文采纳 Linux初始化内存盘(INITRD)技巧,并把内存的一部分作为Linux的根目录,每次启动把完整 的文件系统 解压到这里,避免了系统 从毁坏的文件系统 启动。这不仅使系统 能正常启动,而且进步了系统 性能。
要害词 Linux 嵌入式 INITRD ramdisk
【Abstract】In course of building embedded Linux, the system will not start because of the bad filesystem . The paper describes a new method, which adopts INITial Ramdisk Disk and assigns part of memories as root directory of Linux. It avoids startup from a bad filesystem because it uncompresses integral filesystem to ramdisk every time. With this method, the system can not only start normally, but also it’s performance is very good.
【Keyword】Linux embedded INITRD ramdisk
引言
在Linux操作系统 中,有一项特别的功效 ——初始化内存盘INITRD(INITial Ram Disk)技巧,而且内核支撑收缩的文件系统 映像。有了这两项功效,我们可以让Linux系统 从小的初始化内存盘启动,并把系统 内存的一部分作为根文件系统 挂载,而且不应用交换 分区(如果不运行X Windows这是完整可以的),即把Linux系统 完整嵌入到内存中,而不依附于任何其他硬盘。现在PC机内存至少128M,而根文件系统 所用的只有30M,因此不仅不会使整机性能降落,反而有很大的进步。
由于系统 不工作在硬盘上,所以系统 打消了由于机械驱动而导致的问题;因为系统 运行于内存中,根文件系统 和操作完整在CPU/RAM环境下,系统 性能在速度和可靠性方面非常好;它不会由于非法关机而毁坏文件系统 ,因为我们每一次启动是把收缩的文件系统 解压至内存盘中作为根文件系统 挂载。
1 硬件请求
对于这样一个系统 ,硬件不需要 特别 的设计,只是通过普通的PC机上的组件实现。值得一提是系统 的内存的大小,它至少该当有64M。因为30M作为Ramdisk应用,剩下30多兆作为系统 运行,才干保证系统 的正常工作,我们现在的盘算机内存一般为128M,这个条件都能满足。唯一特别 的是一个flash盘 ,它相当于一个IDE接口的硬盘,大小为20M,首要用它作为启动LILO和放置根文件系统 收缩包。
2 Ramdisk的应用
Ramdisk就是将内存的一部分分配为一个分区并作为硬盘来应用。对于系统 运行时不断应用的程序,将它们放在Ramdisk中将加快盘算机的操作,如大数据量的网络服务器、无盘工作站等。为了能够应用 Ramdisk,我们在编译内核时须将block device中的Ramdisk支撑选上,它下面还有两个选项,一个是设定Ramdisk的大小,默认是4096k;另一个是initrd的支撑。它既可以直接编译进内核,也可以编译成模块,在需要 的时候加载。我们由于在启动时就用它,所以必须 将它直接编译进内核。
如果对Ramdisk的支撑已经编译进内核,我们就可以应用它了。首先在/mnt目录下创立目录ram,运行mkdir /mnt/ram;然后对/dev/ram0创立文件系统 ,运行mke2fs /dev/ram;最后挂载上/dev/ram,运行mount /dev/ram /mnt/ram,就可以象对普通硬盘一样对它进行操作了。值得注意的是,在创立文件系统 的时候,在屏幕上输出1024 inodes ,4096 blocks,即ramdisk大小为4M=4096个块,但是我们挂载上之后,用命令df –k /dev/ram查看时,显示出来ramdisk大小只有3963K,这是由于文件系统 本身占用了一些空间。
我们能根据 需要 转变 ramdisk地大小。如我们要把默认的4M增大到10M,当ramdisk是直接编译进内核的情况 下,可在LILO配置文件lilo.conf中参加一行:append=“ramdis_size=10000”,运行LILO后,重启盘算机后,ramdisk大小变为10M,或者在启动是作为启动行参数ramdis_size=10000;当ramdisk是作为可加载模块编译时,需要 在模块加载配置文件/etc/modules.conf中参加一行:options rd rd_size=10000,或者在加载rd模块是在后面加上阐明 ,即insmod rd rd_size=10000.
3 实现历程
3.1创立收缩的文件系统
我们的实现历程是依附于存在的Linux系统 。首先启动一般的Linux系统 ,在这个系统 中根据 自己的需要 ,创立一个适宜功效的文件系统 。例如我们要实现Apache网络服务器,那么只要把完成系统 启动和根基掩护需要 的一些命令、脚本、配置文件和库函数留下,再加上实现Apache服务器所需要 的。具体历程为:
在Linux下建立 目录/minlinux,我们在此目录下创立的文件系统 。系统 的所有静态链接库,赞助 手册(man pages),信息页(info pages),头文件,内核源码对于系统 运行是完整无用的,所以不需要 它们。在目录bin下放系统 掩护的一些根基工具,如ls、mv、grep、chown、chmod、chgrp、ln、rm等;在sbin下是系统 启动历程通常需要 的命令,如bash、e2fsck、mke2fs、fdisk、insmod、rmmod、depmod、modprobe、lsmod、shutdown、reboot、login、init、getty、mount、umount、等;usr/bin下放置Apache利用程序http和其他一些特别工具。然后根据 这些可履行文件需要 的动态链接库来断定 lib目录下的内容。当然目录etc下的配置文件,dev下的设备 文件需要 的都必须 要有,它们都是和可履行文件对应的,因为许多可履行文件履行时,一般是打开设备 ,根据 配置文件来运行。有一个特别的目录proc该当设置,在内核编译选项文件系统 选择中,我们选择对文件系统 proc的支撑,那么在系统 运行之后它下面有许多内容,这些内容是实时、不断跟踪系统 内核和正在运行的历程的状态 而产生 的,但不占用任何磁盘空间,而是驻留在内存中。在某些情况 下,可以通过它来系统 设置,许多工具从这里获取信息,如dmesg、ps、top等。
文件系统 制作 完成,大小该当在20M左右。
接下来把文件系统 拷贝至ramdisk为生成ramdisk映像文件做筹办。我们把系统 的ramdisk 转变到30M,重启盘算机后,履行下列操作:
dd if=/dev/zero of=/dev/ram bs=1k count=30000 把ramdisk调剂到零,以便后面有更高的收缩率;
mke2fs –m0 /dev/ram 30000 在ramdisk上建立 30M的ext2文件系统 ;
mount /dev/ram /mnt/ram 将已款式化的ramdisk挂载至目录/mnt/ram;
cp –av /minlinux/* /mnt/ram 将文件结构 拷贝至ramdisk。
然后我们对/mnt/ram/etc目录下的文件进行修正。首要的文件是fstab,它负责在系统 启动时把系统 要挂载的文件系统 信息传递给启动历程,我们应用 ramdisk作为根文件系统 ,且不需要 交换 分区,所以此文件配置
/dev/ram / ext2 defaults 1 1
none /proc proc defaults 0 0
即可。一般来说系统 启动时都要激活交换 分区,即在启动脚本中有swapon –a 命令,但我们不需要 交换 分区,因此要把这一项移除,否则启动时会打印差错信息然后收场启动。
最后我们要拷贝ramdisk的映像并将其收缩。首要步骤如下:
运行df ,注意1024-blocks一栏中/dev/ram的数值,在我的机上为25600;
卸载/dev/ram,运行cd /root切换至root目录并运行umount /dev/ram;
将ramdisk写成映象文件,运行dd if=/dev/ram of=ram30.img bs=1k count=25600
收缩,并在/root目录下产生 一个收缩的映象文件ram30.img.gz,运行gzip –9v ram30.img
3.2创立 initrd ramdisk 映像
首先我们在/dev/ram0中创立一个适宜大小的ext2文件系统 ,法子 同上,只是大小只有2048K,因为initrd ramdisk是用来指示(bootstrap)30M的ramdisk,并将它挂载至/mnt/ram。
然后在/dev/ram0中建立 映像需要 的目录和文件。创立目录bin、dev、etc、lib、mnt和可履行脚本文件linuxrc,linuxrc的内容为:
#!/bin/bash
mount –o –ro /dev/hda1/ /mnt # 以只读法子 将flash盘挂载在/mnt下
zcat /mnt/boot/ram30.img.gz > /dev/ram # 将根文件系统 映像解压至ram
umount /dev/hda1 # 卸载flash盘
bin下面为linuxrc中用到的命令;lib为这些命令需要 的动态链接库;etc下为配置文件ld.so.conf,定义命令运行时寻找所需动态链接库的路径,运行命令ldconfig –r /mnt/ram产生 文件ld.so.cach,在命令和动态链接库之间建立 对应关系;dev下根基终端设备 和linuxrc中用到的设备 :console、ram、null、systty、tty1、tty2和hda1;mnt为hda1的挂载点。
最后创立收缩的initrd ramdisk映像。
运行df 看看/dev/ram0的字节数,在我的盘算机上1684K;
转换当前目录至/root并卸载/dev/ram0 umount /dev/ram0;
拷贝/dev/ram0成映像文件 dd if=/dev/ram0 of=initrd.img bs=1k count=1684;
产生 收缩的映像文件initrd.img.gz,运行gzip -9v initrd.img。
3.3启动
系统 的启动需要 依赖flash盘,通过LILO把系统 启动信息写入flash盘主指示区。
将flash盘作为第一主盘hda,而将装有普通Linux的硬盘作为第一从盘hdb并从它启动。在flash硬盘上创立 ext2文件系统 ,将它挂载至/mnt/flash目录。在flash盘上建立 boot目录,将收缩的文件系统 和initrd映像拷贝至boot目录下,同时将Linux内核、指示区记载 boot.b、指示区映射map拷贝至其下。在普通Linux系统 中建立 LILO配置文件ramlilo.conf,配置文件如下:
boot=/dev/hda
map=/mnt/flash/boot/map
install=/mnt/flash/boot/boot.b
prompt
timeout=50
image=/mnt/flash/boot/vmlinuz
append= “ramdisk_size=30000”
label=embedded
root=/dev/ram
initrd=/mnt/flash/boot/initrd.img.gz
运行命令lilo –C ramlilo.conf ,将启动信息写入flash的主指示区MBR。
重新启动盘算机,登陆后运行mount,我们看到如下两项:
/dev/ram on / ext2 (rw)
none on /proc type proc (rw)
这显示只有ramdisk被挂载,制作 成功 。
4 结论
在我们制作 的嵌入式Linux中进行各种操作,速度非常快,而且系统 很稳固。没有出现因为根文件系统 毁坏而导致系统 进入手工掩护界面的现象。用它作为HTTP网络服务器、网络监督器、宽带通信 设备 管理器或者其他需要 长光阴不停运行的机器,都有很高的利用价值。
参考文献
1.邹思铁 嵌入式Linux设计与利用 清华大学出版社 2002 北京
2.黄敦 如何结构嵌入式Linux系统 dunn@163.net 2001
3.Tom Fawcett The Linux Bootdisk HOWTO Bootdisk-HOWTO@linuxdoc.org 200
4.Paul Moody miniHOWTO Embedded Linux 1.1b paulmoody@bigpond.com 1998
【一种实现嵌入式Linux的新法子】相关文章:
一种实现嵌入式Linux的新方法03-20
在嵌入式linux2.4.18内核中实现CS8900A网卡驱动03-07
嵌入式Linux技术的现状与发展动向03-19
嵌入式Linux系统及其应用前景03-18
嵌入式Linux系统下Microwindows的应用03-19
基于linux的网络对讲机的研究与实现03-07