您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 3_构建嵌入式linux系统-根文件系统
嵌入式Linux移植广东省嵌入式软件公共技术中心2007年7月14日根文件系统文件系统-在磁盘上组织文件的方法;不同的操作系统都有一种把数据保存为文件和目录的方法(不同文件系统);如:windows操作系统中,不同的磁盘分区有独立的根目录,并且用唯一的驱动器标识符表示,比如C:\,D:\等;Linux的文件系统组织和windows不同,它的文件系统是一个整体,把所以的文件系统结合成一个完整的统一体,这就是linux的根文件系统。课程内容根文件系统介绍制作根文件系统Init程序启动流程什么是Linux根文件系统使用Linux的时候,通过命令“ls/”就会发现:在/下包涵很多的目录,比如etc、usr、var、bin......等目录;而在这些目录中还有很多的目录或文件;文件系统在Linux下看上去就象树形结构,所以可以把文件系统的结构形象的称为树形结构。linux文件系统的最顶端是“/”;我们称“/”为Linux的根,也就是Linux操作系统的根文件系统。Linux的文件系统的入口就是“/”,所有的目录、文件、设备都在“/”之下。根文件系统目录结构Linux遵守文件系统科学分类标准(FHS),一个定义许多文件和目录的名字和位置的标准。一个linux的根文件系统目录结构如下:/Linux文件系统的入口,也是处于最高一级的目录;/bin系统所需要的那些命令位于此目录,比如ls、cp、mkdir等命令;这个目录中的文件都是可执行的、普通用户都可以使用的命令。作为基础系统所需要的最基础的命令就是放在这里/bootLinux的内核及引导系统程序所需要的文件目录;如内核的映像文件,启动加载器(GRUB);根文件系统目录结构/dev设备文件存储目录,比如声卡、磁盘....../etc系统配置文件的所在地,一些服务器的配置文件也在这里;比如/etc/inittab是init进程的配置文件,etc/fstab是用来指定启动时需要自动安装的文件系统列表。/home普通用户家目录默认存放目录;/lib库文件存放目录/mnt这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom等目录。根文件系统目录结构proc操作系统运行时,进程信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录;/rootLinux超级权限用户root的目录;/sbin大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,如ifconfig/tmp临时文件目录/usr这个是系统存放程序的目录,比如命令、帮助文件等。/var目录包含在正常操作中被改变的文件:假脱机文件、记录文件、加锁文件、临时文件和页格式化文件。文件存放规则为了实现各种linux版本系统的标准化,各种版本的linux系统都会遵循FHS标准;主要规则如下:配置文件放在/etc目录下;设备文件放在/dev目录下;库文件放在目录/lib目录下;存放系统编译后的可执行文件、命令的目录是/bin、/sbin、/usr/bin、/usr/sbin目录最少的目录在嵌入式系统中,根目录下的很多目录都可以删除,如下:为多用户提供可扩展环境的所以目录都应该删除;如(/home,/mnt,/root)根据引导加载情况,/boot目录可以删除。其余的目录/bin,/dev,/etc,/proc,/sbin,/usr,/lib都是不可缺少的。构建根文件系统Linux的根文件系统包括支持linux系统正常运行的基本内容,至少应包括以下几项内容:基本的文件系统结构,如bin、dev、etc、sbin,lib、usr、proc。基本程序运行所需的动态库。基本的系统配置文件。必要的设备文件支持。基本的应用程序,如sh、ls、cp等构建根文件系统就是往相应的目录添加相应的文件。如:在/dev添加设备文件,在/etc添加配置文件,在/bin添加命令或者程序,在/lib添加动态库等。添加设备文件Linux对所有外部设备的访问都是以文件的形式来进行;在Linux系统中,可以找到设备对应的文件,称为设备文件;设备文件(也叫做设备节点)都存放在/dev的目录下;添加设备文件在/dev目录下,建立设备文件的命令是mknod;如:mknod/dev/ledc2310上面例子中“/dev/led”是设备文件路径;“c”是指定为字符设备;“231”是主设备号;“0”是次设备号。Linux系统是靠主、次设备号来联系驱动程序和设备文件的;在内核源码树中,Documentation/devices.txt文件描述了常用的linux驱动程序的主、次设备号;添加设备文件Linux内核完全可以自己管理设备文件,这就是设备文件系统(devfs);设备文件系统可以在配置内核时定制;其层次是makemenuconfig--Filesystems--Pseudofile-system--/devfilesystemsupport;内核启动的时候就会把设备文件系统挂载到/dev目录下;有了设备文件系统,linux设备文件的创建、删除都由各自设备驱动程序管理,不再需要用mknod命令来添加设备文件了;添加动态库应用程序的运行需要动态链接库,交叉编译的应用程序需要交叉编译的动态库;假如我们用的工具链的路径是/usr/local/arm/3.3.2/,链接库的目录是/usr/local/arm/3.3.2/arm-linux/lib;此目录下有四种类型的文件:实际的共享链接库,如:libc-2.3.2.so主修订版本的符合链接,如:libc.so.6与版本无关的符合链接,如:libc.so静态链接库包文件,如:libc.a应用程序的运行只依赖于:实际的共享链接库和主修订版本的符合链接;因此,在构建嵌入式根文件系统中,只需添加以上两种库文件。添加动态库在向目标板的根文件系统复制动态库之前,必须找出应用程序需要那些动态库;下面介绍几个主要的动态链接库:ld动态链接器libc主C链接库libcrypt秘密学链接库libdl用来动态加载共享文件的动态库libm数学库libpthread多线程库……添加动态库除了记下应用程序连接了哪些链接库之外,还可以通过arm-linux-readelf命令来找出应用程序依赖于哪些动态链接库;如:arm-linux-readelf-dhello;//hello只是打印一句“hello”的程序;添加内核模块内核源码中的顶层Makefile文件包含了modules_install目标;在缺省情况下,内核模块会安装到/lib/modules目录下;然而,我们使用的是交叉开发,所以我们必须指示Makefile将模块安装到另外一个目录,如下;在交叉编译完内核之后,即执行完make之后,使用以下命令安装模块;makeINSTALL_MOD_PATH=目标安装目录modules_install添加系统应用程序Linux系统具有极其丰富的命令集;开发者没有能力逐一交叉编译这么多的命令程序,而且嵌入式系统也不需要这么多命令程序;BusyBox软件能够以一个极小型的应用程序来提供整个命令集;是构建嵌入式linux系统的主要基石;添加系统应用程序BusyBox介绍Busybox是一个开源的软件项目,其官方网站是:Busybox集成了一百多个最常用的Linux命令程序和工具;Busybox程序的体积非常之小,很适合嵌入式系统;添加系统应用程序BusyBox介绍Busybox提供的程序包括:具有shell功能,如csh提供一个迷你的vi编辑器提供系统不可或缺的/sbin/init程序其他的系统基本命令,如:ls,mkdir,ifconfig等。添加系统应用程序交叉编译busybox软件:busybox的源码可以从下载获取源码后,解压源码tarjxvfbusybox-1.5.0.tar.ba2配置Busybox的时候最好是基于默认配置之上来配置的cdbusybox-1.5.0//进入busybox源码目录makedefconfig//配置成默认配置添加系统应用程序交叉编译busybox软件:配置makemenuconfig配置界面显示了很多busybox的配置选项;可以看到,在makedefconfig之后,所以的配置选项都已经选择上了;选上几个必要的选项:添加系统应用程序交叉编译busybox软件:Busyboxsetting-buildsoptions-[*]buildbusyboxasastaticbinary//选择静态链接busybox,使其运行是独立于其他函数库-installitationoptions-[*]don’tuse/usr//安装目录不是/usr;MiscellaneousUtilities―[]taskset//“taskset”选项去掉,不然编译时会出错添加系统应用程序交叉编译busybox软件:指定交叉编译器exportPATH=/usr/local/arm/3.3.2/bin:$PATH#编译安装makeARCH=armCROSS_COMPILE=arm-linux-CONFIG_PREFIX=安装路径allinstallBusybox在编译安装之后,生成一个可执行程序busybox;其他的命名都是链接到这个busybox程序;配置系统初始化文件linux内核启动的最后一个初始化动作就是启动init程序;所谓init进程,是一个由内核启动的用户级进程;此程序会衍生出各种应用程序,并且启动若干关键的软件组件。Init进程的功能:它是所有其他进程的父进程;init进程根据文件的内容运行一系列程序和脚本文件,完成系统的各项配置。Busybox的init分析Busybox提供常用系统命令之外,还提供一个init程序,它可以处理系统的启动工作;Busybox的init进程会依次执行以下动作:初始化控制台根据/etc/inittab文件,执行系统初始化命令行(动作类型:sysinit)根据/etcinittab文件,执行所有会导致init暂停的inittab命令(动作类型:wait);根据/etc/inittab文件,执行所有仅执行一次的inittab命令(动作类型:once)。一旦完成以上工作,init进程会循环执行一下工作执行所以终止时必须重新启动的inittab命令(动作类型:respawn);执行所有终止时必须重新启动但启动前先询问用户的inittab命令(动作类型:askfirst);Busybox的init分析上面提到,init进程是根据/etc/inittab文件来执行相应的动作的;下面分析inittab文件的格式:Inittab文件中每一行的格式如下:id:runlevel:action:process其中:Id:用来指定所启动进程的控制台,在嵌入式系统中一般不添;Runlevel:busybox完全忽略runlevel字段;Action:指出init程序在执行相应process时,对process所采取的动作Process:具体的执行程序;Busybox的init分析inittab文件的action字段中,有以下八个应用到process的动作:Sysinit:为init提供初始化命令行的路径;Respawn:当该进程死亡时,init将重新启动该进程,不等待该进程的结束;Askfirst:当相应的进程终止便重新启动,会t在控制台显示“PleasepressEntertoactivatethisconsole.”的信息。
本文标题:3_构建嵌入式linux系统-根文件系统
链接地址:https://www.777doc.com/doc-3390356 .html