根文件系统概述
1.为什么需要根文件系统
(1)init进程的应用程序在根文件系统上
(2)根文件系统提供了根目录/
(3)内核启动后的应用层配置(/etc)在根文件系统上,可以这么认为:发行版=内核+rootfs
(4)shell命令程序在根文件系统上,例如ls、cd等
总结:一套linux体系,只有内核本身是不能工作的,必须要rootfs(/etc下的配置文件、/bin等目录下的shell命令 、/lib目录下大的库文件等......)相配合才能工作。
2.根文件系统的实质是什么
(1)根文件系统是特殊用途的文件系统
(2)根文件系统也必须属于某种文件系统格式:rootfstype=
(3)根文件系统是用来做什么的?
首先,存储设备(块设备,像硬盘、flash等)是分块的(扇区),底层(物理层)去访问存储设备时是按照块号(扇区号)来访问的,这就很麻烦。其次,文件系统是一些代码,是一套软件,这套软件的功能就是对存储设备的扇区进行管理,将这些扇区的访问变成了对目录和文件名的访问。在上层按照特定的目录和文件名去访问一个文件时,文件系统会将这个目录+文件名转换成对扇区号的访问。最后,不同的文件系统的差异就在于对这些扇区的管理策略和方法不同,例如坏块管理、碎片管理等。
根文件系统的形式
1.镜像文件形式
(1)使用专用工具软件制作的可供烧录的镜像文件
(2)镜像中包含了根文件系统中的所有文件
(3)烧录此镜像类似于对相应分区格式化
(4)镜像文件系统具有一定的格式,格式是内化的,跟文件名后缀是无关的。
2.文件夹形式
(1)根文件系统其实就是一个包含特定内容的文件夹而已。
(2)根文件系统可由任何一个空文件夹添加必要文件构成。
(3)根文件系统的雏形就是在开发主机中构造的文件夹形式的。
3.总结
(1)镜像文件形式的根文件系统主要目的是用来烧录到块设备上,设备上的内核启动后去挂载它。镜像文件形式的根文件系统是由文件夹形式的根文件系统使用专用的镜像制作工具制作而成的。
(2)在开发主机中使用mkdir创建一个空文件夹,然后向其中添加一些必要的文件(包括/etc目录下的运行时配置文件、/bin等目录下的可执行程序、/lib目录下的库文件等......)后就形成了一个文件夹形式的rootfs。然后这个文件夹形式的rootfs可以被kernel通过nfs方式来远程挂载使用,但是不能用来烧录块设备。为了将这个rootfs烧录到块设备中,需要使用一些专用的软件制作工具将其制作成可供烧录的一定格式的根文件系统镜像。
(3)文件夹形式的rootfs是没有格式的,制作成镜像后就有了一定的格式。这个格式是由镜像制作过程和制作工具来决定的。每一种格式的镜像制作工具的用法都不同。
什么是linuxrc
1./linuxrc是一个可执行的应用程序
(1)/linuxrc是应用层的,和内核源码一点关系都没有
(2)/linuxrc在当前的开发板内核系统下是可执行的,因此在ARM SoC的linux系统下,这个应用程序就是用arm-linux-gcc编译链接的;如果是在PC机linux系统下,那么这个程序就是用gcc编译链接的。
(3)/linuxrc如果是静态编译链接的,那么可以直接运行;如果是动态编译链接的,那么还需要提供必要的库文件才能运行。但是因为/linuxrc这个程序是由内核直接调用执行的,因此用户没有机会去导出库文件的路径,所以/linuxrc没办法动态链接,一般都是静态链接的。
2./linuxrc执行时引出用户界面
(1)操作系统启动后在一系列的运行配置后,最终会给用户一个操作界面(允许时cmdline,也许是GUI),这个用户操作界面就是由/linuxrc带出来的。
(2)用户界面等很多事并不是在/linuxrc中负责的,用户界面有自己专门的应用程序,但是用户界面的应用程序是直接或者间接的被/linuxrc调用执行的。用户界面程序和其他应用程序就是进程2、3、4......,这就是在内核的启动过程分析那一节说的进程1(init进程,也就是/linuxrc)是其他所有应用程序进程的祖宗进程。
3./linuxrc负责系统启动后的配置
(1)就好像一个房子建好之后不能直接住,还要装修一样,操作系统启动后不能直接用,需要配置下。
(2)操作系统启动后的应用层配置(一般叫运行时配置,英文简写etc)是为了让我们的操作系统用起来更方便,更适合个人的爱好或者使用性。
4./linuxrc在嵌入式linux中一般就是busybox
(1)busybox是一个C语言写出来的项目,里面包含了很多.c文件和.h文件。这个项目可以被配置编译成各个平台下面可以运行的应用程序。如果用arm-linux-gcc来编译busybox,就会得到一个可以在我们开发板的内核上运行的应用程序。
(2)busybox这个程序开发出来就是为了在嵌入式环境下构建rootfs使用的,也就是说它是专门开发的init进程应用程序。
(3)busybox为当前系统提供了一整套shell命令程序集,例如vi、cd、mkdir、ls等。在桌面版的linux发行版(例如Ubuntu、redhat、CentOS等)中vi、cd、ls等都是一个一个单独的应用程序,但是在嵌入式linux中,为了省事把vi、cd、ls等所有常用的shell命令集合到了一起构成了一个shell命令包,起名叫busybox。
rootfs应该有什么
1./linuxrc
最重要的就是/linuxrc
2.dev目录
在linux中一切皆文件,因此一个硬件设备也被虚拟化成一个设备文件来访问。在linux系统中,/dev/xxx就表示一个硬件设备,要操作这个硬件时,先使用open打开这个设备,然后使用read/write/ioctl操作这个设备,最后使用close关闭这个设备。
在最小的rootfs中,/dev目录也是不可少的。这里面有一两个设备文件是rootfs必须的。
3.sys和proc目录
在最小的rootfs中,也是不可省略的,但是这两个目录只要创建了空文件夹就可以了,里面是没有东西的,也不用有东西。这两个目录和驱动有关,属于linux中的虚拟文件系统。
4.usr
usr是系统的用户所属的一些文件的存放地,这个目录在busybox安装时会自动生成。
5.etc
etc目录是很关键很重要的一个,目录中的所有文件全部都是运行时的配置文件。/etc目录下的所有配置文件会直接或者间接的被/linuxrc所调用执行,完成操作系统的运行时配置。etc目录是制作rootfs的关键,所以在后面会专门讲解etc目录。
6.lib
lib目录也是rootfs中很关键的一个,不能省略。lib目录下放的是当前操作系统中的动态和静态链接库文件。
VFS简介
1.什么是VFS
(1)VFS是linux内核的一种设计理念、设计机制。VFS就是virtual file system,叫虚拟文件系统。
(2)具体的一些文件系统如FAT、NTFS、ext2、ext3、jffs2、yaffs2、ubi等主要设计目的是为了管理块设备(硬盘、iNand......)。
(3)VFS是借鉴了文件系统的设计理念(通过文件系统,将底层难以管理的物理磁盘扇区式访问转换成目录+文件名访问),将硬件设备的访问也虚拟化成了对目录+文件的访问。所以有了VFS后,可以通过设备文件(目录+文件名,例如/dev/mmcblk0p2)的方式来访问系统中的硬件设备。
总结:从以上可以看出VFS的一些厉害之处,但是VFS远不止于此。
2.VFS的意义
(1)把对硬件设备的访问和对普通文件的访问的接口统一化了(linux中一切皆文件)。
(2)将操作系统上层(应用层)对下层不同文件系统类型的访问细节给屏蔽掉了,因此如果没有VFS,那么写cp命令(或其他命令)的时候就不得不去考虑cp的这个文件是在什么样的文件系统类型下。所以cp命令非常复杂,因为要考虑具体的文件系统类型。有了VFS之后,情况就不同了。VFS成了一个隔离层,隔离了下层的不同文件系统之间的差异性,对上层应用提供了一个统一的接口。
(3)VFS将不同文件系统和下层硬件设备(块设备)驱动之间的细节也给屏蔽了。不同类型的文件系统在本身设计时,是不用考虑各种不同的硬件设备的具体操作差异的,这里有一个类似于VFS的设计理念。
3.VFS与学习的关系
(1)VFS机制和rootfs挂载,和其他文件系统的挂载都是有关联的。
(2)内核中有一些sys proc这种虚拟文件系统,也和VFS机制有关。
(3)/dev目录下的设备文件都和VFS有关,所以学习驱动绕不开VFS。