1、linux实践考察linux下根文件系统的制作,一、课题名称: linux下根文件系统生成,三、根文件系统1.根文件系统的结构,根文件系统是Linux内核启动后第一个挂载的文件系统。在根文件系统中存放着内核镜像、各种系统配置文件以及一些其他的重要文件(例如设备文件、命令程序等)。为了保证通用性,根文件系统的目录结构需要遵守FHS(文件系统层次标准)标准(Filesystem Hierarchy Standard)。FHS标准定义了根文件系统中每个目录名称及其作用的规则规范。如下图所示的是一个符合FHS标准的根文件系统:,下表是一个根文件系统中所需的主要目录。,2.创建根文件系统:具体的步骤如下
2、所示。,step 1 创建目录。step 2 创建必要的设备文件。step 3 安装所需的共享库。step 4 安装init文件、Shell和各种基本命令(可由busybox提供)。step 5 创建和编辑配置文件。,2.1 创建目录,首先创建一个新的目录rootfs,作为整个根文件系统的根目录,如:,这里创建了一个rootfs目录。当根文件系统制作完成后,可以将这个目录作为nfs服务的共享目录。,接着根据FHS标准依次创建各个子目录,如下所示:,这些目录多数需要手动创建,其中有一些目录可在安装busybox时自动创建。一般来说,根文件系统内的主要目录和文件都会以root身份创建,因为将来挂载
3、到目标机之后,文件的所有者和权限都保持不变,而这些文件在目录机上都是系统文件,应该是root所有的。,2.2 创建根文件系统中的设备文件、命令文件,在创建根文件系统中的设备文件、命令文件时,最简单的办法就是直接复制桌面Linux系统中的文件。 (1)bin。bin目录下存放的是命令程序文件。在桌面Linux系统中包含了文件管理、系统管理和设置、磁盘管理等数百个命令文件。 具体操作如下所示:,上述命令的意思是指,将Linux系统中bin目录中的ls和date命令文件复制到rootfs/bin目录下。,(2)dev。dev目录下存放的是各种设备文件。 1)控制台设备。控制台终端用于显示各种信息,显
4、示器是一种最常见的控制台终端。在linux系统中,控制台的设备文件是console。控制台在其他设备驱动初始化前就可以使用,因此常用来显示内核的启动信息。 2)虚拟控制终端。为了满足多用户多任务的需要,可以通过虚拟控制终端来使用控制台终端。例如tty1、tty2、tty3文件等。 3)串口终端。串口终端是使用串行端口连接的终端设备。在Linux系统中常用的串口终端设备文件有ttyS0、ttyS1等。在Linux2.6内核中ttyS0文件称为ttySAC0。,串口终端可以被指定为控制台终端来使用。例如在内核启动参数中可以设置console=ttySAC0,也就是把串口终端设备ttySAC0作为控
5、制台设备使用。,和创建bin目录下命令文件的方法相同,只需要把桌面Linux系统中dev目录下的设备文件复制到rootfs/dev目录下就可以了。如下所示:,这里-a参数用来保留文件的所有属性,否则cp命令将试图从设备文件中读取内容并写入新文件。 在嵌入式系统中,出于某种需要可能不希望动态创建设备文件,这时,所需的设备文件就要用mknod命令预先在根文件系统内创建,或者将创建设备文件的命令写入系统的初始化脚本中。,有关mknod命令的介绍:,mknod :创建特殊文件 语 法 mknod必要参数选择参数主设 备号次设备号功 能 建立一个目录项和一个特殊文件的 对应索引节点 建立的文件有三种 b
6、:块设备 c:字符设备 p:管道文件 执行权限:超级用户 命令属性:系统设置,参数,必要参数 设备文件名选择参数 -m 为新建立的文件设定默认权限-help 显示帮助信息-version 显示版本信息,(3)lib。lib目录下存放的是函数库文件。在嵌入式 linux系统中可以根据实际的需要选择各种库文件。对于使用动态编译方式编译的C应用程序来说,以下两个库文件是必须的。,libc: 该库是C应用程序必须使用的基本C函数库。ld-linux: 该库是动态链接器,提供动态链接函数库的功能。 直接从交叉编译器的lib目录下把以上库文件复制到文件系统的lib目录下,如下所示:,一般来说,一个共享库会
7、对应着一个包含真正内容的文件,同时有若干个符号链接指向它,这样做是为了便于管理。在复制共享库的时候尽量保持这一模式,将应用程序所需的符号链接与包含真正内容的共享库文件一起复制过去。,(4) etc。etc目录下存放的是Linux系统的配置文件,etc目录中的配置文件主要任务是负责文件系统的初始化工作。,1). 在etc/init.d下创建rcS文件具体操作如下所示:,2)下面是一个初始化脚本的例子。,2.3 使用busybox,1.BusyBox介绍 busybox是嵌入式系统中常用的一个软件包,它把许多常用的Linux命令都集成到一个单一的可执行程序中,几乎只需要这一个可执行程序加上Linu
8、x内核就可以构建一个基本的Linux系统。busybox忽略了许多不常用的功能,因此非常小巧,并且是完全模块化的,可以很容易地在编译时增加或删除其中包含的命令。,2.BusyBox工作原理,BusyBox最初是为Debian GNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可以引导的Linux系统,用来制作安装盘。 一张软盘的容量大约为1.4MB,所以并没有多少空间留给Linux内核以及文件系统。为此BusyBox提出了合并命令程序文件的思想。通过这个方法可以把3.5MB大小的命令程序包(也就是bin目录)压缩到只有200KB大小。为此,BusyBox获得了“瑞士军刀”的美誉。,下
9、面通过一个实例来看看BusyBox合并程序文件的基本方法。例如:test.c,其中main函数的参数argc用于接收从控制台传递过来的参数个数,参数argv数组用于接收从控制台传递过来的具体参数。,编译test.c产生test文件,并为test文件分别创建两个链接文件t1和t2。如下所示:,可以看到,通过main函数的argc和argv参数可以接收从控制台传递过来的命令信息。,根据这个原理,BusyBox把bin目录下常用命令程序的代码集成到一个busybox文件中。使得busybox文件中不会重复相同功能的代码。然后BusyBox为busybox文件创建了多个链接文件,每个链接文件表示一个命
10、令程序(链接文件的名称就是各个命令程序的名称)。BusyBox通过链接文件把具体命令传递给busybox,由busybox完成各个命令的运行任务。如下图所示:,此外,BusyBox还直接提供了etc目录下的主要配置文件,大大减轻了制作根文件系统的工作,3.编译和安装BusyBox,首先对BusyBox压缩包解压缩后进入BusyBox的根目录,然后进行功能配置。运行命令“make menuconfig”启动BusyBox的配置工具,如下图所示。,可以看到,配置界面中把配置选项分成了BusyBox Settings和Applets两大部分。,1)BusyBox Settings (BusyBox设
11、置) General Configuration。该选项是BusyBox的常规配置选项,一般不需要改动里面的默认设置。 Build Options。该选项用于设置BusyBox的编译方式。 Build BusyBox as a static binary。该选项用于选择是否使用静态编译方式。如果选择采用静态编译,则生成的busybox命令文件在运行时就不需要额外的函数库支持。为了简单起见,这里建议选择使用静态编译方式。,Build shared libbusybox。该选项用于选择是否编译BusyBox动态库。Build with Large File Support (for accessi
12、ng files 2 GB)。该选项用于选择BusyBox是否支持容量大于2GB的文件系统。Cross Compiler prefix。该选项用于设置交叉编译器的前缀。,Debugging Options。该选项用于设置BusyBox的调试方式。Installation Options。该选项用于设置BusyBox制作的根文件系统的安装路径。BusyBox Library Tuning。该选项用于设置BusyBox库的一些调整配置。,编译BusyBox,输入命令“make”对BusyBox的源代码进行编译。编译完成后会在BusyBox的根目录下生成一个可执行文件busybox,如下所示:,测试
13、BusyBox能否正常运行:,把ls作为busybox的参数,让busybox执行ls的功能。从结果看出,busybox执行了ls的功能列出了当前目录下的文件。,接着运行命令“make install”进行安装。安装完毕后会在BusyBox的根目录下生成一个_install目录。在_install目录下有bin、sbin和usr目录以及一个linuxrc链接文件。bin和sbin目录中全是指向BusyBox命令文件的链接文件。如下所示。其中,symbolic link是符号链接的意思。,linuxrc也是一个指向busybox命令文件的链接文件,如下所示:,linuxrc是BusyBox提供的
14、init程序,和/sbin/init程序的作用是相同的。如果要使用linuxrc程序,只需要在内核的启动命令参数中通过“init=linuxrc”进行设定。,一般情况下,BusyBox提供的配置文件能够满足大多数应用环境的需要。所以可以直接把_install目录以及/examples/bootfloppy/etc目录下所有的文件(包括各个子目录)复制到rootfs目录下,并覆盖原有的文件。 至此,根文件系统的基本架构就搭建好了,用户只需要根据实际需要再添加各种文件就可以了。,五、心得与体会,linux操作系统是一款文本式驱动的操作系统,这是它的优点所在,即使在Windows处理复杂任务的时候,图形界面也只是一个界面。图形界面和命令行的区别就像极品飞车游戏的自动驾驶与自己使用技巧玩一样,不过还是建议你自己慢慢打任务。因为这样更有意思,而且你慢慢地发现你自己的技术提高了很多,包括漂移。,谢谢观看,