实验8 构建嵌入式Linux文件系统
1、实验目的
了解Linux 文件系统的结构
了解BusyBox的实现机理
编译BusyBox并构建嵌入式linux根文件系统
2、实验设备
硬件:PC 机,嵌入式系统实验箱
软件:Red Hat 9
3、简介文件系统
文件系统是指在一个物理设备上的任何文件组织和目录,它构成了Linux 系统上所有数据的基础,Linux 程序、库、系统文件和用户文件都驻留其中,因此,它是系统中庞大复杂且又是最为基本和重要的资源。值得提出的是,Linux 系统中的文件不仅包括普通的文件和目录,每个和设备相关的实际实体也都
被映射为一个文件,例如磁盘、打印机、终端等等,这样的设备文件又称为特殊文件。所以,Linux下的文件是操作系统服务和设备的简单而又统一的接口,从某种意义上可以说,Linux里的一切事物都是文件。
由于Linux是一个多任务、多用户的操作系统,因此它里面的文件还都被赋予了一定的权限,权限决定谁能读、写或执行一个文件,以及这个文件的类型和如何执行。例如下面的文件列表:
-rw-r--r-- 1 root root 1756 Sep 4 2002 inittab
就表示:这个名为inittab的文件是普通文件,所有者有读写的权限,所在组和其他人都只有读的权限,它的连接数为1,所有者及文件所属的组都是root,文件中字节数为1756,文件创建日期是2002年9月4日。可以通过对文件属性的设置,来满足文件在不同用户组、不同用户操作下的不同状态。
3.1 文件系统的结构
在Linux中,文件系统的结构是基于树状的,根在顶部,各个目录和文件从树根向下分支,目录树的最顶端被称为根目录(/)。Linux操作系统由一些目录和许多文件组成,例如,/bin目录包含二进制文件的可执行程序,/sbin目录用于存储管理系统的二进制文件,/etc目录包含绝大部分的Linux 系统配置文件,/lib目录存储程序运行时使用的共享库,/dev目录包含称为设备文件的特殊文件,/proc 目录实际上
是一个虚拟文件系统,/tmp目录用于存储程序运行时生成的临时文件,/home目录是用户起始目录的基础目录,/var目录保存要随时改变大小的文件,/usr目录及其子目录对Linux系统的操作
非常重要,它保存着系统上的一些最重要的程序以及包含你安装的大型软件包。
3.2  BusyBox 的诞生
BusyBox最初是由Bruce Perens在1996年为Debian GNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可引导的GNU/Linux系统,这可以用作安装盘和急救盘。一张软盘可以保存大约1.4-1.7MB的内容,因此这里没有多少空间留给Linux 核以及相关的用户应用程序使用。BusyBox是按照GNU General Public License(GPL)许可证发行的。这意味着如果在一个项目中使用BusyBox,就必须遵守这个许可证。
BusyBox揭露了这样一个事实:很多标准Linux工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如 grep 和 find)都需要在目录中搜索文件的代码。当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。实际上,BusyBox 可以将大约3.5MB的工具包装成大约200KB大小。这就为可引导的磁盘和使用Linux的嵌入式设备提供了更多功能。可以对2.4和2.6版本的Linux内核使用BusyBox。
BusyBox将许多常用的UNIX命令和工具结合到了一个单独的可执行程序中。虽然与相应的GNU工具比较起来,busybox所提供的功能和参数略少,但在比较小的系统(例如启动盘)或者嵌入式系统中,已经足够了。
busybox在设计上就充分考虑了硬件资源受限的特殊工作环境。它采用一种很巧妙的办法减少自己的体积:所有的命令都通过“插件”的方式集中到一个可执行文件中,在实际应用过程中通过不同的符号链接来确定到底要执行哪个操作。例如最终生成的可执行文件为busybox,当为它建立一个符号链接ls的时候,就可以通过执行这个新命令实现列目录的功能。采用单一执行文件的方式最大限度地共享了程序代码,甚至连文件头、内存中的程序控制块等其他操作系统资源都共享了,对于资源比较紧张的系统来说,真是最合适不过了。在busybox的编译过程中,可以非常方便地加减它的“插件”,最后的符号链接也可以由编译系统自动生成。
3.3 完善文件系统
参考一个正常的Linux 系统就会发现,busybox 建立的文件系统还缺少很多文件,其中包括proc等重要的文件夹。下面三行命令建立了常见UNIX 系统中包含的一些目录,虽然它们不全是必需的,但建立它们更符合标准一些。这些命令都是在新文件系统的根目录中执行的,第三条命令的执行还必须要有root 权限。
mkdir mnt root var tmp proc boot etc lib
chown 0:0R *
如果busybox采用了动态链接的方式编译,还需要把busybox 所需要的动态库:
libcrypt.so.1、libc.so.6、ldlinux.so.2 放到lib目录中。最好按照标准的方式建立相应的文件和链接,可以参考下面的列表:
-rwxrwxrwx 192519ld-2.3.2.so
lrwxrwxrwx 111ld-linux.so.2 -> ld-2.3.2.so
-rwxrwxrwx 1 1190032libc-2.3.2.so
lrwxrwxrwx 113libc.so.6 -> libc-2.3.2.so
-rwxr-xr-x 118348libcrypt-2.3.2.so
lrwxrwxrwx 117libcrypt.so.1 -> libcrypt-2.3.2.so
linux内核设计与实现 pdf
这里需要说明的是,虽然BusyBox只使用了这三个库文件,但并不能保证往后向文件系统添加的应用程序只使用这三个库文件,其中典型的,C++的库文件这里就没有。库文件的添加是构造嵌入式linux根文件系统中最耗时,最头疼的事情。同时,它也是嵌入式文件系统中体积最大的文件。因此,嵌入式系统中一般使用精简过的C 库。同时,也就想尽办法去掉一些没有的库。要知道的应用程序需要什么库文件,可以在目标系统中使用ldd命令。
3.4 编写etc目录下的文件
etc文件夹是许多系统配置文件保存的地方。这些文件非常重要,如果配置错误,就可能影响系统的启动。busybox源代码example/bootfloopy/etc目录中的文件算是一个简单的例子,可以把其中的文件拷贝过来作为基础。(在example/bootfloopy目录中的一些脚本和文档也很值得阅读)首先inittab 文件是系统启动后所访问的第一个脚本文件,后续启动的文件都由它指定。这个文件的格式和普通微机Linux上的inittab是有区别的,其具体含义可以参考busybox的文档。
4、实验步骤
(1) 安装编译器,进入目录/root/S3c2410_Install/bochuang
# cd /root/S3c2410_Install/bochuang
#sh install.sh(如果已经安装好编译器,会提示目标文件夹已经存在,请备份或改到其它位置,则可以忽略此步,经续向下执行)
#mkdir myjob (如果在root目录已有此文件夹,此步可以省略)
(2)拷贝busybox到myjob目录下。
#cd  /arm2410cl/rootfs
#cp  -drf  busybox-1.00-pre10  /root/myjob
#cp  -drf  target  /root/myjob
(3)编译busybox
#cd  busybox-1.00-pre10
#make clean
#make menuconfig
观察已经更改好的配置,保存并退出。
#make install
这时在busybox-1.00-pre10目录下生成_install目录,刚才编译的结果都在此目录下。
(4)建立完整的文件系统目录
#mkdir myroot
#cd myroot
#mkdir  proc  etc  dev  mnt  tmp  lib  root  var
#mkdir  mnt/nfs  /mnt/yaffs
拷贝_install目录下的内容到本目录
#cp  -rf  ../ busybox-1.00-pre10/_install/*  .
(5)拷贝busybox目录下的example/bootfloopy/etc下的所有内容到etc目录下。并观察#cp  -rf  ../ busybox-1.00-pre10/example/bootfloopy/etc/*  etc/
修改文件:
fstab:
#/bin/mount -f -t cramfs -o remount /dev/bon/3
#/bin/mount -t ramfs ramfs  /var
#/dev/bon/3 / cramfs defaults 0 0
ramfs /var ramfs defualts 0 0
none            /proc          proc    defaults        0 0
none            /dev/pts        devpts  mode=0622      0 0
tmpfs          /dev/shm        tmpfs  defaults        0 0
/dev/mtdblock/1 /mnt/yaffs      yaffs  defaults        1 1
#/dev/bon/4  /mnt/yaffs      yaffs  defaults        1 1
inittab:
:
:sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbinswapoff -a
profile文件
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo -n "Processing / "
HOME=/root
PS1=[\\w]
PATH=$PATH:./
#export FRAMEBUFFER='/dev/fb/0'
#export TSDATAFILE='/mnt/yaffs/minigui/tsdata.dat'
#LD_LIBRARY_PATH=/mnt/yaffs/lib
cd /mnt/yaffs
alias ll='ls -l'
alias mntnfs='mount -t nfs -o nolock'
if [ -f /mnt/yaffs/.profile ]; then
cp -a /mnt/yaffs/.profile ~/
fi
if [ -f /mnt/yaffs/autoexec.sh ]; then
sh autoexec.sh
fi
echo "runing /etc/profile ok"
# no-op
echo "Done"
echo
init.d/rcS
#! /bin/sh
mount -o remount,rw /
/
bin/mount -a
#>/etc/mtab
ln -s /dev/vc/0 /dev/tty0
ln -s /dev/fb/0 /dev/fb0
PATH=/sbin:/bin:/usr/sbin:/bin
在dev目录下,应该实现创建节点console、null。转到myroot/dev/目录来创建:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。