《2022年2022年教你一种实现嵌入式Linux系统新方法 2.pdf》由会员分享,可在线阅读,更多相关《2022年2022年教你一种实现嵌入式Linux系统新方法 2.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、教你一种实现嵌入式Linux 系统新方法时间:2009-05-12 23:34来源:Linux Website 作者:尚观点击:53 次摘要 在 Linux 中会遇到由于文件系统损坏,需要人工修复而导致系统无法正常启动的现象。本文采用Linux 初始化内存盘(INITRD)技术,并把内存的一部分作为 Linux 的根目录,每次启动把完整摘要在 Linux 中会遇到由于文件系统损坏,需要人工修复而导致系统无法正常启动的现象。本文采用 Linux 初始化内存盘(INITRD)技术,并把内存的一部分作为 Linux 的根目录,每次启动把完整的文件系统解压到这里,避免了系统从损坏的文件系统启动。这不仅
2、使系统能正常启动,而且提高了系统性能。引言在 Linux 操作系统中,有一项特殊的功能初始化内存盘INITRD(INITial Ram Disk)技术,而且内核支持压缩的文件系统映像。有了这两项功能,我们可以让 Linux 系统从小的初始化内存盘启动,并把系统内存的一部分作为根文件系统挂载,而且不使用交换分区(如果不运行X Windows这是完全可以的),即把Linux 系统完全嵌入到内存中,而不依赖于任何其他硬盘。现在PC机内存至少128M,而根文件系统所用的只有30MB,因此不仅不会使整机性能下降,反而有很大的提高。由于系统不工作在硬盘上,所以系统消除了由于机械驱动而导致的问题;因为系统运
3、行于内存中,根文件系统和操作完全在CPU/RAM 环境下,系统性能在速度和可靠性方面非常好;它不会由于非法关机而破坏文件系统,因为我们每一次启动是把压缩的文件系统解压至内存盘中作为根文件系统挂载。1 硬件要求对于这样一个系统,硬件不需要特别的设计,只是通过普通的PC机上的组件实现。值得一提是系统的内存的大小,它至少应该有 64M。因为 30M作为 Ramdisk使用,剩下 30 多兆作为系统运行,才能保证系统的正常工作,我们现在的计算机内存一般为 128M,这个条件都能满足。唯一特别的是一个flash 盘,它相当于一个 IDE 接口的硬盘,大小为20M,主要用它作为启动LILO 和放置根文件系
4、统压缩包。2 Ramdisk 的使用Ramdisk就是将内存的一部分分配为一个分区并作为硬盘来使用。对于系统运行时不断使用的程序,将它们放在 Ramdisk中将加快计算机的操作,如大数据量的网络服务器、无盘工作站等。为了能够使用Ramdisk,我们在编译内核时须名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 5 页 -将 block device中的 Ramdisk支持选上,它下面还有两个选项,一个是设定Ramdisk的大小,默认是 4096k;另一个是 initrd的支持。它既可以直接编译进内核,也可以编译成模块,在需要的时候加载。我们由于在启动时就用它,所以必须将它直接编译进
5、内核。如果对 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,这是由于文件系
6、统本身占用了一些空间。我们能根据需要改变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
7、 rd_size=10000。3 实现过程3.1 创建压缩的文件系统我们的实现过程是依赖于存在的Linux 系统。首先启动一般的Linux 系统,在这个系统中根据自己的需要,创建一个适合功能的文件系统。例如我们要实现Apache网络服务器,那么只要把完成系统启动和基本维护需要的一些命令、脚本、配置文件和库函数留下,再加上实现 Apache服务器所需要的。具体过程为:在 Linux 下建立目录/minlinux,我们在此目录下创建的文件系统。系统的所有静态链接库,帮助手册(man pages),信息页(info pages),头文件,内核源码对于系统运行是完全无用的,所以不需要它们。在目录 bi
8、n 下放系统维护的一些基本工具,如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 下的设备文件需要的都必须要有,它们都是和可执行文件
9、对应的,因为许多可执行文件执行时,一般是打开设备,根据配置文件来运行。有一个特殊的目录proc 应该设置,在内核编译选项文件系统选择中,我们选择对文件系统proc 的支持,那么在系统运行之后它下面有许多内容,这些内容是实时、不断跟踪系统内核和正在运行的进程的状态而产生的,但不占用任何磁盘空间,而是驻留在内存中。在某些情况下,可以通过它来系统设置,许多名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 5 页 -工具从这里获取信息,如dmesg、ps、top 等。文件系统制作完成,大小应该在20MB 左右。接下来把文件系统拷贝至ramdisk 为生成 ramdisk 映像文件做准备。我
10、们把系统的 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,它负责在系
11、统启动时把系统要挂载的文件系统信息传递给启动进程,我们使用ramdisk 作为根文件系统,且不需要交换分区,所以此文件配置为:/dev/ram /ext2 defaults 1 1none /proc proc defaults 0 0 即可。一般来说系统启动时都要激活交换分区,即在启动脚本中有swapon a 命令,但我们不需要交换分区,因此要把这一项移除,否则启动时会打印错误信息然后停止启动。最后我们要拷贝 ramdisk 的映像并将其压缩。主要步骤如下:运行 df,注意 1024-blocks 一栏中/dev/ram 的数值,在我的机上为 25600;卸载/dev/ram,运行 cd/r
12、oot切换至 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。名师资料总结-
13、精品资料欢迎下载-名师精心整理-第 3 页,共 5 页 -然后在/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.c
14、onf,定义命令运行时寻找所需动态链接库的路径,运行命令 ldconfig r/mnt/ram产生文件 ld.so.cach,在命令和动态链接库之间建立对应关系;dev 下基本终端设备和linuxrc中用到的设备:console、ram、null、systty、tty1、tty2 和 hda1;mnt 为 hda1 的挂载点。最后创建压缩的initrd ramdisk 映像。运行 df 看看/dev/ram0 的字节数,在我的计算机上 1684KB;转换当前目录至/root并卸载/dev/ram0 umount/dev/ram0;拷贝/dev/ram0 成映像文件 dd if=/dev/ram
15、0 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、引导区映射
16、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,将启动信息写入 fl
17、ash的主引导区 MBR。重新启动计算机,登陆后运行mount,我们看到如下两项:/dev/ram on/ext2(rw)none on/proc type proc(rw)名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 5 页 -这显示只有 ramdisk 被挂载,制作成功。4 结论在我们制作的嵌入式Linux 中进行各种操作,速度非常快,而且系统很稳定。没有出现因为根文件系统损坏而导致系统进入手工维护界面的现象。用它作为HTTP 网络服务器、网络监视器、宽带通信设备管理器或者其他需要长时间不停运行的机器,都有很高的应用价值。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 5 页 -