• 1. linux实践考察 ——linux下根文件系统的制作
  • 2. 一、课题名称: linux下根文件系统的制作 二、课题要求: 以文档形式给出具体的操作步骤
  • 3. 三、根文件系统 1.根文件系统的结构 根文件系统是Linux内核启动后第一个挂载的文件系统。在根文件系统中存放着内核镜像、各种系统配置文件以及一些其他的重要文件(例如设备文件、命令程序等)。为了保证通用性,根文件系统的目录结构需要遵守FHS(文件系统层次标准)标准(Filesystem Hierarchy Standard)。FHS标准定义了根文件系统中每个目录名称及其作用的规则规范。如下图所示的是一个符合FHS标准的根文件系统:
  • 4. (本页无文本内容)
  • 5. 下表是一个根文件系统中所需的主要目录。
  • 6. 制作根文件系统的基本方法就是创建各个目录以及目录中的文件。创建目录是非常简单的,既可以通过命令mkdir来创建,也可以在图形界面直接创建。但命令方式比图形方式的效率要高。2.创建根文件系统: 具体的步骤如下所示。
  • 7. step 1 创建目录。 step 2 创建必要的设备文件。 step 3 安装所需的共享库。 step 4 安装init文件、Shell和各种基本命令(可由busybox提供)。 step 5 创建和编辑配置文件。
  • 8. 2.1 创建目录 首先创建一个新的目录rootfs,作为整个根文件系统的根目录,如:
  • 9. 这里创建了一个rootfs目录。当根文件系统制作完成后,可以将这个目录作为nfs服务的共享目录,这样目标机就能够通过网络挂载这个目录。 下面制作根文件系统的操作均对这个目录进行,所提到的绝对路径均以这个目录作为根目录,而不是主机自己的文件系统根目录。
  • 10. 接着根据FHS标准依次创建各个子目录,如下所示:
  • 11. 这些目录多数需要手动创建,其中有一些目录可在安装busybox时自动创建。一般来说,根文件系统内的主要目录和文件都会以root身份创建,因为将来挂载到目标机之后,文件的所有者和权限都保持不变,而这些文件在目录机上都是系统文件,应该是root所有的。
  • 12. 2.2 创建根文件系统中的设备文件、命令文件 在创建根文件系统中的设备文件、命令文件时,最简单的办法就是直接复制桌面Linux系统中的文件。 (1)bin。bin目录下存放的是命令程序文件。在桌面Linux系统中包含了文件管理、系统管理和设置、磁盘管理等数百个命令文件。 具体操作如下所示:
  • 13. 上述命令的意思是指,将Linux系统中bin目录中的ls和date命令文件复制到rootfs/bin目录下。
  • 14. (2)dev。dev目录下存放的是各种设备文件。 1)控制台设备。控制台终端用于显示各种信息,显示器是一种最常见的控制台终端。在linux系统中,控制台的设备文件是console。控制台在其他设备驱动初始化前就可以使用,因此常用来显示内核的启动信息。 2)虚拟控制终端。为了满足多用户多任务的需要,可以通过虚拟控制终端来使用控制台终端。例如tty1、tty2、tty3文件等。 3)串口终端。串口终端是使用串行端口连接的终端设备。在Linux系统中常用的串口终端设备文件有ttyS0、ttyS1等。在Linux2.6内核中ttyS0文件称为ttySAC0。
  • 15. 串口终端可以被指定为控制台终端来使用。例如在内核启动参数中可以设置console=ttySAC0,也就是把串口终端设备ttySAC0作为控制台设备使用。 和创建bin目录下命令文件的方法相同,只需要把桌面Linux系统中dev目录下的设备文件复制到rootfs/dev目录下就可以了。如下所示:
  • 16. 这里-a参数用来保留文件的所有属性,否则cp命令将试图从设备文件中读取内容并写入新文件。 在嵌入式系统中,出于某种需要可能不希望动态创建设备文件,这时,所需的设备文件就要用mknod命令预先在根文件系统内创建,或者将创建设备文件的命令写入系统的初始化脚本中。
  • 17. 有关mknod命令的介绍:mknod :创建特殊文件 语 法 mknod[必要参数][选择参数][主设 备号][次设备号] 功 能 建立一个目录项和一个特殊文件的 对应索引节点 建立的文件有三种 b:块设备 c:字符设备 p:管道文件 执行权限:超级用户 命令属性:系统设置
  • 18. 参数必要参数 设备文件名 选择参数 -m 为新建立的文件设定默认权限 --help 显示帮助信息 --version 显示版本信息
  • 19. (3)lib。lib目录下存放的是函数库文件。在嵌入式 linux系统中可以根据实际的需要选择各种库文件。对于使用动态编译方式编译的C应用程序来说,以下两个库文件是必须的。libc: 该库是C应用程序必须使用的基本C函数库。 ld-linux: 该库是动态链接器,提供动态链接函数库的功能。 直接从交叉编译器的lib目录下把以上库文件复制到文件系统的lib目录下,如下所示:
  • 20. 一般来说,一个共享库会对应着一个包含真正内容的文件,同时有若干个符号链接指向它,这样做是为了便于管理。在复制共享库的时候尽量保持这一模式,将应用程序所需的符号链接与包含真正内容的共享库文件一起复制过去。
  • 21. 除以上基本库之外,还有以下一些其他的常用共享库:libd1.so.2 libpthread.so.0 libutil.so.1
  • 22. 如果要使用域名解析相关的函数,则需要以下共享库:libresolv.so.2 libnss_dns.so.2
  • 23. 如果要运行C++源码编译得到的应用程序,则还需要以下共享库:libstdc++.so.5 libgcc_s.so.1
  • 24. (4) etc。etc目录下存放的是Linux系统的配置文件,etc目录中的配置文件主要任务是负责文件系统的初始化工作。1). 在etc/init.d下创建rcS文件 具体操作如下所示:
  • 25. 2)下面是一个初始化脚本的例子。
  • 26. 保存,退出注意此文件为脚本文件,供shell执行,需用chmod开放它的执行权限。 需要提醒的是,这里设置了PATH环境变量,只是为了后续命令使用方便。
  • 27. 2.3 使用busybox1.BusyBox介绍 busybox是嵌入式系统中常用的一个软件包,它把许多常用的Linux命令都集成到一个单一的可执行程序中,几乎只需要这一个可执行程序加上Linux内核就可以构建一个基本的Linux系统。busybox忽略了许多不常用的功能,因此非常小巧,并且是完全模块化的,可以很容易地在编译时增加或删除其中包含的命令。
  • 28. 2.BusyBox工作原理 BusyBox最初是为Debian GNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可以引导的Linux系统,用来制作安装盘。 一张软盘的容量大约为1.4MB,所以并没有多少空间留给Linux内核以及文件系统。为此BusyBox提出了合并命令程序文件的思想。通过这个方法可以把3.5MB大小的命令程序包(也就是bin目录)压缩到只有200KB大小。为此,BusyBox获得了“瑞士军刀”的美誉。
  • 29. 下面通过一个实例来看看BusyBox合并程序文件的基本方法。 例如:test.c
  • 30. 其中main函数的参数argc用于接收从控制台传递过来的参数个数,参数argv数组用于接收从控制台传递过来的具体参数。 编译test.c产生test文件,并为test文件分别创建两个链接文件t1和t2。如下所示:
  • 31. 可以看到,通过main函数的argc和argv参数可以接收从控制台传递过来的命令信息。
  • 32. 根据这个原理,BusyBox把bin目录下常用命令程序的代码集成到一个busybox文件中。使得busybox文件中不会重复相同功能的代码。然后BusyBox为busybox文件创建了多个链接文件,每个链接文件表示一个命令程序(链接文件的名称就是各个命令程序的名称)。BusyBox通过链接文件把具体命令传递给busybox,由busybox完成各个命令的运行任务。 如下图所示:
  • 33. 此外,BusyBox还直接提供了etc目录下的主要配置文件,大大减轻了制作根文件系统的工作
  • 34. 3.编译和安装BusyBox 首先对BusyBox压缩包解压缩后进入BusyBox的根目录,然后进行功能配置。运行命令“make menuconfig”启动BusyBox的配置工具,如下图所示。
  • 35. (本页无文本内容)
  • 36. 可以看到,配置界面中把配置选项分成了BusyBox Settings和Applets两大部分。 1)BusyBox Settings (BusyBox设置) General Configuration。该选项是BusyBox的常规配置选项,一般不需要改动里面的默认设置。 Build Options。该选项用于设置BusyBox的编译方式。 Build BusyBox as a static binary。该选项用于选择是否使用静态编译方式。如果选择采用静态编译,则生成的busybox命令文件在运行时就不需要额外的函数库支持。为了简单起见,这里建议选择使用静态编译方式。
  • 37. Build shared libbusybox。该选项用于选择是否编译BusyBox动态库。 Build with Large File Support (for accessing files > 2 GB)。该选项用于选择BusyBox是否支持容量大于2GB的文件系统。 Cross Compiler prefix。该选项用于设置交叉编译器的前缀。
  • 38. Debugging Options。该选项用于设置BusyBox的调试方式。 Installation Options。该选项用于设置BusyBox制作的根文件系统的安装路径。 BusyBox Library Tuning。该选项用于设置BusyBox库的一些调整配置。
  • 39. 2) Applets (应用程序) 这部分配置选项用于选择需要BusyBox支持的命令程序。所有的命令都根据功能进行分类。如下图所示的是进入“Coreutils”菜单后的界面。配置界面的操作方式和Linux内核的配置方式是基本一样的。
  • 40. (本页无文本内容)
  • 41. 编译BusyBox 输入命令“make”对BusyBox的源代码进行编译。编译完成后会在BusyBox的根目录下生成一个可执行文件busybox,如下所示:
  • 42. 测试BusyBox能否正常运行: 把ls作为busybox的参数,让busybox执行ls的功能。从结果看出,busybox执行了ls的功能列出了当前目录下的文件。
  • 43. 接着运行命令“make install”进行安装。安装完毕后会在BusyBox的根目录下生成一个_install目录。在_install目录下有bin、sbin和usr目录以及一个linuxrc链接文件。bin和sbin目录中全是指向BusyBox命令文件的链接文件。如下所示。其中,symbolic link是符号链接的意思。
  • 44. linuxrc也是一个指向busybox命令文件的链接文件,如下所示: linuxrc是BusyBox提供的init程序,和/sbin/init程序的作用是相同的。如果要使用linuxrc程序,只需要在内核的启动命令参数中通过“init=linuxrc”进行设定。
  • 45. 一般情况下,BusyBox提供的配置文件能够满足大多数应用环境的需要。所以可以直接把_install目录以及/examples/bootfloppy/etc目录下所有的文件(包括各个子目录)复制到rootfs目录下,并覆盖原有的文件。 至此,根文件系统的基本架构就搭建好了,用户只需要根据实际需要再添加各种文件就可以了。
  • 46. 四、小节 通过本次课题实践完成了linux下根文件系统的制作,但是,在如何挂载已制作好的根文件系统,仍然有很大的问题。通过查找资料,我发现可以使用网络文件系统让目标机把主机上共享的目录作为根文件系统,这是一种很方便的调试手段。但是能否用于PC机,仍然有待于进一步的解决。
  • 47. 五、心得与体会 linux操作系统是一款文本式驱动的操作系统,这是它的优点所在,即使在Windows处理复杂任务的时候,图形界面也只是一个界面。图形界面和命令行的区别就像极品飞车游戏的自动驾驶与自己使用技巧玩一样,不过还是建议你自己慢慢打任务。因为这样更有意思,而且你慢慢地发现你自己的技术提高了很多,包括漂移。
  • 48. 图形界面消耗的是物理内存的空间,你需要在屏幕上处理复杂的问题的时候,图形界面要密密麻麻地列出一堆列表,而它的作用不过是基于某个命令的图形外壳。图形界面的优点就在于对于简单、固定逻辑流程的东西它处理起来简单、直观、高效。所以非常适合作为应用软件的交互界面,但是这也是图形界面的缺点,即对于复杂变化逻辑的东西,它的处理能力低下。
  • 49. 六、参考文献[1] 何永琪主编 嵌入式Linux系统实用开发 北京:电子工业出版社 2010.3 [2] 弓雷 等编著 ARM嵌入式Linux系统开发 详解 北京:清华大学出版社 2010.1 [3] 陈博 孙宏彬 於岳 编著 Linux实用教程 北京:人民邮电出版社 2008.10 [4] 曹江华 方建国 编著 Linux核心应用命令速查 北京:电子工业出版社 2010.8 [5] 吴士力 刘 奇 朱 兰 编著 嵌入式Linux应用开发全程解析与实战 北京:机械工业出版社 2009.11
  • 50. 谢谢观看