嵌入式Linux根文件系统制作_第1页
嵌入式Linux根文件系统制作_第2页
嵌入式Linux根文件系统制作_第3页
嵌入式Linux根文件系统制作_第4页
嵌入式Linux根文件系统制作_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1嵌入式Linux根文件系统制作AllrightsreservedBUAAAllrightsreserved;Theinformationcontainedinthisdocumentissubjecttochangewithoutnotice;内容提纲根文件系统主要目录结构基本的根文件系统上存放的内容制作一个基本的根文件系统的方法根文件系统镜像的使用34根文件系统(Rootfilesystem)是存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以安装各种软件包。什么是根文件系统根文件系统主要目录结构5目录内容/bin可执行程序/dev块、字符设备节点文件/etc主要配置文件和初始化执行文件/lib

基本的库文件,如:C库,和内核模块(modules)/mnt挂载点,临时挂载文件系统用/opt附加的软件包/proc虚拟文件系统,用于内核和进程通讯/sbin基本的系统管理程序/tmp临时文件目录/usr更多的用户程序,包括Xserver/sys虚拟文件系统sysfs挂载点/var可变信息储存,如log等文件系统层次结构标准文件系统层次结构标准【FilesystemHierarchyStandard(FHS)】Linux和UNIX的文件系统是一个以“/“为根的阶层式的树状文件结构,/因此被称为根目录。在早期的UNIX系统中,各个厂家各自定义了自己的UNIX系统的文件系统构成,比较混乱。为了避免在Linux也产生同样的问题,在Linux面世不久,就开始了对Linux文件系统进行标准化的活动,于1994年推出了名为FSSTND(FilesystemStandard)的Linux文件系统层次结构标准。FHS标准使得众多的Linux发布包有了可以遵循的标准,使得软件和用户可以预测已经安装了的文件和目录的位置。它定义了如下的内容。

定义了文件系统中每个区域的用途

定义了所需要的最小构成的文件和目录提高软件的可移植性/fhs/6程序文件的放置

程序文件目录/bin:普通用户和root用户都能执行的基本程序ping,mknod,mount,tar,grep,gzip,etc/sbin:root用户能执行的基本程序int,insmod,route,mkfs,rmmod,ifconfig/usr/bin:更多非必须的用户程序autorun,bibtex,latex,biff,ftp,wc,whereis,whoami/usr/sbin:更多非必须的root工具程序automount,httpd,in.telnetd,in.talkd,sendmail7定制应用程序配置基本的linux命令(嵌入式linux通过busybox制作)cat,chmod,chown,cp,chroot,copi,date,dd,df,dmesg,dos2unix,du,echo,env,expr,find,grep,gunzip,gzip,halt,id,ifconfig,init,insmod等等配置用户自己的应用桌面管理器等等8库文件的放置

