首页 > 代码库 > 根文件系统袁丽丽
根文件系统袁丽丽
1、1、根文件系统概述
1.为什么需要根文件系统
(1)init进程的应用程序在根文件系统上
(2)根文件系统提供了根目录/
(3)内核启动后的应用层配置(etc目录)在根文件系统上
(4)shell命令程序在根文件系统上
总结:一套Linux体系,只有内核本身是不能工作,必须要根文件系统相配合,主要是要根文件系统/etc下的配置文件、/bin、/sbin等目录下的shell命令相配合等等,还有/lib下的库文件(静态链接库,动态链接库)等等
1、2、根文件系统的实质
(1)、根文件系统是特殊用途的根文件系统
(2)根文件系统也必须属于某种文件系统格式
(3)究竟文件系统是用来干嘛的。
文件系统就是对一个存储设备中的扇区进行管理的,因为一个文件可能在存储设备的多个扇区中存放的,靠我们的人的大脑是不能记住和进行操作移动文件到别的扇区的,所以有文件系统,文件系统就是来管理存储设备中的扇区的,文件系统是一套代码,一个软件,这个软件中列出了一个表格,记录了每一个扇区,来对每一个扇区进行操作管理,将这些对扇区的访问,变成了对目录和文件名的访问,在物理层是没有目录和文件名的概念的,这些存储设备只认识扇区,所以我们在上层用一个目录和文件名访问一个文件的时候,文件系统这套软件就会将目录和文件名转换扇区号进行访问,这个时候对底层来说,还是用的扇区号来访问存储设备的,但是对于上层了来说,就是利用目录和文件名来访问的了
不同的文件系统差异就是在对扇区的管理策略和方法不同,比如坏块管理,和碎片管理
1、3、根文件系统的形式
1、镜像文件形式
(1)使用专用工具软件制作出来的可供烧录的镜像文件
(2)镜像中包含了根文件系统的所有文件
(3)烧录此镜像类似于对相应的分区格式化,格式化成按照我们这种文件系统类型可以识别的东西
(4)镜像文件系统得有一定的格式
2、文件夹形式
(1)这种格式的根文件系统其实就是一个包含了特定内容的文件夹而已。特定的内容是指/etc下的那些配置文件,/bin下的那些可执行程序等
(2)这种形式的根文件系统,就是由一个空文件夹添加了一些必要的文件构成的。
(3)根文件系统的雏形就是在开发主机中构造的文件夹形成的,最后由一个专用的软件工具将这个文件夹弄成一个镜像文件。
(4)文件夹形式的根文件系统,就是由一个空的文件夹,在这个文件夹里面添加了一些必要的运行时配置文件etc目录下的,bin目录下的可执行程序,lib下的库文件等等,就形成了一个文件夹形式的根文件系统,这个文件夹根文件系统是在开发主机上的,内核在启动的时候要通过nfs远程挂载来将这个文件夹形式的根文件系统挂载到内核上,但是不能用来烧录块设备,我们为了将rootfs烧录到我们的块设备中,于是就用了一些专用的软件工具将其制作成可供烧录的一定格式的根文件系统镜像文件
(3)文件夹形式的rootfs是没有格式的,只是Linux系统中的一个文件夹而已,但是制作成镜像后,就有了一定的rootfs格式,格式是由镜像制作过程和制作工具来决定的
1、4、自己制作ext3格式的根文件系统
1、mke2fs介绍
(1)mke2fs是Linux系统中的一个应用程序,在Ubuntu中默认是安装的,这个应用程序就是用来制作ext2或者ext3格式或者ext4等格式的根文件系统的
(2)ubuntu14.04中的mkfs.ext2等都是mke2fs的符号链接的
(3)参考老师的这节课中的笔记,他那里有制作ext2格式的根文件系统镜像的步骤,开始时是dd命令创建了一个ext2格式的rootfs,接着执行那几步后,要在目录下在创建一个rootfs文件夹,完了后mount挂载这个ext2倒这个rootfs文件夹中,因为这个ext2,是一个文件,我们不能直接在这个文件中添加东西,但是因为根文件系统中要有一些特定的文件内容,所以我们将这个ext2格式的文件挂载到rootfs文件夹下后,这个时候这个文件夹就相当于这个ext2格式的文件的窗口,可以在这个文件夹下添加文件,添加时就相当于在往这个ext2格式的文件中添加,添加一个linuxrc,这个时候添加的只是一个普通的文件,在以后的过程在添加详细的,完整的,添加完成后,执行老师下面的那两个卸载命令,卸载完成后,这个rootfs文件夹下的内容就没有了,将这个文件夹删掉后,在将这个已经有内容的ext2格式的镜像文件复制到共享文件夹下,在uboot命令行下用fastboot命令,在windows中用fastboot软件将这个根文件系统镜像烧录到iNand中,之后启动内核,就可以看到挂载成功了,但是内核启动不起来,因为我们制作的根文件系统中的那个linuxrc只是一个普通的空文件,并不是一个有着特定内容的应用程序,这个根文件系统中还缺少很多文件,后续再做,但是目前是挂载成功的
老师笔记:
(1)创建rootfs.ext2文件并且将之挂载到一个目录下方便访问它
《参考资料:http://blog.csdn.net/zhengmeifu/article/details/24174513》
dd if=/dev/zero of=rootfs.ext2 bs=1024 count=2048
losetup /dev/loop1 rootfs.ext2
mke2fs -m 0 /dev/loop1 2048
mount -t ext2 /dev/loop1 ./rootfs/
之后进入到这个rootfs中,在这个文件夹下添加一些根文件系统必要的东西,比如linuxrc应用程序和其他的一些。这里只是普通的创建了一个linuxrc文件,单纯的只是想在内核挂载时能挂载成功
(2)卸载掉,然后镜像就做好了。
umount /dev/loop1
losetup -d /dev/loop1
(3)if=/dev/zero if表示输入,一个zero空的文件
of=rootfs.ext2 of表示输出到,输出一个rootfs.ext2的文件
bs=1024扇区大小也就是block大小,块大小是1024B
count=2048一共2048个块,所以是1KB*2048 = 2M,所以我们做的根文件系统镜像是2MB大的
mount -t ext2 /dev/loop1 ./rootfs/
将这个rootfs.ext2挂载到当前目录下的一个rootfs文件夹下,以便去访问这个rootfs.ext2格式的文件,这个文件夹相当于一个窗口,也就是挂载的含义
1、5、nfs启动自作的简易文件夹形式的rootfs
1、什么是nfs(net file system 网络文件系统)
(1)nfs是一种网络通讯协议,由服务器和客户端构成,服务器呢就是提供nfs一套服务的软件,客户端就是通过nfs这个协议来和服务器进行通信和工作的一套软件,所以服务器运行在一个电脑设备里面,客户端运行在另一个电脑里面
(2)nfs的作用就是可以让客户端和服务器之间进行网络通信,利用nfs这种协议可以做出很多直接性的应用,我们这里使用nfs主要是用来实现根文件系统的挂载,文件夹形式的根文件系统,我们是开发板中运行Linux kernel来做nfs客户端,主机Ubuntu中搭建nfs服务器。在主机Ubuntu中将文件夹形式的根文件系统放到nfs服务器中进行导出,这样我们客户端中就可以通过这套通信协议去服务器中挂载这个文件夹形式的根文件系统到我们的内核中,启动系统。
(3)所以我们要确定我们开发板中运行的那个kernel,是支持nfs客户端的,确定我们是配置好的,其次要在主机Ubuntu中搭建nfs服务器,并且将实现制作好的文件夹形式的roots放到nfs服务器中进行导出。最后我们在客户端去挂载服务器中的那个文件夹形式的rootfs就行了
(4)参考老师的搭建nfs服务器的文档进行搭建
ufw disable这在Ubuntu14.04中是关闭防火墙的
如果按照文档中的步骤做到这一步的时候show mount localhost -e 发现有RPC的不正确的情况,那是因为没有更新好,重启下Ubuntu就好了,在重启nfs四个OK就会全部出现了。
mount -t nfs -o nolock 192.168.1.141: /root/rootfs/rootfs /opt 将rootfs通过nfs挂载到opt上测试
不用了以后要umount /opt/ 去卸载,不然会影响opt的使用
2、配置内核以支持nfs作为rootfs
(1)uboot传参的时候可以告诉内核根文件系统是nfs格式的文件系统的话,uboot中的bootargs参数就是这个了
setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/root/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
(2)解析,设置uboot的bootargs参数,root=等于是告诉内核文件系统是通过nfs的,就是网络文件系统,nfsroot=是告诉内核nfs服务器的IP地址的,我们用的Ubuntu的,我的Ubuntu的IP地址是192.168.1.141
接着后面的:后面的东西是告诉内核nfs的那个文件夹是在哪的,我的是在/root/rootfs/rootfs,这个文件夹,后面的iP是分别是我们开发板的IP地址(内核的,如果内核中没有设置,就会用这个)、主机Ubuntu的IP地址、网络网关的地址、子网掩码,接着的两个冒号是因为省略了一个东西,然后是主机的网卡eth0:off就是关闭dhcp分配地址的,反正就是格式。
(3)将uboot中的bootargs设置成这个后,启动内核发现内核并没有挂载上根文件系统,原因是因为我们的内核中关于nfs的配置没有配置好,所以要用make menuconfig对内核进行配置,配置的东西参考老师提供的那个x210nfs启动的配置参数
总结:
(1)nfs启动相当于开发板上的内核远程挂载到主机上的rootfs文件夹,因为这个时候rootfd并不在开发板行,而在主机上了,是通过网线进行挂载的,如果网线断了,那么内核就尴尬了,找不到rootfs了。
(2)nfs启动不用制作rootfs镜像文件
(3)nfs不适合真正的产品,只是在产品开发调试的阶段会用到
1、6、到底什么是linuxrc
1、/Linuxrc是一个可执行的应用程序
(1)/linuxrc是应用层的,和内核源码一点关系都没有
(2)/linuxrc在当前的开发板内核系统下是可以直接运行的,所以在ARM的SOC体系下,这个linuxrc是arm-Linux-gcc编译连接的,如果是在PC机上运行的就是用gcc编译连接的
(3)/linuxrc一般是静态链接的,那么就可以直接运行
2、linuxrc执行时引出用户界面
(1)用户界面是在linuxrc运行时间接或者直接被调用执行的,用户界面有自己专门的应用程序,用户界面的应用程序可能是进程3、进程4、、、、、、是被linuxrc这个父进程引出来的
3、linuxrc负责系统启动后的配置
(1)操作系统启动以后不能直接用,要配置一下后才能用。
(2)操作系统启动后的应用配置etc,一般叫运行时配置是为了让操作系统用起来后更方便,更具有实用性
4./linuxrc在嵌入式Linux中一般就是busybox
(1)busybox是用C语言写出来的一个项目。所以里面包含了很多的.c .h文件,这个项目是可以被编译配置成在各个平台下面运行的可执行的应用程序,我们如果用arm-linux-gcc编译这个busybonx就可以得到一个可以在我们的开发板的Linux内核上运行的应用程序,这个程序就可以成为我们的linuxrc
(2)busybox这个程序开发出来就是为了在嵌入式的环境下,构建根文件系统使用的,也就是说他是为嵌入式专门开发的init进程应用程序
(3)这个busybox还为我们当前系统提供了一套shell命令集,
(4)busybox在嵌入式中就是linuxrc,那么linuxrc的任务,就是busybox的任务,这个busybox中涵盖了很多操作系统下用的命令,比如ls vi 等,这么多命令的应用程序全在busybox中了
1、7、rootfs中好应该有什么?
(1)rootfs中的/linuxrc这个是很重要的,这个应用程序引出了后面的很多东西,包括用户界面,包括配置的东西,其中这个应用程序很大一部分是shell的命令集
(2)研究一下Ubuntu14.04的操作系统上的,根目录,看下rootfs都有哪些东西,
其中bin和sbin目录是放shell命令集的,sbin目录一般是操作系统管理员用户用的,bin目录一般是普通用户用的,lost+found就是回收站,cdrom是挂载cd用的,opt目录是一个杂的目录,可以随便用的,home目录是用户对应的那个目录,相当于windows中的那个用户我的文档之类的,tmp,mnt都是可以随便用的,vmlinuxz是内核,没有经过压缩的内核,board目录也不是非必须的。media也是跟挂载有关的,是和那些影音相关的。output是放输出一个类的东西的,也是非必须的,sys和proc这两个目录是必须的。usr目录页是应该要有的,是和用户有关的,里面放的应该是用户可以装的东西,用户可以有的东西。boot目录也不去管它。etc是也是非常重要的目录
(3)dev目录下放的设备文件,是一个非常重要的目录,在根文件系统中不可以缺少,这个目录下放的是一个设备对应的设备文件的,在Linux中,有一个理念就是一切设备皆是文件,因此以个硬件设备就被虚拟化成一个设备文件来按照文件的访问方式来访问,在Linux系统中一个/dev/xxx的文件,就表示一个硬件设备,我们要操作一个硬件设备的时候,就用open去打开这个设备文件,然后read/write/ioctl来操作者个设备,最后close关闭这个设备。
(4)在最小的rootfs中,这个/dev目录是非常重要的,不可少的,因为这里面有一两个设备文件是我们根文件系统必须要有的。
(5)在最小的rootfs中,sys和proc这两个目录也是不可以缺少的,只要在rootfs中创建了这两个空文件夹就行,这两个目录是和驱动有关的,这两个在Linux中叫虚拟文件系统,在操作系统Linux运行的时候这两个文件中会被软件虚拟出来东西,是用来看我们操作系统在运行的时候看到内核的运行状态的,相当于内核的一个窗户,在运行时,在这个文件中看到的是内核的运行状态。usr目录也是应该要有的,是和用户有关的,里面放的应该是用户可以装的东西,用户可以有的东西。但是这个东西不用我们去创建,busbox在安装时会自动生成
(6)etc也是非常重要的目录,这个目录中的文件全是我们运行时的配置文件,这些配置文件会直接或者间接的被/linuxrc调用,完成操作系统的运行时配置
(7)lib这个目录也重要的,放的是当前的操作系统中的静态和动态链接库文件,我们主要要的是动态链接库
总结:一个最小的根文件系统中应该有的目录是dev etc usr(安装busybox自动生成的) sys proc lib linuxrc
1、8、VFS简介
1、什么是VFS
(1)VFS简单来说是Linux内核中的一种设计理念、设计机制,内核的实现方法,VFS是vitrual file system虚拟文件系统
(2)VFS参造了实体文件系统的设计理念,就是对块设备的访问扇区的时候,可以转化成对目录和文件的访问。但是VFS更厉害他将关于对硬件设备的访问,也虚拟化成了对目录和文件的访问。所以有了VFS后,我们可以通过设备文件(如:/dev/mmcblk0p2)的目录和文件名和对系统中硬件设备进行访问
2、VFS的意义
(1)在Linux中一切皆是文件,访问普通文件和访问硬件设备的方式的接口都是一样的,都是相当于对普通文件的访问。
(2)将上层应用层对访问下层不同的文件系统类型进行了隔离,就是在上层可以用同样的方式,访问下层的不同的文件系统类型,VFS将下层的不同文件系统类型统一成一个接口提供给了上层应用层。
(3)我们根文件系统的挂载,proc、sys等虚拟文件系统和/dev/xxx 这些设备文件都是和VFS有关的。
挂载的意思就是说,这个根文件系统的类型被VFS识别到了,VFS认得他,将他对接上了,就叫挂载
本文出自 “whylinux” 博客,请务必保留此出处http://whylinux.blog.51cto.com/10900429/1898764
根文件系统袁丽丽