Linux内核驱动学习(二)----根文件系统的构成 (root filesystem)

1、建立根文件系统目录和文件

1.1创建目录
技术分享
技术分享
1.2创建设备文件(命令mknod);必须创建设备文件---consle\null
技术分享
技术分享
1.3创建配置文件---复制已有的/etc目录下的文件
技术分享技术分享


1.4添加内核模块
进入Linux内核目录下,(注意,应该先编译内核,即命令make uImage ARCH=arm  CROSS_COMPILE=arm-linux-)

1.4.1、编译内核模块---命令 make modules ARCH=arm CROSS_COMPILE=arm-linux-
技术分享技术分享


1.4.2、将编译好的内核模块集中到一起,并将其放置到新建文件系统目录下/rootfs-->
命令 make modules_install ARCH=arm INSTALL_MOD_PATH=.../rootfs
技术分享

技术分享
1.5编译/安装busybox(含有Linux下的执行命令)
1.5.1、配置busybox
make menuconfig 
主要配置的选项有
**Busybox Settings ->build Options->
选中 “build busybox as a static binary”,静态链接
cross compiler prefix (arm-linux-)  ,编译交叉工具链
技术分享
技术分享
**Busybox Settings ->Installation Options -> 
选中“donot use /usr”,,选中该项可以避免busybox被安装到宿主系统的/usr目录下,破坏宿主系统
busybox installation prefix(/xxx/rootfs)  该选项表明编译后的busybox的安装位置
技术分享
技术分享
1.5.2、编译、安装
编译命令: make
安装: make install
安装后的效果 /xxx/rootfs/bin目录下多出了许多命令
技术分享



2、挂载根文件系统到内核


2.1关于文件系统介绍及分类

根据存储设备的硬件特性(NOR Flash? nandflash?)、系统需求(可读可写? 只读?),且不同的文件系统类型有不同的应用场合。
2.1.1、基于nandflash的文件系统
a>yaffs2主要用于nand型flash,支持跨平台。
b>ubifs
以上两种均为可读可写的文件系统

2.1.2、基于norflash的文件系统
a>Jffs2(可读可写)
主要用于nor型flash,特点是可读写,支持数据压缩的日志型文件系统。

2.1.3、基于内存的文件系统
a>Ramdisk
基于ram的文件系统。是将一部分固定大小的内存当做块设备来用。它并非是一个实际的文件系统,而是一种将实际的文件系统装入内存的机制。将一些经常访问而又无需更改的文件通过ramdisk放在内存中,可以明显的提高系统的性能。
b>Initramfs(现在多使用,启动系统非常快,缺点:不可保存用户数据)
基于ram的文件系统。initramfs出现在2.6内核中,它类似于tmpfs,是一种基于内存的文件系统,它的使用不需要创建内存块设备。增加文件到ramfs会自动配置更多的内存,并删除或截去文件以释放内存。(若ramdisk没有满,已被占用的额外的内存也不能用来做其它事情,若ramdisk满了,但其它仍有闲置的内存,也必须重新格式化以后才能扩展使用)

2.1.4、基于网络的文件系统
a>NFS(主要在开发阶段使用)
是由sun开发的一种在不同机器之间通过网络共享文件的技术。在嵌入式linux系统的开发调试阶段,可以利用该技术在主机上建立基于nfs的根文件系统,挂载到嵌入式设备,可以很方便的修改根文件系统的内容。
实际使用时可使用混合操作系统。。利用各个文件系统的优势。

2.2使用Initramfs 文件系统

Initramfs 文件系统是与内核固定在一起的,修改文件系统中的内容后不会立即生效,需重新编译内核。(在建立好的文件系统下操作 /xxx/rootfs/)

2.2.1、执行命令(建立软链接的原因:initramfs文件系统启动时会在根文件系统中执行第一个init程序,它对uboot传过来的参数init=/linuxrc不予理睬,所以需要在制作的根文件系统里的根目录加入init程序,否则无法启动。init程序和linuxrc程序一样都是符号链接文件,它们都是指向/bin/busybox程序。)
ln -s ./bin/busybox init

2.2.2、配置Linux内核,支持initramfs   如下图

技术分享

2.2.3编译内核

2.2.4、设置uboot环境变量(传给内核的启动参数)
setenv bootargs noinitrd console=ttySAC0,115200

2.2.5、在uboot命令行下可以查看其文件系统的内容,如下
技术分享
技术分享


2.3使用NFS文件系统

(相对于Initram文件系统,在nfs服务器上修改文件系统内容时,在开发版会立即生效。。而Initramfs文件系统需要重新编译内核,即静态编译)
2.3.1、取消在制作Initram文件系统的以下选项
技术分享
技术分享
2.3.2、**file systems-->Network File Systems--->Root file system on nfs选中该选项

技术分享
2.3.3、编译内核

2.3.4、启动参数配置(uboot 中)
setenv bootargs noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.1.112:/home/kindlyde/Desktop/arm-5/lesson4/rootfs ip=192.168.1.130:192.168.1.112:192.168.1.1:255.255.255.0:  :eth0:off
技术分享
技术分享

noinitrd :
console=ttySAC0,115200 :串口,波特率//错误:console写成了consoles,,造成信息出现在开发版上。。串口中没出现
init=/init 
root=/dev/nfs :nfs作为根目录:----》但在Linux系统中或制作的文件系统中均未发现此根目录??
rw :可读可写
nfsroot=192.168.1.112:虚拟机IP(NFS服务器地址)
:/home/kindlyde/Desktop/arm-5/lesson4/rootfs 创建的文件系统路径
ip=192.168.1.130:(开发板的IP)
192.168.1.112(NFS服务器地址)
:192.168.1.1(网关地址)
:255.255.255.0(掩码地址)
:(开发板的主机名,未取名,所以为空)
:eth0:off

2.3.5、将内核通过tftp下载到开发板中,之后启动开发板。结果如下图所示
技术分享
技术分享


注意事项以及实现系统挂载时出现的错误:

需同时设置NFS服务器的主目录地址(/etc/exports)---设计详见笔记--《配置NFS服务器》
技术分享



使用NFS服务器挂载文件系统时;
出现如下错误:Unable to mount root fs via NFS, trying floppy.
技术分享
技术分享
出错原因:
1、在下载内核的后启动内核而出现的这个问题,那么就是下载内核之前设置引导参数的时候没有设置正确,可能是nfs的解压路径不正确,
技术分享
技术分享
2、NFS的目录内容改变了。。解决方法:重启NFS服务

3、查看nfs服务器是否配置正确。。如下
技术分享



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。