如何制作根文件系统
1概述
如何制作一个最小的根文件系统,能让内核在该文件系统中运行?该文章是读《嵌入式Linux应用开发完全手册》韦东山 书籍简要总结。 制作最小的根文件系统的主要分为五个部分:
① 编译Busybox得到常用命令与工具集(生成bin,sbin,usr,linuxrc); ② 构建dev目录(/dev/console,/dev/null等设备节点); ③ 构建etc目录(/etc/inittab,/etc/fstab,/etc/init.d/rcS等); ④ 构建lib目录(C库函数uclibc,glibc); ⑤ 创建其他空目录,配置需求相关文件程序;
书籍《深入浅出嵌入式底层软件开发》扬铸中总结的过程: ① 编译安装busybox,生成/bin、/sbin、/usr目录及其内容;
② 利用交叉编译工具链,构建/lib目录; ③ 手工构建/etc目录;
④ 手工构建最简化/dev目录; ⑤ 创建其他空目录;
⑥ 配置系统自动生成/proc和/sys目录; ⑦ 利用udev构建完整的/dev目录; ⑧ 制作根文件系统的Jffs2镜像文件;
2编译Busybox
注】编译的时候如果遇到有错误的地方,可以根据提示进行修改,一般的情况下,是某个命令的配置上有错误,这个时候可以选择重新执行make menuconfig进行重新配置,去掉出错的命令,重新编译即可。
安装Busybox
把这些编译好的命令可执行文件直接放到某一个指定的目录中去。 具体操作:
然后执行如下命令:make CONFIG_PREFIX=/opt/rootfs install。 此时在rootfs根目录中产生bin,sbin,usr,linuxrc目录。
3构建dev目录
/dev目录下存放的跟设备有关的文件,一些驱动程序的设备节点文件就在此目录下。
sudo mknod console c 5 1 (如果忘记,可通过查看已经安装好的linux机器/dev/console文件得知) sduo mknod null c 1 3
3.1静态创建设备文件 创建/dev/mtdblock*(块设备),/dev/ttySAC*(串口设备),/dev/console,/dev/null,即可启动系统。
其他设备文件可以等到系统启动后,使用“cat /proc/devices”命令查看内核中注册了哪些设备,再一一创建。
3.2使用mdev创建设备文件,动态更新 mdev是通过init进程来启动的,在使用mdev构造/dev目录前,init进程至少要建立设备文件/dev/console、/dev/null。
mdev是通过读取内核信息来创建设备文件,支持热插拔动态更新/dev目录。 mdev需要设置内核支持sysfs文件系统,还有支持tmpfs文件系统。
4构建etc目录
etc目录取决于要运行的程序,一般最小创建文件/etc/inittab,/etc/init.d/rcS,/etc/fstab。
vi /etc/inittab #/etc/inittab
::sysinit:/etc/init.d/rcS ::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r ::restart:/sbin/init
ttySAC0::askfirst:-/bin/sh /*根据情况需要修改,‘-’表示与用户可交互的*/
inittab文件中条目格式为
vi /etc/init.d/rcS
#!/bin/sh
mount -a /*挂接/etc/fstab文件指定的所有文件系统 */
echo /sbin/mdev > /proc/sys/kernel/hotplug /*设置内核,当有设备拔插时调用/sbin/mdev程序 */
mdev -s /*在/dev目录下生成内核支持的所有设备的结点 */
修改文件属性,使之能执行 chmod +x /etc/init.d/rcS
vi etc/fstab
fstab的格式如下:
#device mount-point type options dump fsck oder proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0
5构建lib目录
拷贝编译工具下的动态库文件。具体操作:执行arm-linux-gcc -v命令,参看交叉编译工具安装在什么目录下,然后拷贝该编译工具的arm-linux目录的lib库下的所有动态文件。或者自己编译glibc源码、uclibc源码制作c库。
例如:我的交叉编译工具安装在opt/tools目录下。在自己做的根文件系统下,建立lib目录。
mkdir lib
cd /opt/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib ls -l
cp *so* /opt/first_fs/lib –d
-d的作用,原来是一个链接文件的还拷贝成一个链接文件。到目前为止一个最小的根文件系统已经制作好了。
6构建其他目录
其他目录可以为空目录,创建:proc、mnt、tmp、sys、root等。
此时即可作为网络根文件系统直接启动,烧写到开发板还需要制作为镜像文件(例如yaffs文件系统镜像文件、jffs2、ubi等)。
问题集:
1.内核启动之后,执行的第一个脚本文件是哪一个?
答:在嵌入式系统(ubuntu9.04之前),内核启动的第一个(也是唯一的一个)用户进程init进程,init进程的执行程序通常是/sbin/init。/sbin/init解析inittab文件,inittab文件中sysinit指定的脚本为第一个执行脚本文件。嵌入式系统中通常命名它为rcS。
2.内核启动的第一个用户进程init进程,该进程执行的程序一定是/sbin/init吗?如果不一定,有哪些可能是被执行的程序?
3.Busybox中init程序执行流程简单描述一下?
4.Nand Flash的擦写寿命是有限的,如何延长Nand使用寿命? 答:将/dev、/tmp、/var三个目录挂载为tmpfs文件系统。
5.如何让linux中dev目录支持热插拔U盘,插拔U盘时自动创建或删除设备节点文件/dev/sda文件?
6.在产品研发阶段,所有根文件系统采用NFS挂载以方便开发,由于在u-boot中我们指定了开发板的IP地址为192.168.1.17,所以我们必须在rcS中指定相同的IP地址,否则在启动过程中,会因为IP地址的缘故,在执行rcS后,导致开发板无法和NFS服务器通信,也就无法进入shell。但在最终产品的根文件系统中,也许要求开发板的IP地址是别的IP,而不是192.168.1.17。应该如何做,才能做出一个即可以用于开发阶段,又可以用于最终产品的统一的根文件系统呢?
答案:提示查看/proc/mounts(深入浅出嵌入式底层软件开发有具体答案)。
7.在linux终端输入ps看不到任何进程的存在原因分析?
答案:ps机制是通过查看/proc中的内容来获得进程信息的,如果/proc目录为空则ps显示看不到任何进程。/proc是用来提供内核和进程信息的虚拟文件系统,由内核自动生成的。我们需要挂载执行mount -t proc none /proc命令。
查考文案:
1.《嵌入式Linux应用开发完全手册》韦东山 编著 2. 构建嵌入式Linux根文件系统
http://blog.chinaunix.net/uid-8363656-id-2031653.html 3. ubuntu 10.04 启动过程
http://blog.sina.com.cn/s/blog_66fb0c830100xms2.html 4.《深入浅出嵌入式底层软件开发》扬铸 编著
相关推荐: