Part6: 构建根文件系统(在s3c2440开发板演示)

0 最小根文件系统最基本组成
要构建一个最小根文件系统,首先明确内核是如何启动第一个应用程序(init)的,其次再分析下init进程做了什么
下面的分析是在2.6.22.6内核源码上进行
0.1) 内核启动一个应用程序(init)的过程,看下图

内核启动第一个应用程序过程

0.2)init进程的分析
在嵌入式系统中,使用busybox封装了linux命令。即 busybox是一堆命令的集合。
下面是根据busybox源码分析总结(参考自韦东山老师上课笔记)

init进程分析

可见,构建一个最小根文件系统需满足:
1)/dev/console  /dev/null  两个设备文件
2)/etc/inittab 
3)init----> busybox
4)配置文件中指定的程序
5) C库
1 构建最小根文件系统
下面根据最小根文件系统的组成一步步构建
1.1 生成/dev/console和/dev/null

如下图,生成两个字符设备文件,注意:/dev/console在这里是s3c2440串口,也可是键盘+液晶显示屏
生成/dev/console和/dev/null

1.2 编译busybox

busybox解压缩
编译安装只需三步走,如INSTALL文件里的提示,如下
安装busybox的三步走
第一步:make menuconfig
在弹出的菜单中,只需勾选如下选项(Busybox Settings–>Busysbox Library Tuning里面),其它默认。如下图
Tab 勾选
Tab completion 只是为方便使用Tab自动补全命令,帮助开发
第二步: make,执行后,我的make结果如下
编译busybox的make结果
第三步:安装
执行 make config_prefix=xxxxx install (注意不能直接make install,xxxx为第一个文件系统目录的路径 )
如下图:
安装busybox成功图
ok,busybox安装成功后,就可以使用基本的shell命令了

1.3 编写/etc/inittab配置文件

编写/etc/inittab配置文件

1.4 复制glib动态库到/lib

复制glib动态库到/libglibc库的复制结果

1.5 用yaffs制作根文件系统的映像文件

yaffs的编译
制作mini_fs.yaffs2

1.6 烧写及结果
将mini_fs.yaffs2通过usb烧写进s3c2440开发板即可,最终结果看下图

mini_fs结果

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
	修改的内容为:

/etc/fstab文件内容

2) 修改/etc/init.d/rcS 内容如下

修改/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 文件

修改/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提供的动态端口分配功能

不使用-o nolock会报错
禁止文件锁-o nolock挂载nfs
2)直接从NFS启动
修改u-boot的命令行参数 bootargs
>> 参考2.6.22.6内核源码的Documents的nfsroot.txt
nfsroot=[:][,]
ip=::::::
备注:autoconf: 可设置未dhcp\arap等,这里用不到,off即可
根据这两项设置即可,如下图
设置bootargs用于nfs
NFS启动的效果图如下
NFS启动结果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值