/lib:boot系统和运行基本命令时需要的动态库文件/usr/lib:所有的其他库/usr/lib/xxx:一些工具包的私有库如:/usr/lib/perl59定制库文件配置基本的glibc库(动态库)仅保留使用到的库可以用ldd查看应用程序用到的动态库$arm-linux-lddrootfs/bin/busybox$arm-linux-readelf-arootfs/bin/busybox|grep“SharedLibrary”复制相应的库到自己的根文件系统$cp-a*.sorootfs/lib/Strip复制到根文件系统下的动态库:$arm-linux-strip./lib/*.so10安装内核模块(驱动)通过makeInstall_modules安装模块到rootfs相应目录修改内核源码Makefile并安装模块$exportINSTALL_MOD_PATH=<your_rootfs>/$makemodules$makemodules_install内核源码中的模块将被安装到your_rootfs上<your_rootfs>/lib/modules/<kernel_vesion>/可以将内核中的模块安装到知道目录,然后在将其复制到your_rootfs上$cp–a/tmp/lib/modules/<kernel_vesion>./lib/modules/11Linux设备文件Linux系统中所有的对象(包括设备)都是以文件的形式体现的Linux系统中,所有的设备文件(如:设备节点),通常放到/dev下嵌入式系统中只需要创建必须的设备节点即可12字符设备举例Ls–l/dev/“c”指明该设备节点是字符设备crw-rw----1rootuucp4,64Feb232004/dev/ttyS0crw--w----1jdoetty136,1Feb232004/dev/pts/1crw--------1rootroot13,32Feb232004/dev/input/mouse0crw-rw-rw1rootroot1,3Feb232004/dev/null典型设备keyboards,mice,parallelport,IrDA,Bluetoothport,consoles,terminals,sound,video...13块设备举例

“b”指明该设备节点是块设备(ls-l)brw-rw---1rootdisk3,1Feb232004hda1brw-rw---1jdoefloppy2,0Feb232004fd0brw-rw---1rootdisk7,0Feb232004loop0brw-rw---1rootdisk1,1Feb232004ram1brw-------1rootroot8,1Feb232004sda1典型块设备磁盘,ramdisk,SD,U盘等等14设备的主版本号次版本号Linux系统是通过主设备号和次设备号来区分设备的主设备号:(major)内核用来区分哪类设备次设备号:(minor)区分某类设备中的哪个设备内核中的相关文档Documentation/devices.txt15创建设备节点设备文件不能在加载驱动程序时自动创建,要通过指令创建创建设备文件的一边语法:$mknod/dev/<device>[c|b]<major><minor>例如:$mknod/dev/ttyS0c464$mknod/dev/hda1b3116基本的设备节点17名称描述MajorMinormem物理内存访问设备11nullNull设备13zero从该设备读取将得到零15random非确定随机数发生设备18tty0当前的虚拟终端设备40tty1第一个虚拟终端设备41ttyS0第一个串口设备464tty当前的TTY设备50console系统console设备51使用不同的文件目录层次结构?FHS规定了制定根文件系统的规则通常大多少应用程序和发布依赖这些规则,但这些规则不是内核强制的在嵌入式Linux系统中,你可以构建一个完全不同的根目录层次结构相应的AP配置需要适当调整一个极端的做法是构建嵌入式Linux系统时root文件系统,但不推荐这么做1819Linux系统的引导过程BootloaderinitKernel.bootshellmingettyinittabloginrc/etc/init.d/rcSinit程序通过命令行知道init=/linuxrc/sbin/init是默认的第一个用户空间程序启动系统服务程序,自动运行的程序等(sshd,Xserver...)嵌入式linux系统使用busybox的init程序20/linuxrc用来初始化系统的一个简单的启动脚步程序通过内核命令行产生init指定init=/linuxrc通常用在initrds上或一个简单的系统中通常是nashorbusyboxsh脚步这个脚步可以执行多种任务:加载驱动设置网络挂载文件系统切换到一个新的根文件系统...21创建根文件系统采用Busybox创建基本命令创建基本的目录/lib/etc/var/tmp/dev/sys/proc等添加Glibc基本动态库创建基本的设备节点创建启动脚步(/linuxrc)添加启动配置和脚步程序/etc/inittab/etc/fstab/etc/init.d/rcS测试根文件系统制作根文件系统镜像22BusyBox项目构建系统命令BusyBox项目是由BrucePerensin在1996创建的/BusyBox是在GNUGPL许可协议下发行的开源软件享有“嵌入式Linux的瑞士军刀”美誉,ErikAndersen先生维护;Busybox是一个UNIX系统工具集,它将很多普通的UNIX工具集成到一个很小的可执行文件中,为普通用户提供大多数常用的命令;BusyBox维护的主要指令包括

cat,chmod,chown,cp,chroot,copi,date,dd,df,dmesg,dos2unix,du,echo,env,expr,find,grep,gunzip,gzip,halt,id,ifconfig,init,insmod,etc23安装BusyBoxBusyBox可以编译成一个静态可执行程序,也可以使用glibc或者uClibc编译成一个使用动态库的可执行程序编译Busybox步骤下载代码,解压代码配置Busybox$cd$PRJROOT/busybox-1.00-pre10/$makemenuconfig

主要配置有哪些命令等交叉编译和安装2425和配置Linux内核选项一样,在Busybox源码根目录中输入makemenuconfig命令:配置Busybox26GeneralConfiguration通用选项BuildOptions 和编译相关的选项=> BuildBusyBoxasastaticbinary(nosharedlibs) //静态编译BuildwithLargeFileSupport(foraccessingfiles>2GB) //大文件支持DoyouwanttobuildBusyBoxwithaCrossCompiler? //交叉编译

AnyextraCFLAGSoptionsforthecompiler?" //CFLAGS选项

Compileallsourcesatonce DebuggingOptions 和调试相关的选项InstallationOptions Busybox的安装信息

=> Don'tuse/usr //不使用usr目录

Appletslinks //程序链接方式

BusyBoxinstallationprefix

//安装路径

部分选项的含义27myhost:/embedded/Busybox#makemyhost:/embedded/Busybox#makeinstallmyhost:/embedded/Busybox#filebusyboxbusybox:ELF32-bitLSBexecutable,ARM,version1(ARM),forGNU/Linux2.4.3,staticallylinked,forGNU/Linux2.4.3,strippedmyhost:/embedded/Busybox#cd_install(默认安装路径)编译并安装Busybox文件系统的制作方法-1:根文件系统在主机上的目录为/home/work/myroofs。在此目录下使用mkdir命令建立dev,etc,home,lib,mnt,proc,root,sys,tmp目录。创建etc目录下的文件在/home/work/myrootfs/etc目录下存放各种配置文件。这些文件都是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。创建etc/inittab文件

init进程根据/etc/inittab文件来创建其他子进程,比如调用脚本文件配置ip地址、挂接其他文件系统,最后启动shell等。文件系统的制作方法-2:创建etc/init.d/rcS文件

rcS文件是一个脚本文件,借助启动脚本可以设置各种程序开机后自动运行,也可进行其他系统设置,这有点类似于Windows系统中的Autobat自动批处理文件。创建的文件内容如下(实际内容可能与此不完全一致):注意最后还要改变它的属性使它能够执行,执行chmod+xetc/init.d/rcS命令。创建etc/fstab文件

fstab文件描述系统中各种文件系统的信息,应用程序读取这个文件,然后根据其内容进行自动挂载的工作。文件中各字段的意义如下:1)device:要挂接的设备,/dev/mtdblockl;2)mount-point:挂接点;3)type:文件系统类型;4)opt-ions:挂接参数,以逗号隔开;5)dump和fsckorder:用来决定控制dump、fsck程序的行为。文件系统的制作方法-3:用户和组文件的创建

在etc目录下增加passwd和group两个文件。首先增加passwd文件,passwd一共由7个字段组成,6个冒号将其隔开。其含义分别为:1)用户名;2)是否有加密口令,x表示有,不填表示无,采用MD5、DES加密;3)用户ID;4)组ID;5)注释字段;6)登录目录;7)所使用的shell程序。构建dev目录

从Linux-2.6.18开始,负责旧版本的设备管理系统devfs已被废除,但新版本的udev是一个基于用户空间的设备管理系统。在内核启动时并不能自动创建设备节点,固需手动创建console和null两个启动过程必须的设备节点。将采用busybox中内置的mdev,一个简化的udev版本。

#mknoddev/consoleC51

#mknoddev/nullC13如果不创建这两个设备文件,在文件系统启动时会出现错误信息,不能初始化控制台。安装glibc库

在开发板上需要加载器和动态库,执行如下几个命令:

$mkdir-p/home/work/rootby/lib

$cd/home/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib

$cp*.SO*/home/work/rootby/lib-dBusyBox的init程序(1)BusyBoxinit实现了init的大部分程序Runlevel是不支持的BusyBoxinit执行的几个阶段:1.设置init信号句柄2.初始化console(s)3.解析inittab文件,/etc/inittab如果/etc/inittab不存在,BusyBox使用缺省值:详细内容参考BusyBox相关文档31BusyBox的init程序(2)4.运行系统初始化脚步(BusyBoxuse/etc/init.d/rcS作为缺省)在这里你可以做的工作:重新以rw

