华清远见——嵌入式培训专家系统开发班培训教材“黑色经典”系列之《嵌入式Linux系统开发技术详解——基于ARM》第10章制作Linux根文件系统本章目标本章介绍了Linux根文件系统的组织结构,并且分析了init进程调用文件系统脚本初始化的过程。只有掌握了文件系统的基本构成,才能自己动手定制Linux文件系统。根文件系统组织结构INIT系统初始化过程定制文件系统华清远见——嵌入式培训专家的根文件系统具有非常独特的特点,就其基本组成来说,Linux的根文件系统应该包括支持Linux系统正常运行的基本内容,包含着系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件。因此,至少应包括以下几项内容。1.基本的文件系统结构,包含一些必需的目录比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。2.基本程序运行所需的库函数,如Glibc/uC-libc。3.基本的系统配置文件,比如rc,inittab等脚本文件。4.必要的设备文件支持:/dev/hd*,/dev/tty*,/dev/fd0。5.基本的应用程序,如sh,ls,cp,mv等。以下章节的内容将对制作Linux根文件系统的过程作一些详细地分析,目的是使读者能够较快地理解如何在一个目标系统(Target)建立起操作系统的根文件系统,进而加快开发流程。10.1根文件系统目录结构文件系统是在任何操作系统中都非常重要的概念,简单地讲,文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构,即在磁盘上组织文件的方法。文件系统的存在,使得数据可以被有效而透明地存取访问。进行嵌入式开发,采用Linux作为嵌入式操作系统必须要对Linux文件系统结构有一定的了解。每个操作系统都有一种把数据保存为文件和目录的方法,因此它才能得知添加、修改之类的改变。在DOS操作系统之下,每个磁盘或磁盘分区由独立的根目录,并且用唯一的驱动器标识符来表示,如:C:\,D:\等。不同磁盘或不同的磁盘分区中,目录结构的根目录是各自独立的。而Linux的文件系统组织和DOS操作系统不同,它的文件系统是一个整体,所有的文件系统结合成一个完整的统一体,组织到一个树形目录结构之中,目录是树的枝干,这些目录可能会包含其他目录,或是其他目录的“父目录”,目录树的顶端是一个单独的根目录,用/表示。在Linux下可以看到系统的根目录组成内容,如图10.1所示。《嵌入式Linux系统开发技术详解——基于ARM》——第10章、制作Linux根文件系统华清远见嵌入式Linux系统开发班培训教材图10.1Linux下根目录内容在上图中,弧线内部的部分即为Linux根目录的组成。10.1.1FHS目录结构Linux遵守文件系统科学分类标准(FilesystemHierarchyStandard,FHS),一个定义许多文件和目录的名字和位置的标准,该项标准可以在找到,FHS也是用来组织Linux和Unix文件的方法,它使得Linux文件系统布局实现了标准化,一个Linux的根文件系统目录结构如图10.2所示。根文件系统目录华清远见——嵌入式培训专家系统开发班培训教材根文件系统//dev/root/usr/var/home/prco/bin/sbin/etc/boot/lib/mnt/tmp/initrd图10.2Linux根文件系统结构1./dev设备文件在/dev目录下是一些称为设备文件的特殊文件,用于访问系统资源或设备,如软盘,硬盘,系统内存等。设备文件的概念是DOS和Windows操作系统中所没有的,在Linux下,所有设备都被抽象成了文件,有了这些文件,用户可以像访问普通文件一样方便地访问系统中的物理设备。例如:你可以像从一个文件中读取数据一样,通过读取/dev/mouse文件从鼠标读取输入信息。在/dev目录下,每个文件都可以用mknod命令建立,各种设备所对应的特殊文件以一定规则来命名。以下是/dev目录下的一些主要设备文件。(1)/dev/console系统控制台,也就是直接和系统连接的监视器。(2)/dev/hd在Linux系统中,对于IDE接口的整块硬盘表示为/dev/hd[a-z],对于硬盘的不同分区,表示方法为/dev/hd[a-z]n,其中n表示的是该硬盘的不同分区情况。例如/dev/hda指的是第一个硬盘,hda1则是指/dev/hda的第一个分区。如系统中有其他的硬盘,则依次为/dev/hdb、/dev/hdc等;如有多个分区则依次为hda1、hda2等。(3)dev/fd《嵌入式Linux系统开发技术详解——基于ARM》——第10章、制作Linux根文件系统华清远见嵌入式Linux系统开发班培训教材软驱设备文件。通过前面对系统IDE接口硬盘的表示方法不难理解:/dev/fd0是指系统的第一个软驱,也就是通常所说的A盘,/dev/fd1是指系统的第二个软驱。(4)dev/sdSCSI接口磁盘驱动器。理解方法和IDE接口的硬盘相同,只是把hd换成sd。目前,Linux下驱动USB存储设备的方法采用模拟SCSI设备,所以USB存储设备的表示方法与SCSI接口硬盘的表示方法相同。(5)dev/tty设备虚拟控制台。如:/dev/tty1指的是系统的第一个虚拟控制台,/dev/tty2则是系统的第二个虚拟控制台。(6)dev/ttyS*串口设备文件。dev/ttyS0是串口1,dev/ttyS1是串口2。2./rootroot用户主目录root目录中的内容包括:引导系统的必备文件、文件系统的挂装信息、设备特殊文件、以及系统修复工具和备份工具等。由于是系统管理员的主目录,普通用户没有访问权限。3./usr/usr是最庞大的目录,该目录中包含了一般不需要修改的命令程序文件、程序库、手册和其他文档等。Linux内核的源代码就放在/usr/src/linux里。4./var该目录中包含经常变化的文件,例如打印机、邮件、新闻等的脱机目录、日志文件以及临时文件等。因为该文件系统的内容经常变化,因此如果和其他文件系统,如/usr放在同一硬盘分区,文件系统的频繁变化将会提高整个文件系统的碎片化程度。5./home用户主目录的默认位置。例如,一个名为LY的用户主目录将是/home/LY,系统的所有用户的数据保存在其主目录下。6./proc需要注意的是,/prco文件系统并不保存在系统的硬盘中,操作系统在内存中创建这一文件系统目录,是虚拟的目录,即系统内存的映射,其中包含一些和系统相关的信息,例如CPU的信息等。7./bin该目录包含二进制(binary)文件的可执行程序,这里的bin本身就是binary的缩写,许多Linux命令就是放在该目录下的可执行程序,例如ls、mkdir、tar等命令。华清远见——嵌入式培训专家./sbin与bin目录类似,存放系统编译后的可执行文件、命令,如常用到的fsck、lsusb等指令,通常只有root用户才有运行的权限。9./etc/etc目录在Linux文件系统中是一个很重要的目录,Linux的很多系统配置文件就在该目录下,例如系统初始化文件/etc/rc等。Linux正是靠这些文件才得以正常地运行,用户可以根据实际需要来配置相应的配置文件,以下列举一些配置文件。(1)/etc/rc或/etc/rc.d启动或改变运行级别时运行的脚本或脚本的目录。大多数的Linux发行版本中,启动脚本位于/etc/rc.d/init.d中,系统最先运行的服务是那些放在/etc/rc.d目录下的文件,而运行级别在文件/etc/inittab里指定,这些会在后面的内容中详细讲到。(2)/etc/passwd/etc/passwd是存放用户的基本信息的口令文件。该口令文件的每一行都包含由6个冒号分隔的7个域,其中的域给出了用户名、真实姓名、用户起始目录、加密口令和用户的其他信息。•username:用户名。•passwd:是口令密文域。密文是加密过的口令。如果口令经过shadow则口令密文域只显示一个x,通常,口令都应该经过shadow以确保安全。如果口令密文域显示为*,则表明该用户名有效但不能登录。如果口令密文域为空则表明该用户登录不需要口令。•uid:系统用于唯一标识用户名的数字。•gid:表示用户所在默认组号。•comments:用户的个人信息。•directory:定义用户的初始工作目录。•Shell:指定用户登录到系统后启动的外壳程序。(3)etc/fstab指定启动时需要自动安装的文件系统列表。通常来讲,如果用户在使用过程中需要手动加载许多文件系统,这会带来不小的工作量。为了避免这样的麻烦,让系统在启动的时候自动加载这些文件系统,Linux中使用/etc/fstab文件来完成这一功能。fstab文件中列出了引导时需安装的文件系统的类型、加载点及可选参数。所以进行相应的配置即可确定系统引导时加载的文件系统。(4)etc/inittabinit的配置文件,在后面的内容会详细讲到。10./boot该目录存放系统启动时所需的各种文件,如内核的镜像文件,引导加载器(bootstraploader)使用的文件LILO和GRUB。《嵌入式Linux系统开发技术详解——基于ARM》——第10章、制作Linux根文件系统华清远见嵌入式Linux系统开发班培训教材11./lib标准程序设计库,又叫动态链接共享库,作用类似于Windows里的.dll文件。12./mnt该目录用来为其他文件系统提供安装点,例如可以在该目下新建一目录floppy用来挂载软盘,同样可以新建一目录cdrom(可以用任意名称)用来挂载光盘等。比如在Linux下的终端执行下面的语句:#mount–tvfatdev/hda1/mnt/win_D即可将硬盘的第一个分区挂载到Linux下的/mnt/win_D目录中。13./tmp公用的临时文件存储点14./initrd用来在计算机启动时挂载initrd.img映像文件以及载入所需设备模块的目录,需要注意的是,不要随便删除/initrd/目录,如果删除了该目录,将无法重新引导系统。10.1.2文件存放规则为了实现各种Linux版本系统的标准化,各种不同的Linux版本都会根据FHS(FilesystemHierarchyStandard)标准来进行系统管理,这也使得Linux系统的兼容性大大提高。FHS规定了两级目录,第一级是根目录下的主要目录,根据目录名称可以得知其中应该放置什么样的文件,比如/etc应该放置各种配置文件,/bin和/sbin目录下应该放置相应的可执行文件等;第二级目录则主要针对/usr和/var做出了更深层目录的定义。Unix/Linux系统很长时间以来一直是在“什么文件放在哪里”的基础之上建立文件存放规则的,并且按照这些规则把文件放进相应分级结构里。文件系统分级结构标准(FHS)试图以一种合乎逻辑的方式定义这些规则,而且在Linux上得到了广泛应用。按照FHS标准,在Linux下存放文件主要有以下的一些规则。1.把全局配置文件放入/etc目录下。2.将设备文件信息放入/dev目录下,设备名可以作为符号链接定位在/dev中或/dev子目录中的其他设备存在。3.操作系统核心定位在/或/boot,若操作系统核心不是作为文件系统的一个文件存在,不应用它。4.库存放的目录是/lib。5.存放系统编译后的可执行文件、命令的目录是/bin,/sbin,/usr。华清远见——嵌入式培训专家