嵌入式linux根文件系统制作经典doc.ppt

上传人:sccc 文档编号:5398553 上传时间:2023-07-03 格式:PPT 页数:322 大小:245.02KB
返回 下载 相关 举报
嵌入式linux根文件系统制作经典doc.ppt_第1页
第1页 / 共322页
嵌入式linux根文件系统制作经典doc.ppt_第2页
第2页 / 共322页
嵌入式linux根文件系统制作经典doc.ppt_第3页
第3页 / 共322页
嵌入式linux根文件系统制作经典doc.ppt_第4页
第4页 / 共322页
嵌入式linux根文件系统制作经典doc.ppt_第5页
第5页 / 共322页
点击查看更多>>
资源描述

《嵌入式linux根文件系统制作经典doc.ppt》由会员分享,可在线阅读,更多相关《嵌入式linux根文件系统制作经典doc.ppt(322页珍藏版)》请在三一办公上搜索。

1、嵌入式linux根文件系统制作(经典),1 准备工作,下载busybox工具 说明:用于制作可执行命令工具集,2 开发环境,1)主机:RedHat 9,2)交叉编译工具路径:/usr/local/arm/3.3.2/(用于编译busybox1.2.0),把/usr/local/arm/3.3.2/bin路径添加到/etc/profile文件中,3)开发板:友善之臂SBC2410,4)开发板分别使用的Linux2.4.18内核和Linux2.6.14内核验证文件系统,3 建立目标板空根目录文件夹及根目录下的文件夹,root190 friendly-arm#mkdir myroots,root19

2、0 friendly-arm#pwd,/friendly-arm/myroots,root190 friendly-arm#cd myroots,root190 myroots#,root190 myroots#mkdir bin sbin usr lib dev mnt opt root etc home proc tmp var,root190 myroots#mkdir etc/init.d,进入etc/init.d目录下,建立一个脚本文件,并命名为rcS,用gedit打开,添加如下内容:,#!/bin/sh,PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr

3、/local/bin:,runlevel=S,prevlevel=N,umask 022,export PATH runlevel prevlevel,#,#Trap CTRL-C&c only in this shell so we can interrupt subprocesses.,#,trap:INT QUIT TSTP,root190 myroots#cd./lib,也就是进入lib目录,添加相应的库文件,具体操作略。,4 移植Busybox,进入到压缩文件存放的目录下,并解压。然后进入解压后的busybox目录文件夹,随后配置busybox。,root190 busybox-1.

4、2.0#make menuconfig,执行之后,将出现如下图所示的配置界面:,由于每个版本的配置选项组织有所不同。不管怎样,我们注意以下选项就行了:,1)Support for devfs,2)Build BusyBox as a static binary(no shared libs)/将busybox编译成静态链接,3)Do you want to build busybox with a Cross Compile?,(/usr/local/arm/3.3.2/bin/arm-linux-)Cross Compile prefix/指定交叉编译器,4)init,5)Support r

5、eading an inittab file/支持init读取/etc/inittab 配置文件,6)(X)ash选中ash/建立的rcS脚本才能执行,7)ash,8)cp cat ls mkdir mv/可执行命令工具的选择,自己看着办吧,需要用到的就选上,9)mount,10)umount,11)Support loopback mounts,12)Support for the old/etc/mtab file,13)insmod,14)Support version 2.2.x to 2.4.x Linux kernels,15)Support version 2.6.x Linux

6、 kernels,16)vi,以上内容必须选上,其他可按默认值;如果要支持其他功能,如网络支持等,可按需选择,英语不是很烂的话,这些都没有问题。,配置好之后,保存退出。然后对其编译和安装到刚才建立的根文件系统目录下:,root190 busybox-1.2.0 make TARGET_ARCH=arm CROSS=arm-linux-PREFIX=/friendly-arm/myroots/all install,安装好之后,将相应的二进制文件拷贝到根文件系统相应的目录下。,5 制作yaffs文件系统包,root190 friendly-arm#mkyaffsimage myroots myr

