微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Linux根文件系统Root Filesystem的制作

ARM Linux根文件系统Root Filesystem的制作

时间:11-09 来源:互联网 点击:
http://xianzilu.spaces.live.com/blog/fakehandlerpage.aspx?wa=wsignin1.0

http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!290.entry

关于根文件系统的制作,网络上有很多文章,大多数都只讲到建几个目录,然后用Busybox做个Shell,有很多关键的东西没有说。经过很长时间的摸爬滚打,我终于能够白手起家建立一个根文件系统了。其实我也不懂得原理,只是告诉大家我的作法,其中也不免有错误,欢迎大家指正。

首先介绍根文件系统的组成:目录、Shell、库、脚本,一个个来。

  • 目录

根文件系统要包含这些必须有的目录:/dev、/bin、/usr、/sbin、/lib、/etc、/proc、/sys

/dev是devfs(设备文件系统)或者udev的挂在点所在。在使用devfs的内核里如果没有/dev,根本见不到Shell启动的信息,因为内核找不到/dev/console;在使用udev的系统里,也事先需要在/dev下建立console和null这两个节点。关于devfs和udev的区别,网上很多文章说。当然如果你的内核已经不支持devfs了(2.6.12以后),可以使用纯纯的静态节点。也就是用mknod人工生成。

/bin、/usr/bin、/usr/sbin、/sbin是编译Busybox这个Shell时候就有的,用于存放二进制可执行文件,就不多解释了。

/lib用于存放动态链接库。网上很多文章都说静态编译Busybox,可以省去建库的麻烦过程。这样做只能让Busybox启动,我们自己写的,或者是编译的软件包还是需要动态库的。除非全部静态编译,你可以试试,一个Hello world就要几百k。关于库的内容后面仔细说。

/etc是用来存放初始化脚本和其他配置文件的。关于初始化脚本的内容后面仔细说。

/proc是用来挂载存放系统信息虚拟文件系统——“proc文件系统”,“proc文件系统”在内核里面可以选。如果没有“proc文件系统”,很多Shell自己的命令就没有办法运行,比如ifconfig。“proc文件系统”不像devfs可以自动挂载,它需要使用初始化脚本挂载。另外,udev也需要“proc文件系统”的支持。

/sys用于挂载“sysfs文件系统”,“sysfs文件系统”在内核里面可以选。目前我认为它就是给udev提供支持的,。“sysfs文件系统”也需要使用初始化脚本挂载。

另外还可以有/tmp、/mnt、/swp、/var这样的不是嵌入式系统必须的目录,在说完Shell的制作之后,我再谈建立目录的事情。

  • Shell

Shell很简单,就是Busybox,上网下载一个来:http://www.busybox.net/downloads/。说Busybox和arm-linux-gcc有兼容性问题,不过我觉得那是比较低版本的时代问题了,我用Busybox 1.8.2和arm-linux-gcc 3.4.1/3.3.2都可以。解压缩以后找到Makefile里面的ARCH和CROSS_COMPILE,改成:
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
当然CROSS_COMPILE由你自己的编译器位置决定,然后
# make menuconfig
# make
# make install
注意配置的时候把一些uCLinux Only的东西去掉,不然会错;配置的时候还可以修改安装位置,默认是在Busybox下的“_install”。

之后就可以在Busybox生成的Shell基础上建立根文件系统了,我就用命令来说吧,Busybox在/home/lxz/busybox,根文件系统在/home/lxz/rootfs

# mkdir /home/lxz/rootfs
# cd /home/lxz/busybox/_install
# cp -r ./ /home/lxz/rootfs

# cd /home/lxz/rootfs
# mkdir dev
# mkdir etc
# mkdir lib
# mkdir proc
# mkdir sys
# mkdir tmp

如果不用devfs,下面的命令是必须的。必须以root用户执行(用su命令可以切换为root,切换后用exit命令可以返回普通用户):

# cd /home/lxz/rootfs/dev
# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3

如果不使用devfs没有这两个静态节点,console的提示根本就看不到,出现的现象可能是内核提示Free init memory: XXK之后,Warning: Unable to find a initial console之类的,具体的单词记得不是很准确。我没有试过使用udev的时候没有这两个静态节点的情况,反正放了也不影响把/dev挂载为tmpfs。

如果使用udev,还需要把udevd、udevstart、udevadmin这三个文件放到/sbin里面(我使用udev-117,网上介绍较多的udev-100有9个文件要放)。

库可是一件非常麻烦的事请。我建议初学者拷贝买的开发板里面带的文件系统的库,如果开发板的文件系统是映像,只需要把映像挂载在某个目录下就可以访问,假设映像叫做rootfs.cramfs,可以这样

# mkdir /home/lxz/evb_rootfs
(切换为root用户)
# mount -o loop rootfs.cramfs /home/lxz/evb_rootfs
(可以切换为普通用户)
# cd /home/lxz/evb_rootfs/lib
# cp -r ./ /home/lxz/rootfs/lib

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top