Part6: 构建根文件系统[在s3c2440开发板演示]
0 最小根文件系统最基本组成
要构建一个最小根文件系统,首先明确内核是如何启动第一个应用程序(init)的,其次再分析下init进程做了什么
下面的分析是在2.6.22.6内核源码上进行
0.1) 内核启动一个应用程序(init)的过程,看下图
0.2)init进程的分析
在嵌入式系统中,使用busybox封装了linux命令。即 busybox是一堆命令的集合。
下面是根据busybox源码分析总结(参考自韦东山老师上课笔记)
可见,构建一个最小根文件系统需满足:
1)/dev/console /dev/null 两个设备文件
2)/etc/inittab
3)init----> busybox
4)配置文件中指定的程序
5) C库
1 构建最小根文件系统
下面根据最小根文件系统的组成一步步构建
1.1 生成/dev/console和/dev/null
如下图,生成两个字符设备文件,注意:/dev/console在这里是s3c2440串口,也可是键盘+液晶显示屏
1.2 编译busybox
编译安装只需三步走,如INSTALL文件里的提示,如下
第一步:make menuconfig
在弹出的菜单中,只需勾选如下选项(Busybox Settings–>Busysbox Library Tuning里面),其它默认。如下图
Tab completion 只是为方便使用Tab自动补全命令,帮助开发
第二步: make,执行后,我的make结果如下
第三步:安装
执行 make config_prefix=xxxxx install (注意不能直接make install,xxxx为第一个文件系统目录的路径 )
如下图:
ok,busybox安装成功后,就可以使用基本的shell命令了
1.3 编写/etc/inittab配置文件
1.4 复制glib动态库到/lib
1.5 用yaffs制作根文件系统的映像文件
1.6 烧写及结果
将mini_fs.yaffs2通过usb烧写进s3c2440开发板即可,最终结果看下图
2 完善:自动检测并挂载其它文件系统(proc/sysfs) + NFS
2.1 完善一:新增proc虚拟文件系统
问题:无ps命令,即无法查看内核信息
解决办法:挂载一个proc虚拟文件系统(VFS-->内核实现)
mkdir proc
mount -t proc none /proc
2.2 完善二:自动挂载根文件系统
问题:每次手动挂载太麻烦了
解决办法:
方法一:
1)在 /etc/inittab文件新增
::sysinit:/etc/init.d/rcS
2)创建init.d/rcs, rcS内容如下
mount -t proc none /proc
3) sudo chmod +x /etc/init.d/rcS
方法二:
1)在方法1创建的init.d/rcS文件内容修改为:
mount -a # 将挂载/etc/fstab下的文件系统
2)创建/etc/fstab,内容为
proc /proc proc defaults 0 0
2.3 完善三:自动创建设备节点
问题:/dev/xxx 的设备文件有很多,一个个添加太麻烦...
解决办法:udev机制,即自动创建设备节点。这里使用它的简化版本 mdev
1) 创建sys目录,且修改过/etc/fstab配置文件,如下
mkdir sys
修改的内容为:
2) 修改/etc/init.d/rcS 内容如下
备注:将/sbin/mdev 写到 /proc/sys/kernel/hotplug,则插上U盘/驱动模块等时,内核读读取hotplug文件内容
并执行/sbin/mdev指向的程序,即执行mdev自动创建设备节点
mdev -s 表示系统上电时会检查所有现有驱动模块,自动创建设备节点
2.4 完善四:使用NFS
有两个方法:
1)从flash启动根文件系统后,再用命令去挂载NFS
1.挂接的前提:nfs服务器允许那个目录可被挂载
a) 修改nfs服务器的/etc/exports 文件
b)重启nfs服务
sudo /etc/init.d/nfs-kernel-server restart
最后服务器上测试能否挂载:
sudo mount -t nfs 服务器ip:要挂载的文件系统目录路径 /mnt
2.再用单板去挂载
mkdir /mnt
mount -t nfs -o nolock 服务器ip:要挂载的文件系统目录路径 /mnt
-o nolock什么意思呢?看下面图,不带-o nolock会报错,
因为:nfs_mount默认选项包括文件锁,依赖于portmap提供的动态端口分配功能
2)直接从NFS启动
修改u-boot的命令行参数 bootargs
>> 参考2.6.22.6内核源码的Documents的nfsroot.txt
nfsroot=[:][,]
ip=::::::
备注:autoconf: 可设置未dhcp\arap等,这里用不到,off即可
根据这两项设置即可,如下图
NFS启动的效果图如下