7、oots.img,6下载根文件系统包到开发板上,并运行,其结果如图所示,7补充,首先,本文档制作的根文件系统,是用mkyaffsimage打包成了yaffs镜像文件,也可以使用其他打包工具制作成其他形式的根文件系统,但必须是内核要有相应文件系统的支持,否则,将无法挂上根文件系统。,其次,我们可以根据项目需要,在相应的目录下,添加相应的文件,并配置相应的服务。如内核动态加载模块可放在lib下,在启动脚本里挂载相应的模块;在etc目录下,可移植tinyligin 登录界面应用程序,等等,用Busybox创建文件系统,编译busybox的组合:busybox-1.0.0 arm-linux-gcc-

8、2.95.3(sbc2410等开发板)busybox-1.1.3 arm-linux-gcc-3.3.2 buxybox-1.7.3 arm-linux-gcc-3.4.1,经典参考:http:/下载busyboxhttp:/husaberg.toby-文件系统制作,移植基本过程:,1.到http:/解压busybox1.7.3 tar jxvf busybox-1.7.3.tar.bz23.make defconfig4.make menuconfig 在build options中选择Build busybox as a static binary,主要是C库的连接方式,安装目录等。5.m

9、ake,6.创建rootfs目录7.make install,配置可参考:(小寿制作)busybox-1.1.3制作根文件系统!http:/和1.5.1(根文件系统制作)http:/,文件系统的制作 luofuchong,http:/,可能会出现的错误:1.出现如下错误 CC miscutils/taskset.omiscutils/taskset.c:17:error:parse error before*tokenmiscutils/taskset.c:18:warning:function declaration isnt a prototypemiscutils/taskset.c:I

10、n function _from_cpuset:miscutils/taskset.c:22:error:CPU_SETSIZE undeclared(first use in this function)miscutils/taskset.c:22:error:(Each undeclared identifier is reported only oncemiscutils/taskset.c:22:error:for each function it appears in.)miscutils/taskset.c:26:warning:implicit declaration of fu

11、nction CPU_ISSETmiscutils/taskset.c:26:error:mask undeclared(first use in this function)miscutils/taskset.c:In function taskset_main:miscutils/taskset.c:47:error:cpu_set_t undeclared(first use in this function)miscutils/taskset.c:47:error:parse error before maskmiscutils/taskset.c:68:warning:implici

12、t declaration of function CPU_ZEROmiscutils/taskset.c:68:error:new_mask undeclared(first use in this function)miscutils/taskset.c:69:error:CPU_SETSIZE undeclared(first use in this function)miscutils/taskset.c:71:warning:implicit declaration of function CPU_SETmiscutils/taskset.c:78:error:mask undecl

13、ared(first use in this function)make1:*miscutils/taskset.o Error 1make:*miscutils Error 2,make menuconfig找到Miscellaneous Utilities,去掉task set,2.time.clibbb/time.c:20:error:CLOCK_MONOTONIC undeclared(first use in this function),make menuconfig 去掉Busybox Settings-Busybox Library Tuning-Use clock_getti

14、e(CLOCK_MONOTONIC)syscall,相关问题可参考:交叉编译busyboxhttp:/的编译过程http:/,建立rootfs目录,可以使用如下脚本文件:,#!/bin/bash,mkdir rootfs,cd rootfsmkdir bin dev etc lib proc sbin sys usr mnt tmp varchmod 1777 tmpmkdir usr/bin usr/lib usr/sbin lib/modulesmkdir var/lock var/lib var/log var/run var/tmpchmod 1777 var/tmpcd dev/mk

15、nod-m 666 console c 5 1 mknod-m 666 null c 1 3cd./注意:执行脚本时,要切换到root用户。,在内核目录执行:,$cd home/arm/linux-2.6.14.1/,$make modules$make modules_install INSTALL_MOD_PATH=/nfs/rootfs/,有关linuxrc、rcS 等文件的编写,可参考:用BusyBox制作根文件系统http:/2.6.22.1内核在s3c2410平台的移植(完美版)四:文件系统的制作 部分http:/,例如linuxrc内容如下:$vim rootfs/linuxrc