模式挂载根文件系统挂载附加的文件系统初始化并启动网络接口启动系统守护进程5.运行inittab中所有action为wait

的命令6.运行inittab

中所有action为once的命令7.循环运行:1)运行inittab中所有action为respawned

的命令2)运行inittab中所有action为askfirst的命令32BusyBoxinit支持的inittab文件格式BusyBoxinit程序解析/etc/inittab文件.如果/etc/inittab不存在,则用缺省值BusyBoxinit支持的inittab格式id:runlevels:action:processidID意义对BusyBoxinit和SystemVinit是不同的此处ID指明程序的控制tty如果程序不需要交互,则ID为空runlevelsBusyBoxinit不支持runlevel,将被忽略process将执行的命令和命令的命令行参数action动作类型,见下表.33BusyBoxinittab文件Actions定义34Action类型描述sysinitprovideinitwiththepathtotheinitializationscriptrespawn程序终止后重新执行askfirst同respawn,程序执行前会询问,要求按ENTER键waitinit等待执行的程序结束后再继续执行once只运行程序一次,并且不等待程序运行完就继续执行ctrlaltdel当按下Ctrl-Alt-Delete组合键时执行的程序shutdown系统关机时执行的程序restart系统重新启动时执行的程序,通常是init程序BusyBoxinittab文件样例/etc/inittab#thisisrunfirstexceptwhenbootinginsingle-usermode.::sysinit:/etc/init.d/rcS#/bin/shinvocationsonselectedttys#Startan"askfirst"shellontheconsole(whateverthatmaybe)::askfirst:-/bin/sh#Stufftodowhenrestartingtheinitprocess::restart:/sbin/init#Stufftodobeforerebooting::ctrlaltdel:/sbin/reboot35/etc/init.d/rcS文件样例/etc/init.d/rcS文件内容#!/bin/sh#Thisisthefirstscriptcalledbyinitprocess/bin/mount-aexec/usr/etc/rc.local36/etc/fstab样例none/procprocdefaults00tmpfs/dev/shmtmpfsdefaults0037创建设备节点样例/usr/etc/rc.local#!/bin/sh#adduserspecifiedscriptcd/devln-s/dev/fb/0fb0ln-svc/0tty0ln-svc/1tty1ln-svc/2tty2mknod–m660mtd0c900mknod–m660mtd1c902mknod–m660mtd2c904mknod–m660mtd3c906mknod–m660mtdblock0b310mknod–m660mtdblock1b311mknod–m660mtdblock2b312mknod–m660mtdblock3b31338部署基本动态库文件#arm-linux-readelf-a“yourbinary”|grep“Shared”比如:~$arm-softfloat-linux-gnu-readelf-abusybox|grep"Shared"0x00000001(NEEDED)Sharedlibrary:[libm.so.6]0x00000001(NEEDED)Sharedlibrary:[libc.so.6]加载器:ld.linux.so.2#cdrootfs/lib删除所又无用的目录和静态库(所有的目录和.a文件)‏然后剥除库文件中的调试段等信息,从而减小库的体积。运行:#arm-softfloat-linux-gnu-strip*.so通过NFS测试做好的根文件系统如果你的系统支持网络,可以通过nfs测试做好的根文件系统备份原NFSroot挂载目标NFSroot到新做号的根文件系统目录40文件系统特性41FilesystemWritePersistentPowerdownreliabilityCompressionLivesinRAMCRAMFSNoN/AN/AYesNoJFFS2YesYesYesYesNoJFFSYesYesYesNoNoExt2overNFTLYesYesNoNoNoExt3overNFTLYesYesYesNoNoExt2overRAMdiskYesNoNoNoYes所谓制作文件系统映像文件,就是将一个目录下的所有内容按照一定的格式存放到一个文件中,这个文件可以直接烧写到存储设备上去。在yaffs源码中有个utils目录,里面有mkyaffsimage和mkyaffs2image的源代码,前者可制作yaffs映像文件,后者制作yaffs2映像文件,将下载的yaffs2解压出来在目录/Development下有两个文件夹:yaffs和yaffs2,进入yaffs2/utils目录,此目录下有3个文件。利用makyaffs2image工具,执行#mkyaffsimage2myrootfs/yaffs2.img命令可生成文件系统映像文件。执行#gzip-9yaffs2.img最终生成嵌入式Linux根文件系统的映像文件为yaffs2-.img.gz。至此,整个根文件系统就制作完成,最后可以通过上面制作的pyaffs2.img.gz启动整个系统。制作文件系统镜像文件系统选择原则RAMdisk系统闪存比较小,但RAM相对充足CRAMFSifyoursystemhasslightlymoreflash,orifyouwouldrathersaveasmuchRAMaspossiblefortheactualapplicationrunningonyourtargetJFFS2ifyouneedtobeabletochangeanyportionofyourfilesystematanytime.supportonNORorN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论