linux移植文件系统.docx

上传人:太** 文档编号:94308632 上传时间:2023-07-30 格式:DOCX 页数:6 大小:28.17KB
返回 下载 相关 举报
linux移植文件系统.docx_第1页
第1页 / 共6页
linux移植文件系统.docx_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《linux移植文件系统.docx》由会员分享,可在线阅读,更多相关《linux移植文件系统.docx(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、如果Linux是你每天必用的工作平台,应该已经熟悉以上提到的目录了。不过,现在 让我们来进一步检查嵌入式Linux系统如何使用这些典型的根文件系统内容。首先,为多用户提供可扩展的所有目录(如/home、/mnt、/opt、/root)都应该省略。 调整根文件系统的时候,我们甚至可以进一步移除/mnt/和/var ,不过这么做可能会危 害到某些软件的运行。因此不建议采用这种过于简化的做法。根据引导加载程序和它的配置情况,可能不需要/boot目录。这取决于引导加载程序是否 会在内核被启动之前从根文件系统取回内核映像。在此我们可以不要,日后如果觉得有此需 要,还可以重新设计根文件系统。其余的目录,/

2、bin、/dev、/etc、/lib、/proc、/sbin和/ usr ,都是不可或缺的。极端情况下我们还可以省略/proc ,因为它只能用来安装与其同名的虚拟文件系统。然而 这么做之后,如果需要实地分析目标板,将会很难了解目标板发生了什么事。如果为了缩减 存储空间,可能会将内核设定成不支持/proc,但是还是建议尽可能启用此功能。/usr和/var这两个顶层目录与根目录非常像,有自己的目录结构。在接下来的步骤中, 当我们在摆放这两个目录的时候,将会简述它们的目录结构。令人困惑的相似性根文件系统最令人困惑的一点就是有些目录看起来具有类似的用途。尤其是,新手常会问、 不同目录包含的二进制文件,

3、以及不同目录包含的链接库,有何差异。在根文件系统上,存放二进制文件的目录主要有四个:/bin、/sbin、/usr/bin和/usr/sbin。 二进制文件要放在其中哪个目录,这与它在系统中所扮演的角色有很大的关系。如果这是用 户和系统管理员必备的二进制文件,就会放在/bin o如果这是系统管理员必备、但是一般 用户根本不会用到的二进制文件,就会放在/sbin o相对而言,如果不是用户必备的二进 制文件,多半会放在/usr/bin ;如果不是系统管理员必备的工具,多半会放在/usr/bin。 至于链接库的摆放位置,也是同样的道理。系统引导以及执行最基本命令需要的链接库摆在 /lib o所有其他

4、的链接库则会摆在/usr/lib。通常,套件安装时,会在/usr/lib中产生子 目录,以便摆放它自己的链接库。以Perl 5.x为例,它会产生/usr/lib/perl5目录,里面 摆放的都是与Perl有关的链接库和模块。回过头来看看自己使用的Linux工作站,可以从它的根文件系统看到,发行套件设计者应 用这些标准的实际范例。为了建立根文件系统,我们可以建立以下目录:rootBinnary # mkdir rootfsrootBinnary #cd rootfs现在我们可以针对系统的需要建立根文件系统的顶层目录:rootBinnary rootfs #mkdir bin dev etc li

5、b proc sbin tmp usr var rootBinnary rootfs #chmod 1777 tmp请注意:我们并未建立/boot。如果日后需要再建立也不迟。同时请注意,我们变更了 /tmp目录的使用权,让它开启sticky位,为/tmp目录的使用权开启此位,可确保 /tmp目录底下建立的文件,只有建立它的用户有权删除。嵌入式系统多半是单用户系统, 不过有些嵌入式应用一定不能用root的特权来执行,因此需要遵照根文件系统权限位的一 些基本规定。如OpenSSH套件便属于此类应用。接着我们可以建立/usr的目录结构:rootBinnary rootfs # mkdir usr/b

6、in usr/lib usr/sbin在一个全功能的根文件系统上,/usr目录通常会包含更多条目。你只要在自己的工作站上 键入Is -al /usr这个命令就能够展示这样的简单范例。你将会发现如man、src和 local等这样的目录。FHS中有一节专门探讨此目录的布局。然而,以大多数嵌入式Linux 系统的用途来说,上面所建立的这三个目录已经够用了。最后我们可以建立/var的目录结构:rootBinnary rootfs # mkdir var/lib var/lock var/log var/run var/tmp rootBinnary rootfs #chmod 1777 var/tm

7、p同样地,此目录通常会包含更多的条目。尽管cache、mail和spool等目录对工作站 或服务器来说很有用,但是嵌入式系统多半不需要这些目录。我们建立的目录必须符合能 够让嵌入式Linux系统上可以找到的大多数应用程序正常运行这个最起码的要求。当然, 如果需要Web服务或打印功能,那么你或许会想要加入额外的目录,以符合应用程序提 供功能的需要。FHS和应用程序提供的文档可以找到实际需求。装备好根文件系统的骨架之后,让我们将各软件组安装到正确的位置上去。以不同的根文件系统结构来执行Linux正如前所说,可以在FHS中找到建立根文件系统的规则。尽管大多数的Linux应用和发 行套件都会遵照这些规

8、则,但是Linux内核本身并未强制实施这些规则。事实上,内核源 码与根文件系统结构的几乎没有什么关联。它让你可以使用截然不同的根文件系统结构来建 立嵌入式Linux系统。然后你必须修改大多数软件套件的默认值,以便与新的结构相符。 有些人甚至采取更极端的做法,建立完全没有根文件系统的嵌入式Linux系统。我会建立 你别这么做。以上描述的根文件系统的规则,是开放源码和自由软件所有开发者一致奉告的 原则。如果使用其他规则来建立嵌入式Linux系统,无疑将自己排斥在大多数的开放源码 和自由软件套件有以及它们的开发者之外。设备文件依照Unix的传统,在Linux系统中任何对象都可以视为文件。在Linux

9、根文件系统中, 所有的设备文件(也称为设备节点)都放在/dev目录里。对各种可能的系统变体来说,大 多数的工作站和服务器发行套件为/dev目录附带了内容,这个数目超过了 2000套。因 为嵌入式Linux系统是个定制的的系统,所以目标板的/dev目录里并不需要像Linux 工作站和服务器那样填入那么多条目。事实上,只需建立让系统正常操作的必要条目即可。 如果手上没有可供参考的信息,很判断自己需要哪些条目。倘若选择用devfs(设备文件系 统)来取代固定的静态设备文件,则可免去寻找设备信息的麻烦。然而,devfs并没有得到 广泛采用,静态的设备仍是标准。先前我们也说过静态设备主要和次要编号的信息

10、。下表列出了 /dev目录中需要填入的最基本条目。根据设备情况,或许应该加入若干额外 的条目。在某些情况下,可能甚至需要使用下表以外的条目。如在某些系统上第一个串行端 口并非ttySO,StongARM-base系统的第一个串行端口则是ttySACO(主要编号:204, 次要编号:5)o表:基本的/dev条目文件名说明类型主编号次编号权限位mem物理内存字符11660 null 黑洞 字符 1 3 666 zero 以null byte(零值字节)为数据来源 字符15666random真随机产生器字符18644ttyO现行的虚拟控制台字符40600ttyl第一个虚拟控制台字符41600ttyS

11、O第一个UART串行端口字符464600tty现行的TTY设备字符50666console系统控制台字符51600rootBinnary rootfs #mknod -m 600 console c 5 1rootBinnary rootfs #mknod -m 666 null c 1 3主要的系统应用程序除了内核的功能以及根文件系统的结构,Linux还继承了 Unix极其丰富的命令集。问题 在于标准的工作站或服务器发行套件者配备有数以千计的二进制命令文件,而且不同发行套 件还各不相同。显然,开发者没有能力逐一交叉编译这么多二进制文件,而且大多数嵌入式 系统也不需要这么多二进制文件。因此有两

12、种做法:不是只挑选若干标准命令,就是尽可能将命令集浓缩成仅仅实现必要功能 的极少数应用程序。接下来,我们会看第一种做法。然后我们再探讨第二种做法,这里面包 括BusyBox、TinyLogin和Embutils这三个作为此用途的主要套件。完整的标准应用程序如果想有选择地利用主流发行套件中可以找到的若干标准应用程序,最好的对策就是以Linux From Scratch 计划位于的网站为起点。此计划提供有各种套件的说明和链接,其目的在于协助你定制自己的发行套 件。该网站提供的Linux From Scratch便是此计划的主要文档,它逐一列出了每个应 用程序的建立提示以及相关链接,并且为每个套件提

13、供了建立时间和磁盘空间的估算值。 或者,可以从网络逐一下载应用程序并且依照每个套件的指示进行编译和交叉编译。因为只 有少数套件提供有交叉编译的完整说明,所以你可能需要检查套件的Makefile ,并据此 决定适当的建立标志或套件进行适当的修改,让交叉编译顺利完成。BusyBoxBruce Pcrens于1996年发起的BusyBox计划,目的在于协助Debian发行套件建 立安装磁盘。从1999年开始,此计划由uClibc的维护者Erik Andersen接手维护, 它最初是Line。开放源码成果的一部分,目前是个与厂商无关的计划。其间,BusyBox计 划发展很快,它现在是许多嵌入式Linu

14、x系统的基石之一。它被收纳在大多数嵌入式 Linux发行套件之中,并且拥有非常活跃的用户群。此计划的网站目前位于 o此计划网站包括了文档、链接以及以往的邮件清单记录。如果愿意接受GNU GPL的许 可条款,可在同一个网站下载BusyBox套件。BusyBox之所以受到热烈的欢迎是因为它能够以一个极小型的应用程序来提供整个命令 集功能。BuxyBox实现了许多命令,以下列举一二:ar、cat、chgrp chmod chown chroot cp cpio date dd、df ifeonfig 等等。尽管BusyBox并不支持这些的命令的所有选项,它提供的子集已足以满足大多数应用的 要求。你可

15、以在BusyBox发行套件的docs目录里看到若干不同格式的文件。它可以用 静态和动态的方式链接glibc或uClibCo有关版本的问题:Makefile和make menuconfig。酉己置、编译和安装BusyBox-1.0rootBinnary rootBinnary #cd busybox-1.00rootBinnary busybox-1.00 #make menuconfig General configuration Build Options Build BusyBox as a static binary (no shared libs)Do you want to buil

16、d BusyBox with a Cross Compiler?对BusyBox进行了配置后下面就可以对其进行编译了。rootBinnary busybox-1.00 # makerootBinnary busybox-1,00 #make install用法当你使用Busybox提供的shell时,例如ash lash或msh、可以使用/etc/profile 文件为所有的shell用户定义全局变量。下面为单用户的目标板定义的/etc/profile范例 文件:#set pathPATH=/bin:/sbin:/usr/bin:/usr/sbinexport PATH系统初始化系统初始化是U

17、nix系统的另一个特性,内核最后一个初始化动作就是启动init程序。此 程序在终结系统启动程序之前会衍生各种应用程序,并且启动若干关键的软件组件。大多数 Linux系统使用的init跟System V的init相仿,配置设定的方式也极为相似。对嵌 入式Linux系统来说,System V init过于灵活,因为此类系统很少会被当成多用户系统 来使用。根文件系统上其实并不需要配置标准的init程序,例如System V init。内核本身并不 在意所执行的是否为init程序。内核只要求系统完成初始化动作之后,它可以启动一个应用程 序。例如你可以加入init=PATH_TO_YOUR_INIT这个

18、引导参数,要求内核使用init程 序。然而这么做会有些缺点,因而应用程序将会是内核所启动的惟一应用程序。而且,如果 应用程序意外中止的话,将会造成内核恐慌并导臻系统重新引导;这如同System V init意 外结束执行一样。尽管在某些情况下可能需要这么做,但是这么做多半会导致系统变得毫无 用处。因此,比较安全和有用的做法通常是让根文件系统配备真正的init程序。接下来我们将会探讨在BusyBox的init。BusyBox init除了缺省支持的命令,BusyBox还提供与init类似的能力。如同原始的主流init , BusyBox也可以处理系统6勺启动工作。BusyBox的init尤其适合

19、在嵌入式系统中使用, 因为它可以为嵌入式系统提供所需要的大部分init功能,却不会让嵌入式系统被System Vinit的额外特性拖累。此外,因为BusyBox是单个套件,所以当你要开发或维护系统 时,不需要注意额外的软件套件。然而有些时候系统可能不适合使用BusyBox的init , 例如它不提供运行级别的支持。因为/sbin/init是/bin/busybox的符号链接,所以BusyBox是目标板系统上执行的 第一个应用程序。当BusyBox知道调用它的目的是要执行init,它会立即跳转到init进 程。BusyBox的init进程会依次进行以下工作:1、为init设置信号处理进程。2、初

20、始化控制台。3、剖析 inittab 文件、/etc/inittab 文件。4、执行系统初始化命令行。BusyBox在缺省情况下会使用/etc/init.d/rcS命令行。5、执行所有会导致init暂停的inittab命令(动作类型:wait )。6、执行所有仅执行一次的inittab命令(动作类型:once )。一旦完成以上工作,init进程便会循环执行以下工作:1、执行所有终止时必须重新启动的inittab命令(动作类型:respawn )。2、执行所有终止时必须重新启动但启动前必须先询问用户的inittab命令(动作类型: askfir st )。在控制台初始化期间,BusyBox会判断

21、系统是否被设成在串行端口上执行控制台(如, console=ttySO作为内核引导参数)。若是这样,BusyBox在之前的版本会停用 所有的虚拟终端。但是,从的版本开始,BusyBox在初始化的过程中并不会停 用虚拟终端。如果事实上没有虚拟终端,稍后若用户想在某些虚拟终端上启动shell则会 导致执行失败,所以不必停用虚拟终端。控制台初始化后,Busybox会检查/etc/inittab文件是否存在。如果此文件不存在, BusyBox会使用缺省的inittab配置。它主要会为系统重引导,系统挂起以及init重启 动设置缺省的动作。此外,它还会为头四个虚拟控制台(/dev/ttyl到/dev/t

22、ty4)设置 启动shell的动作。如果并未建立这些设备文件,BusyBox将会报错。如果存在/etc/inittab文件,Busybox会予以剖析,并将其中的命令记录在内部的数据 结构中,以便适时执行。BusyBox能够识别的inittab文件格式,在BusyBox套件附 带的文档中有很好的说明。BusyBox套件附带的文档中还包含详尽的inittab文件范例。 inittab文件中每一行的格式如下所示:id :runlevel:action: process尽管此格式与传的System V init类似,但请注意,id在BusyBox的init中具有不同 的意义。对Busybox而言,id

23、用来指定所启动进程的控制tty。如果所启动的进程并不 是个可以交互的shell ,大可以将此字段空着不填。可以交互的shell ,例如BusyBox的sh , 应该会有个控制tty o如果控制tty不存在,BusyBox的sh将会报错。BusyBox将 会完全忽略runlevel字段,所以你可以将它空着不填。process字段用来指定所执行程 序的路径,包括命令行选项。action字段用来指定下表所列八个可应用到process的动 作之一。表:BusyBox init能够识别的inittab动作类型动作结果sysinit为init提供初始化命令行的路径respawn每当相应的进程终止执行便重启

24、动dskfi rst类似respawn ,不过它们的主要用途是减少系统上执行的终端应用程序的数量。它将会 促使 init 在控制台上显示Please press Enter to activate this console的信息,并在 重新启动进程等待用户按下Enter键wait告诉init必须等到相应的进程完成后才能继续执行once仅执行相应的进程一次,而且不会等待它完成ctrlaltdel当按下Ctrl-Alt-Delete组合键时,执行相应的进程 shutdown当系统关机时,执行相应的进程resta rt当init重新启动时,执行相应的进程。通常此处所执行的进程就是init本身 一个简

25、单的文件::sysinit:/etc/init.d/rcS:respawn:7bin/login:restart :/sbin/init:ctrlaltdel:/sbin/reboot:shutdown:/bin/umount -a -r:shutdown :/sbin/swapoff -a此处将id空着不填,因为该字段与命令的正常操作无关。runlevel也空着未填,因为 BusyBox会完全忽略此字段。然而,如同前文所述,除非init执行系统初始化命令行,否则不会进行以上提到的这些动 作。这个命令行可能相当复杂,也可能会调用其他的命令行。你可以使用这个命令行来设定 所有的基本设定值,初始化

26、各种需要特别处理的系统组件。尤其是,此处是执行以下动作的 地方: 以读写模式重新安装根文件系统。 安装额外的文件系统。 初始化及启动网络接口。,启动系统监控程序。下面是我的初始化命令行:#!/bin/shecho mount all /bin/mount -a#/sbin/ifconfig ethO 192.168.1.100 echoechoechoecho “ zky embedded linux!1上面的初始化命令要能够正常执行,目标板的根文件系统中必须存在fstab文件。下面我 们看一下fstab文件。none /proc proc defaults 0 0none /dev/pts

27、devpts mode=0622 0 0tmpfs /dev/shm tmpfs defaults 0 0链接库正如前所说,glibc套件包含若干链接库。你可以任套件建立期间列出lib目录的内容检查 它所安装的所有链接库。此目录中主要包含四种类型的文件:实际的共享链接库这类文件的文件格式为libLIBRARY_NAME_GLIBC_VERSION.so ,其中LIBRARY_NAME是链接库的名称,GLIBC_VERSION是你使用的glibc套件的版本编号。如的数学链接库的名称为。主修订版本的符号链接主修改版本的编号方式与实际的glibc版号不同。以实际的共享C链接库为例,它的主修订版本编号

28、为6。相对而言,libdl-2的主修订版 本编号为2 o主修订版本的符号链接的名称格式为 libLIBRARY_NAME.so.MAJOR_REVISION_VERSION ,其中MAJOR_REVISION_VERSION是链接库的集修订版本编号。以实际的C链接库为例, 其符号底接的名称为libc.so.6 dibdl则是。程序一旦链接了特定的链接库, 它将会参用其符号链接。程序启动时,加载器程序之前,会因此加载该文件。与版本无关的符号链接指向主修订版本的符号链接这些符号链接的主要功能,是为需要链接特定链接库的所有程序提供一个通用的条目,与主 修订版本的编号或glibc涉及的版本无关。这些符

29、号链接典型的格式为libLIBRARY_NAME,so。例如,libm.so 指向 lib.so.6 , lib.so.6 指向实际的共享链接 库libm-2。惟一的例外是libc.so ,它是一个链接命令行。这个与版本无关之符 号链接,就是链接程序时参用到的一个文件。静态链接库包文件选择静态方式链接库的应用程序便会使用这些包文件,这些包的文件名格式为 libLIBRARY_NAME.a。例如 libdl 的静态包文件就是 libdl.a。以上描述的正种类型的文件,我们只需其中两种:实际的共享链接库和主修订版本的符号链 接。其余两种类型的文件只有在链接执行文件的时候才会用到,执行应用程序的时候

30、并不需 要。除了链接库文件,我们还需要复制动态链接器及其符号链接。动态链接器的文件名,依据 glibc链接库的命名习惯,通常会叫作ld-GLIBC_VERSION.so。然而,这或许是GNU 工具链中最奇特的地方,动态链接器符号链接的名森取决于工具链所应用的架构。如果这是 为i386、ARM、SuperH或m68k建立的工具链,则动态链接器的符号链接通常会叫 作 。如果这是为 MIPS 或 PowerPC 所 建立的工具链,则动态链接器的符号链会通常会叫作 。然而,在向目标板的根文件需统实际复制任何glibc组件之前,必须先找出应用程序需要 哪些glibc组件。下表提供了 glibc中所有组件

31、的简短说明,以及每个组件的引用提示。 表:glibc里的链接库组件以及根文件系统的引用提示链接库组件内容引用提示Id动态链接器必要libBrokenLocale修正进程,让locale(本地)特性有问题的应用程序得以正常执行。经由预先加载来覆盖应用 程序的预设值(需使用LD_PRELOAD)o很少用到libSegFault用来捕捉内存区段错误以及进行回溯的进程很少用到libanl异步名称查询进程很少用到libc主C链接库进程必要libcrypt密码学进程大多数涉及认证应用程序需要用到libdl用来动态加载共享目的文件的进程使用dlopen()之类函数的应用程序需要用到 libm数学进程数学函数

32、需要用到 libmemusage用来进行堆(heap)和堆栈(stack)很少用到内存统计的进程 很少用到 libnslNIS网络服务链接库进程 很少用到 libnss_compat这是 NIS 与 Name Switch Service (NSS)兼容的进程 由glibc NSS自动加载 libnss_dnsDNS而NSS进程 由glibc NSS自动加载 libnss_files 文件查询的NSS进程 由glibc NSS自动加载 libnss_hesiodHesiod名称服务的NSS进程 由glibc NSS自动加载 libnss_nisNIS而NSS进程 由glibc NSS自动加载

33、libnss_nisplusNIS plus 的 NSS 进程 由glibc NSS自动加载 libpcprofile 程序计数器统计进程 很少用到 libpthreadLinux 的 POSIX 1003.1c 多线程 多线程设计需要用到 libresolv 名称解析器进程 名称解析需要用到 Librl异步I/O进程 很少用到 libpthread_db 多线程调试捶程对使用多线程的应用程序进行调试时,由gdb自动加载。事实上,任何应用程序都不会链 接此链接库Libutil登录进程,它是用户记录数据库的一部分 终端联机需要用到除了记下应用程序链接哪些链接库,通常还可以使用Idd或readel

34、f命令列出应用程序要 依存哪些动态链接库。决定需要哪些链接库组件之后,我们可以将这些链接库组件和相关的符号链接复制到目标板 根文件系统中的lib目录里。for file in libc libcrypt libdl libm libpthread libresolv libutildo cp $file-*.so /rootfs/libcp -d $file.so.*0-9 /rootfs/lib donecp -d Id*.so.* /rootfs/lib第一个cp命令会复制实际的共享链接库,第二个cp命令会复制主修订版本的符号链接, 第三个cp命令则会复制动态链接器及其符号链接。在第二个和第三个cp命令中的-d 选项用来复制符号链接本身。否则会变成复制符号链接指向的文件。把 linux_cmd_line 的值改为noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySACOz,param set linux_cmd_line noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySACO

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