16、#!/bin/shecho Hello linux,ggggggexec/sbin/init然后修改权限:chmod 775 linuxrc,用密码登录可参考:用busybox制作嵌入式Linux的文件系统http:/login:启动busybox文件系统后怎么主动提示 用户登陆认证?在配置BusyBox时都加了getty,passwd,login等命令,也加入了文件groupshadowpasswd 但还是没有弹出界面,自己输入login后倒是提示你输入用户名和密码 内核启动后加载文件系统,busybox为1.1.3 挂载成功后就直接到 BusyBox v1.1.3(2007.12.13-0

17、6:5 Please press Enter to activate this console.怎么使启动文件系统立即需要用户验证?,编译工具的选择有两种方式:,ARM开发板:要使用交叉编译,所以我们要指定交叉编译工具的位置,可通过现面的方法实现:方法一:修改宿主机的PATH变量,使其包含交叉编译工具的目录;然后在调用make命令时,指定TARGET_ARCH和CROSS变量:make TARGET_ARCH=arm CROSS=arm-linux-。方法二:新版的busybox可以在配置中设定交叉编译工具的,直接运行make就跟为本机编译busybox没有任何区别了。http:/,动态编译方

18、式,准备链接库:,ARM微处理器与应用开发 赖于树 P248复制链接库的步骤:$cp/usr/local/arm/3.4.1/arm-linux/lib/$cp*-*.so$PRJROOT/rootfs/lib$cp-d*.so.*0-9$PRJROOT/rootfs/lib/$cp libSegFault.so libmemusage.so$PRJROOT/rootfs/lib/这些库文件中包含大量的调试信息,交叉编译工具链提供了一个除去这些调试信息的工具:strip$arm-linux-strip$PRJROOT/rootfs/lib/*.so,参考:基于s3c2440 yaffs2 文件

19、系统的移植http:/建立动态运行库#cp-rfd/usr/local/arm/4.0.3/arm-linux/lib/*rootfs/lib/拷贝经过交叉编译的库文件,参数-d,保持库文件的链接关系。#rm-rf rootfs/lib/*.a 删除所有的静态库文件。注:/usr/local/arm/4.0.3/为交叉编译工具链的存放目录。#arm-linux-strip rootfs/lib/*移除所有的符号信息,压缩库空间。,如果不知道需要哪些共享库,可以在你写好自己的程序后使用#ld hello 命令来看看需要哪些共享库然后在复制到/lib目录下面!,参考:http:/,http:/用b

20、usybox创建基于Linux2.6.24内核的nfs根文件系统,4查看共享了哪些库文件 用命令 arm-linux-readelf-a$program|grep shared library-rootlocalhost bin#pwd/root/maoyong/busybox-1.4.2/_install/bin,rootlocalhost bin#arm-linux-readelf-a busybox|grep shared library0 x00000001(needed)shared library:libcrypt.so.10 x00000001(needed)shared lib

21、rary:libm.so.60 x00000001(needed)shared library:libc.so.6-如上所示 要把/usr/local/arm/3.3.2/arm-linux/lib目录下的libcrypt.so.1 libm.so.6libc.so.6文件是busybox所需的共享库文件,要把它以及和他相关的链接文件拷贝到你新建的文件系统的 lib 目录。(注意:libcrypt.so.1 libm.so.6 libc.so.6相关的链接文件也要拷贝到lib目录),使用busybox-1.9.2制作根文件系统,制作嵌入式根文件系统常见问题详解,制作嵌入式根文件系统常见问题详解

22、,在介绍制作嵌入式根文件系统常见问题详解之前首先介绍点关于嵌入式根文件系统的背景知识,关于inittab的:init进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务,启动打印服务等。Solaris中init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。,下面具体说明嵌入式根文件系统inittab文件的格式。,inittab文件中每一记录都从新的一行开始,每个记录项最多可有51

23、2个字符,每一项的格式通常如下:id:rstate:action:process,下面分别解释。,1.id字段是最多4个字符的字符串,用来唯一标志表项。,2.rstate(run state)字段定义该记录项被调用时的运行级别,rstate可以由一个或多个运行级别构成,也可以是空,空则代表运行级别06。当请求init改变运行级别时,那些rstate字段中不包括新运行级别的进程将收到SIGTERM警告信号,并且最后被杀死;只有a、b、c启动的命令外(a、b、c不是真正的运行级别),3.action字段告诉init执行的动作,即如何处理process字段指定的进程,action字段允许的值及对应的

24、动作分别为:,1)respawn:如果process字段指定的进程不存在,则启动该进程,init不等待处理结束,而是继续扫描inittab文件中的后续进程,当这样的进程终止时,init会重新启动它,如果这样的进程已存在,则什么也不做。,2)wait:启动process字段指定的进程,并等到处理结束才去处理inittab中的下一记录项。,3)once:启动process字段指定的进程,不等待处理结束就去处理下一记录项。当这样的进程终止时,也不再重新启动它,在进入新的运行级别时,如果这样的进程仍在运行,init也不重新启动它。,4)boot:只有在系统启动时,init才处理这样的记录项,启动相应进

25、程,并不等待处理结束就去处理下一个记录项。当这样的进程终止时,系统也不重启它。,5)bootwait:系统启动后,当第一次从单用户模式进入多用户模式时处理这样的记录项,init启动这样的进程,并且等待它的处理结束,然后再进行下一个记录项的处理,当这样的进程终止时,系统也不重启它。,6)powe*il:当init接到断电的信号(SIGPWR)时,处理指定的进程。,7)powerwait:当init接到断电的信号(SIGPWR)时,处理指定的进程,并且等到处理结束才去检查其他的记录项。,8)off:如果指定的进程正在运行,init就给它发SIGTERM警告信号,在向它发出信号SIGKILL强制其结

26、束之前等待5秒,如果这样的进程不存在,则忽略这一项。,9)ondemand:功能通respawn,不同的是,与具体的运行级别无关,只用于rstate字段是a、b、c的那些记录项。,10)sysinit:指定的进程在访问控制台之前执行,这样的记录项仅用于对某些设备的初始化,目的是为了使init在这样的设备上向用户提问有关运行级别的问题,init需要等待进程运行结束后才继续。,11)initdefault:指定一个默认的运行级别,只有当init一开始被调用时才扫描这一项,如果rstate字段指定了多个运行级别,其中最大的数字是默认的运行级别,如果rstate字段是空的,init认为字段是01234

27、56,于是进入级别6,这样便陷入了一个循环,如果 inittab文件中没有包含initdefault的记录项,则在系统启动时请求用户为它指定一个初始运行级别,4.Process字段中进程可以是任意的守候进程、可执行脚本或程序。,另外:在任何时候,可以在文件inittab中添加新的记录项,级别Q/q不改变当前的运行级别,重新检查inittab文件,可以通过命令init Q或init q使init进程立即重新读取并处理文件inittab,以上这些都是介绍的标准的linux System V的标准,所以对嵌入式来讲有些东西并不见得有用!这里介绍点针对嵌入式的,也就是针对busybox init的:,

28、busybox的init,嵌入式根文件系统除了基本的命令之外,BusyBox还支持init功能,如同其它的init一样,busybox的init也是完成系统的初始化工作,关机前的工作等等,我们知道在Linux的内核被载入之后,机器就把控制权转交给内核,linux的内核启动之后,做了一些工作,然后找到根文件系统里面的init程序,并执行它,BusyBox的init进程会依次进行以下工作:(参考 p201),1.为init设置信号处理过程,2.初始化控制台,3.剖析/etc/inittab文件,4.执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcS,5.执行所有导致init暂停的

29、inittab命令(动作类型:wait),6.执行所有仅执行一次的inittab(动作类型:once),一旦完成以上工作,init进程便会循环执行以下进程:,1.执行所有终止时必须重新启动的inittab命令(动作类型:once),2.执行所有终止时必须重新启动但启动前必须询问用户的inittab命令(动作类型:askfirst),初始化控制台之后,BusyBox会检查/etc/inittab文件是否存在,如果此文件不存在,BusyBox会使用缺省的inittab配置,它主要为系统重引导,系统挂起以及init重启动设置缺省的动作,此外它还会为四个虚拟控制台(tty1到tty4)设置启动shel

30、l的动作。如果未建立这些设备文件,BusyBox会报错。,inittab文件中每一行的格式如下所示:(busybox的根目录下的example文件夹下有详尽的inittab文件范例),id:runlevel:action:process,尽管此格式与传统的Sytem V init类似,但是,id在BusyBox的init中具有不同的意义。对BusyBox而言,id用来指定启动进程的控制tty。如果所启动的进程并不是可以交互的shell,例如BusyBox的sh(ash),应该会有个控制tty,如果控制tty不存在,Busybox的sh会报错。BusyBox将会完全忽略runlevel字段,所以

31、空着它就行了,你也许会问既然没用保留着它干吗,我想大概是为了和传统的Sytem V init保持一致的格式吧。process字段用来指定所执行程式的路径,包括命令行选项。action字段用来指定下面表中8个可应用到process的动作之一。,sysinit:为init提供初始化命令行的路径 respawn:每当相应的进程终止执行便会重新启动,askfirst:类似respawn,不过它的主要用途是减少系统上执行的终端应用程序的数量。它将会促使init在控制台上显示“Please press Enter to active this console”的信息,并在重新启动之前等待用户按下enter

32、键,wait:告诉init必须等到相应的进程完成之后才能继续执行,once:仅执行相应的进程一次,而且不会等待它完成,ctratldel:当按下Ctrl+Alt+Delete组合键时,执行相应的进程,shutdown:当系统关机时,执行相应的进程,restart:当init重新启动时,执行相应的进程,通常此处所执行的进程就是init本身,以下是我的usblinux的inittab文件,:sysinit:/etc/init.d/rcS,:respawn:/sbin/getty 115200 tty1,tty2:askfirst:-/bin/sh,tty3:askfirst:-/bin/sh,:r

33、estart:/sbin/init,:ctrlaltdel:/bin/umount-a-r,这个inittab执行下列动作,1.将/etc/init.d/rcS设置成系统的初始化文件,2.在115200 bps的虚拟终端tty1上启动一个登陆会话(注意getty的用法),3.在虚拟终端tty2和tty3上启动askfirst动作的shell,4.如果init重新启动,将/sbin/init设置成它会执行的程序,5.告诉init,在系统关机的时候执行umount命令卸载所有文件系统,并且在卸载失败时用只读模式冲新安装以保护文件系统。,1、busybox的inittab与pc使用的inittab不

34、同,第一ID并不是随便取名字的,这个名字要与/dev/目录下是否有对应的文件对应,对应错误,cant open/dev/0:No such file or directory,process-/bin/sh(pid 789)exited.Scheduling for restart.,cant open/dev/0:No such file or directory,process-/bin/sh(pid 793)exited.Scheduling for restart.,2、出现下面这种错误:,process-/bin/sh(pid 789)exited.Scheduling for re

35、start.,process-/bin/sh(pid 794)exited.Scheduling for restart.,process-/bin/sh(pid 796)exited.Scheduling for restart.,process-/bin/sh(pid 798)exited.Scheduling for restart.,对应的inittab文件中有,ttyS0:askfirst:-/bin/sh,虽然在/dev/目录下有ttyS0设备,但是这个设备显然不可用,所以才会出现上面的错误,3、当在inittab中同时定义的两个在同一个串口终端登陆的语句时,:askfirst:-

36、/bin/sh,s3c2410_serial0:23456:respawn:/sbin/getty-L s3c2410_serial0 115200 vt100,出现的情况就是被抢占,不能接收任何串口输入,4、bad inittab entry,多半时因为非法字符造成的。,5、busybox中的字段runleve也没有运行时的运行级别的概念,6、分析一下启动的过程,1.为init设置信号处理过程,2.初始化控制台,3.剖析/etc/inittab文件,4.执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcS,5.执行所有导致init暂停的inittab命令(动作类型:wait)

37、,6.执行所有仅执行一次的inittab(动作类型:once),一旦完成以上工作,init进程便会循环执行以下进程:,1.执行所有终止时必须重新启动的inittab命令(动作类型:once),2.执行所有终止时必须重新启动但启动前必须询问用户的inittab命令(动作类型:askfirst),初始化控制台之后,BusyBox会检查/etc/inittab文件是否存在,如果此文件不存在,BusyBox会使用缺省的inittab配置,它主要为系统重引导,系统挂起以及init重启动设置缺省的动作,此外它还会为四个虚拟控制台(tty1到tty4)设置启动shell的动作。如果未建立这些设备文件,Bus

38、yBox会报错。7、网上有人问“-”的作用,我很纳闷:,:respawn:-/bin/sh,这个-是干什么的,为什么有的时候有有的时候没有?,还有啊,我从网上看到一个例程,如下,节选:,:respawn:-/bin/sh,tty2:askfirst:-/bin/sh,我搞不清两个的区别,这样控制台就启动了,是第一句启动的还是第二句,那我内核启动参数里面的console=ttyS0会自动来找这个控制台?,原帖由 wavezone 于 2008-8-22 16:34 发表,我很纳闷:,:respawn:-/bin/sh,这个-是干什么的,为什么有的时候有有的时候没有?,还有啊,我从网上看到一个例程

39、,如下,节选:,:respawn:-/bin/sh,tty2:askfirst:-/bin/sh,我搞不清两个的区别.,测试的时候是这样的,加上”-”的语句会在登陆终端之后调用/etc/目录下的profile文件,而不加”-”的不会执行这个脚本。,其实登陆终端的命令有几种方便,但是标准的还是使用getty来登陆,但是直接使用如上的语句也是可以的,并且兼容性强一点,因为它不需要指定对应的串口设备。,:askfirst:-/bin/sh,s3c2410_serial0:askfirst:-/bin/sh,:askfirst:-/bin/sh,s3c2410_serial0:23456:respaw

40、n:/sbin/getty-L s3c2410_serial0 115200 vt100,都是可用的。,8./bin/sh:*not found,arm-linux-readelf-d*,查看你的以用程序依赖哪些库,一般是因为缺少libc.so.6造成的,实际还是根文件系统的问题,没有将常用的库文件拷贝到/lib目录下,常用的库:,rootcentos libcp/usr/local/arm/3.4.1/arm-linux/lib/ld*.,rootcentos libcp/usr/local/arm/3.4.1/arm-linux/lib/libc-2.3.2.so.,rootcentos

41、libcp/usr/local/arm/3.4.1/arm-linux/lib/libc.so.6.,rootcentos libcp/usr/local/arm/3.4.1/arm-linux/lib/libm*.,rootcentos libcp/usr/local/arm/3.4.1/arm-linux/lib/libcrypt*.,9、错误insmod:chdir(2.6.26.6):No such file or directory,网上有人提出这种解决方法:,需要注意的是insmod等模块加载命令需要从lib/modules/2.6.26.6,的目录下加载模块,所以必须先建立此目录

42、,然后将模块放到此目录下面,否则将出现以下两种情况:,一是没有建立lib/modules/2.6.26.6目录,取决于内核版本号,将出现insmod:chdir(2.6.26.6):No such file or directory的错误,二是只将模块简单地放在根目录或其它文件夹,没有将其拷贝到指定的lib/modules/2.6.26.6目录,将出现,insmod:module gpio_driver not found错误,不过这种方法不是很奏效,根本原因是insmod的问题,在busybox编译的时候参考下面的选项,不要使用,Linux Module Utilities-,Simplif

43、ied modutils,/该选项不要选择,*Support version 2.6.x Linux kernels,/此选项选上,参考如下:,10、不能执行”-h”命令,在执行*h时没有任何反应。是在lib目录下缺少常见的库文件,制作嵌入式根文件系统常见问题详解,嵌入式根文件系统的移植和制作(二),2.基于RAM的文件系统(1)Ramdisk Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性

44、能。在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。,(2)ramfs/tmpfs Ramfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Fl

45、ash存储器的读写损耗,也提高了数据读写速度。Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。,3.网络文件系统NFS(Network File System)NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。以上讨论的都是基于存储设备的文件系统(memory-based file system)

46、,它们都可用作Linux的根文件系统。实际上,Linux还支持逻辑的或伪文件系统(logical or pseudo file system),例如procfs(proc文件系统),用于获取系统信息,以及devfs(设备文件系统)和sysfs,用于维护设备文件。,我们要移植的开发板的存储设备为Nandflash,我们可以用应用比较广泛的cramfs文件系统。,二移植准备,1.目标板,我们还是使用之前移植过程一直使用的开发板参数请参考上文的地址:http:/,2.软件准备,(1)Busybox,Busybox被形象的称为嵌入式linux系统中的瑞士军刀,可以从这个称呼中看到busybox是一个集

47、多种功能于一身的东西,它将许多常用的UNIX命令和工具结合到了一个单独的可执行程序中。虽然与相应的GNU工具比较起来,busybox所提供的功能和参数略少,但在比较小的系统(例如启动盘)或者嵌入式系统中,已经足够了。,Busybox在设计上就充分考虑了硬件资源受限的特殊工作环境。它采用一种很巧妙的办法减少自己的体积:所有的命令都通过“插件”的方式集中到一个可执行文件中,在实际应用过程中通过不同的符号链接来确定到底要执行哪个操作。例如最终生成的可执行文件为busybox,当为它建立一个符号链接ls的时候,就可以通过执行这个新命令实现列目录的功能。采用单一执行文件的方式最大限度地共享了程序代码,甚

48、至连文件头、内存中的程序控制块等其他操作系统资源都共享了,对于资源比较紧张的系统来说,真是最合适不过了。,在busybox的编译过程中,可以非常方便地加减它的“插件”,最后的符号链接也可以由编译系统自动生成。,编译busybox,Busybox的编译过程与内核的编译过程很接近都是先make menuconfig进行配置,然后在make进行编译。,【1】从http:/,【2】解压busybox-1.13.4.tar.bz2使用命令,tar jxvf busybox-1.13.4.tar.bz2,【3】进入busybox目录,修改Makefile 在164行 CROSS_COMPILE=arm-l

49、inux-,【4】Make menuconfig进行配置,可以选择静态编译,如果是动态编译的话要拷贝相应的库文件,默认配置保存即可。,【5】make all install,这是会在busybox目录下生成_install文件夹。,(2)文件系统打包工具,【1】从http:/,【2】解压cramfs-1.1.tar.gz使用命令:tar zxvf cramfs-1.1.tar.gz,【3】进入cramfs工具的根目录执行make。,【4】Make后在cramfs工具的根目录中就会生成一个mkcramfs文件,这个就是我们需要的工具。,三制作过程,1.建立根文件系统目录,就是之前busybox生

50、成的_install目录 cd/_install,2.创建各种必要的系统文件目录。,mkdir dev lib tmp proc 3.创建设备文件。,cd dev mknod fb0 c 29 0 建立framebuffer设备文件mknod ts0 c 13 128 建立触摸屏设备文件mknod console c 5 1 mknod tty0 c 4 0 mknod tty1 c 4 1mknod tty2 c 4 2 mknod tty3 c 4 3mknod tty4 c 4 4,4.添加必要的库文件,由于之前没有选择静态编译busybox,这里要拷贝相应的库文件,cd libcp a

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号