Linux文件系统概述

类似于Windows的各个盘,Linux系统也可以将磁盘、flash等存储设备划分为若干个分区,在不同分区存放不同类别的文件(文件系统此时指的是分区上文件的集合)。与Windows的C盘类似,Linux一样要在一个分区上存放系统启动所必需的文件,如内核映像文件(在嵌入式中,内核一般单独存放在一个分区中)、内核启动后运行的第一个程序、给用户提供操作界面的shell程序、应用程序所依赖的库等。这些必需、基本的文件合称为根文件系统,它们存放在一个分区中。Linux系统启动后先挂载这个分区,称为挂载根文件系统。其它分区上的所有目录、文件的集合也称为文件系统。分区挂载在某个目录上,这个目录被称为挂载点或者是安装点,然后就可以通过这个目录来访问这个分区上的文件了。根文件系统被挂载在根目录/上,在根目录下就有根文件系统的各个目录、文件。其它分区挂载到/mnt目录上,/mnt目录下就有这个分区的各个目录、文件。

文件系统包含实实在在的存储分区文件系统以及虚拟文件系统(/proc 、/sysfs等)。虚拟文件系统中的文件并不存储在实际的设备上,而是在访问它们时由内核临时生成的。

Linux根文件系统中的目录结构:

/bin 存放所有用户都可以使用的、基本的命令,如cat、ls、sh、kill等
/sbin 存放系统命令,只有管理员能够使用的命令,系统命令还可以存放在/sur/sbin、/usr/local/sbin目录下。/sbin中存放的是基本的系统命令,用于启动系统、修复系统等。如reboot、fdisk、shutdown等。
/dev 存放设备文件,用于访问各种外设。/dev中文件创建有3种方法:手动创建(mknod)、使用devfs文件系统(内核2.6开始已经不使用了)、udev创建(udev是个用户程序、能够根据系统中硬件设备的状态动态更新设备文件、如文件的创建删除,内核需要支持sysfs文件系统)、mdev(这是udev命令的简化版本、在busybox中带有,占用内存小)。
/etc 存放各种配置文件,如inittab(init进程的配置文件)、group(用户的组文件)、fstab(执行mount -a时,需要挂载的文件系统)、mtsb(用来显示已经加载的文件系统)
/lib 存放共享库和可加载模块,共享库用于启动系统、运行根文件系统中的可执行程序。不是根文件系统所必需的库文件可以放在/usr/lib中
/home 可选目录。对于普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件
/root 根用户
/usr 存放共享、只读的程序和数据
/var /存在可变的数据,log文件、临时文件等。
/proc 常用作proc文件系统的挂载点。虚拟文件系统,没有实际的存储设备 。 系统启动后挂载 (mount -t proc none /proc
/mnt 用于临时挂载某个文件系统的挂载点,通常是空目录。
/tmp 存放临时文件,一些需要生成临时文件的程序要用到/tmp目录, /tmp目录必须存在并可以访问。(mount -t tmpfs none /tmp 减少对flash的操作)

 

所谓制作根文件系统,就是创建各种目录,并且在里面创建各种文件。使用busybox能很方便的帮助我们创建/bin、/sbin等目录下的可执行文件。在创建一个最小的根文件系统时,使用busybox的话,只需要在/dev目录下创建必要的设备节点、在/etc目录下创建一些配置文件就可以了(如果busybox使用动态连接,要在/lib目录下包含库文件)。

busybox的官方网站是http://www.busybox.net/,可以在http://www.busybox.net/downloads/下载源码。

init进程是内核启动的第一个用户程序,根据配置文件决定启动哪些程序。init进程是后续所有进程的发起者,比如init进程启动/bin/sh程序后,用户才能在控制台上输入各种命令。init进程的执行程序通常是/sbin/init,客户也可以完全编写自己的/sbin/init程序,或者传入命令行参数“init=XXX”指定某个程序作为init进程运行。

内核挂载根文件系统后,最后会执行init程序。其中间流程有:打开/dev/console设备文件作为标准输入,然后复制文件描述符0给文件描述符1、2。所以标准输入、标准输出、标准出错都对应同一个文件。

busybox init流程:设置信号处理函数———>初始化控制台———>解析inittab———>执行inittab命令。

对于控制台,要是内核启动init进程的同时设置了环境变量console,则使用环境变量所指定的设备,要是检测指定的设备不可以打开,则使用/dev/null。如果没有指定环境变量则使用/dev/console设备作为控制台。由于init进程只是作为其他进程的发起者和控制者,并不需要控制台与用户交互,所以init进程会把它关掉。init进程创建其他子进程时,如果没有在/etc/inittab中指定它的控制台,则使用前面确定的控制台。

inittab文件存在的话(不存在会使用默认的)init进程会解析它,然后按照它的指示创建各种子进程。inittab文件中每个条目用来定义一个子进程,并确定它的启动方法。格式如下:

:::

:表示这个子进程需要使用的控制台,如果省略则使用与init进程一样的控制台。

:对于busybox程序,这个字段没有意义可以省略。

:表示init进程如何控制这个子进程。有sysinit、wait、once、respawn、askfirst、shutdown、restart、ctraltdel。

:要执行的程序,它可以是可执行程序,也可以是脚本。如果process字段前有“-”字符,这个程序被称为交互的。

总结:在系统启动前期,init进程首先启动为sysinit、wait、once的子进程。系统正常运行期间init进程启动为respawn、askfirst的子进程,并且监视它们,发现子进程退出时重新启动它。系统退出时,执行为shutdown、restart、ctrlatdel的子进程。

 

 

你可能感兴趣的:(Linux根文件系统)