根文件系统制作Word下载.docx
- 文档编号:21123992
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:21
- 大小:354.39KB
根文件系统制作Word下载.docx
《根文件系统制作Word下载.docx》由会员分享,可在线阅读,更多相关《根文件系统制作Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
●基本程序运行所需的动态库。
●基本的系统配置文件。
●必要的设备文件支持。
●基本的应用程序,如sh、ls、cp等。
.proc,sys,tmp是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到目录树中.如在/etc/init.d/rcS中加入下面一句:
/bin/mount–a
Mountallfilesystems(ofthegiventypes)mentionedinfstab.
“mount-a”命令后将挂载proc,tmpfs等包含在该文件中的所有的文件系统。
/ect/fstab的内容如下:
proc/procprocdefaults00加载proc文件系统
none/tmpramfsdefaults00
sysfs/syssysfsdefaults00
则已经挂载的设备可以通过命令查询#lsmod
所挂载的设备的设备号可查询#cat/proc/devices
/proc是虚拟文件系统。
Linux内核提供了一种通过/proc文件系统在运行时访问内核内部数据结构、改变内核设置的机制和接口。
proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间,/proc文件系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做/proc)。
这个伪文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息
构建根文件系统就是往相应的目录添加相应的文件。
如:
●在/dev添加设备文件,
●在/etc添加配置文件,
●在/bin添加命令或者程序,
●在/lib添加动态库等。
添加设备文件
Linux对所有外部设备的访问都是以文件的形式来进行;
在Linux系统中,可以找到设备对应的文件,称为设备文件;
设备文件(也叫做设备节点)都存放在/dev的目录下
♦在/dev目录下,建立设备文件的命令是mknod;
mknod/dev/ledc2310
上面例子中“/dev/led”是设备文件路径;
“c”是指定为字符设备;
“231”是主设备号(insmoda.ko后在/proc/devices下查看);
“0”是次设备号。
♦Linux系统是靠主、次设备号来联系驱动程序和设备文件的;
(Keykey.ckey.ko—模块insmodkey.ko主设备号160)
从名字上直接理解,Busybox是一个“繁忙的盒子”,其实,Busybox可以理解为一个Linux的命令集合,我们在进行Linux操作时所需要的常用命令,都可以在Busybox里找到,但Busybox又不是简单的将所有的命令集合在一起,它采用了一种非常巧妙的方式,即“使用一个程序完成所有的事”。
平时我们用ls、vi等命令,都要用到glibc的相关调用,所以如果每个命令都静态链接这些调用,每个命令都会很大,因此在通常的发行版中,都会动态链接glibc,可是glibc的动态库本身就很大,这在PC+Linux平时上还可以接受,但在嵌入式系统中,这就太大了,而且又不是所有的库函数都使用。
一般采用两种解决办法,一种是裁剪glibc,另一种就是Busybox的办法,即把ls、vi等程序的main函数改一下名,全部链接在一起,然后静态链接glibc,这样,只有需要的调用才会链接进来,整个Busybox程序可能都比glibc的动态库小。
因此,Busybox的工作原理是根据文件名来决定用户想调用的是那个程序,例如,如果你的busybox程序的文件名是ls,运行的就是ls,是vi,就运行vi。
下面介绍一下ARM-Linux平台的Busybox-1.00交叉编译与使用步骤:
将文件busybox-1.00.tar.gz拷贝到Linux目录,执行如下命令解压文件:
#tarxzvfAT91RM9200-busybox-1.00.tar.gz
当文件解压完成以后,会自动生成busybox-1.00目录,进入该目录,并执行如下命令进行编译:
#makeclean;
清除旧的编译文件
#makemenuconfig在这里修改一些必要的选项
#makeARCH=armCROSS_COMPILE=arm-linux-CONFIG_PREFIX=/root/build_rootfs/rootfsallinstall
busybox是一个集成了一百多个最常用linux命令和工具的软件,它甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分力式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用。
Busybox提供的程序包括:
●具有shell功能,如csh
●提供一个迷你的vi编辑器
●提供系统不可或缺的/sbin/init程序
●其他的系统基本命令,如:
ls,mkdir,ifconfig等。
BusyBox编译选项
make目标
说明
help
显示make选项的完整列表
defconfig
启用默认的(通用)配置
allnoconfig
禁用所有的应用程序(空配置)
allyesconfig
启用所有的应用程序(完整配置)
allbareconfig
启用所有的应用程序,但是不包括子特性
config
基于文本的配置工具
menuconfig
N-curses(基于菜单的)配置工具
all
编译BusyBox二进制文件和文档(./docs)
busybox
编译BusyBox二进制文件
clean
清除源代码树
distclean
彻底清除源代码树
sizes
显示所启用的应用程序的文本/数据大小
1、建立工作目录(这里建议统一用这个路径,否则在指定安装路径及copy库文件的路径都要改)
设定工作目录为/root/build_rootfs/,下载busybox到该目录
mkdir/root/build_rootfs
2、建立根目录,该目录就是我们要移植到目标板上的目录,对于嵌入式的文件系统,根目录下必要的目录包括bin,dev,etc,usr,lib,sbin,procsystmp
。
cd/root/build_rootfs
mkdirrootfs
cdrootfs
mkdirbindevetcusrlibsbinprocsystmp
mkdirusr/binusr/sbinusr/lib
/binbin是Binary的缩写。
这个目录存放着最经常使用的命令。
/sbins就是SuperUser的意思,这里存放的是系统管理员使用的系统管理程序。
/devdev是Device(设备)的缩写。
该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
/etc这个目录用来存放所有的系统管理所需要的配置文件和子目录。
/usr我们要用到的很多应用程序和文件几乎都存放在usr目录下
/usr/bin存放着许多应用程序;
/usr/sbin存放root超级用户使用的管理程序;
/usr/lib存放一些常用的动态链接共享库和静态档案库;
/lib这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的DLL文件。
几乎所有的应用程序都需要用到这些共享库。
/proc这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
/proc是系统运行时进程和内核的信息存在这里,它属于伪文件系统,存在于内存中。
/tmp用于用户程序运行时产生的临时文件。
/sys内核所支持的sysfs文件系统。
Sysfs把系统上的设备和总线组织成一个分级的文件,以被用户空间存取。
3、交叉编译busybox
busybox的源码可以从
我们在配置busybox的时候是基于默认配置之上来配置的;
先makedefconfig就是把busybox配置成默认,然后再makemenuconfig来配置busybox。
说明:
我们在配置一个源代码包之前,可以先阅读源码包目录下的README和INSTALL文件以及Makefile的注释部分,也可以到网站以获取帮助。
HowdoIconfigurebusybox?
有介绍怎么去配置。
(1)、在/root/build_rootfs解压
tar-xvfbusybox-1.13.3.tgz
tarxvzfmkyaffs2image.tgz-C/
cdbusybox-1.13.3
(2)、添加交叉工具链
exportPATH=/usr/local/arm/4.3.2/bin:
$PATH
(3)、配置编译
makedefconfig
makemenuconfig
配置时,我们基于默认配置,再配置它为静态编译,安装时不要/usr路径,把MiscellaneousUtilities下的“taskset”选项去掉,不然会出错。
如下(按Y就会选上,N不选):
手工配置
如果您正在构建一个具有特殊需求的嵌入式设备,那就可以手工使用menuconfigmake目标来配置BusyBox的内容。
如果您熟悉Linux内核的编译过程,就会注意到menuconfig与配置Linux内核的内容所使用的目标相同。
实际上,它们都采用了相同的基于ncurses的应用程序。
使用手工配置,我们可以指定在最终的BusyBox映像中包含的命令。
我们也可以对BusyBox环境进行配置,例如包括对NSA(美国国家安全代理)的安全增强Linux(SELinux),指定要使用的编译器(用来在嵌入式环境中进行交叉编译)以及BusyBox应该静态编译还是动态编译。
图1给出了menuconfig的主界面。
在这里我们应该可以看到可以为BusyBox配置的不同类型的应用程序(applet)。
Busyboxsetting
->
buildsoptions
->
[*]buildbusyboxasastaticbinary(a)
installitationoptions
[*]don’tuse/usr(b)
MiscellaneousUtilities―>
(c)
[]taskset
其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了。
保存退出。
(a)这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作。
(b)这个选项也一定要选,否则makeinstall后,busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,makeinstall后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接.
(c)
Taskset命令能够为即将执行的程式或已有进程指定affinity属性,让该程式或进程运行在指定的CPU上。
下面是几个例子:
taskset?
c1nohupperlpi.pl&
---指定在1号CPU上执行指定的perl程式
c1?
P10284
---将10284号进程限定在1号CPU上执行
4、编译安装
makeARCH=armCROSS_COMPILE=arm-linux-CONFIG_PREFIX=/root/build_rootfs/rootfsallinstall
(此时bin(195个290M)sbin(58个86.4M---windows下看的结果)已安装了文件,其实是busybox的可执行文件和指向它的链接。
不同的链接名完成不同的功能,命令行调用作为一个参数传给busybox,即可完成相应的功能,即于BusyBox中包含的每个工具来说,都会创建一个符号链接,这样就可以使用这些符号链接来调用BusyBox了。
BusyBox然后可以通过argv[0]来调用内部工具)
ARCH指定平台
CROSS_COMPILE指定交叉编译
CONFIG_PRRFIX指定安装的路径
5、copyC库
cp/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*-a/root/build_rootfs/rootfs/lib/
交叉应用程序的开发需要用到交叉编译的链接库,交叉编译的链接库是在交叉工具链的lib目录下;
我们在移植应用程序到我们的目标板的时候,需要把交叉编译的链接库也一起移植到目标板上,这里我们用到的交叉工具链的路径是/usr/local/arm/3.3.2/,所以链接库的目录是/usr/local/arm/3.3.2/lib(本来跟目标板相关的目录是/usr/local/arm/3.3.2/arm-linux,因此要拷贝的链接库应该在/usr/local/arm/3.3.2/arm-linux/lib下,但是此目录的很多链接都是链接到/usr/local/arm/3.3.2/lib目录下的库文件,所以我们从/usr/local/arm/3.3.2/lib目录拷贝库),此目录下有四种类型的文件(其实就2种:
.so动态库.a静态库):
(1).so动态库
A、实际的共享链接库(libname-version.so)
如:
libc-2.3.2.so
B、主修订版本的符号链接.(lib.so.version)
程序一旦链接了特定的链接库,它将会使用其符号链接,程序启动时,加载器在加载程序之前,会加载该文件。
如:
libc.so.6
C、与版本无关的符号链接(libname.so)
这些符号链接的只要功能是为需要链接特定的链接库的所有程序提供一个通用的条目,与版本号无关。
libc.so
(2).a静态库
静态链接库包文件
libc.a
6、建立配置文件
内核启动的最后,会执行sbin/init程序,init程序在启动的最后会执行/bin/sh,sh在启动的时候会读取文件。
(1)在/etc/profile文件里设定PATH,LD_RARYLIB_PATH环境变量,目的是配置用户程序运行的环境。
cd/root/build_rootfs/rootfs/etc
viprofile
内容如下
#!
/bin/sh
echo"
Setseaechlibraryin/etc/profile"
exportLD_LIBRARY_PATH=/lib#定义查找可用共享对象的位置//usr/lib
Setuserpathin/etc/profile"
exportPATH=/bin:
/sbin:
/usr/bin#命令的路径
#exportPS1=[root@mini2440\\\W]\\$当有自动补齐功能时使用这个
exportPS1=[root@mini2440]\#//命令行提示符
保存退出
(2)创建inittab文件,内容如下每一条目用来定义一个子进程,并确定它的启动方法(该文件的):
:
sysinit:
/etc/init.d/rcS
respawn:
-/bin/sh(注意:
“-”要加上。
)
ctrlaltdel:
/bin/umount-a-r
(3)创建/etc/init.d/rcS文件,内容如下(rcS是个可执行的脚步文件,是系统启动之后先执行的命令):
/bin/sh
/bin/mount-a//“mount-a”命令后将挂载proc,tmpfs等包含在该文件中的所有的文件系统。
//下面三行是配置增加热插拔支持
/bin/mount-ttmpfsmdev/dev///设置dev目录被用作一个tmpfs文件系统的挂载点,该文件系统是由mdev填充的。
这样在/dev目录下就可以看到内核已经挂载的驱动的节点。
/bin/echo/sbin/mdev>
/proc/sys/kernel/hotplug//2)设置内核的hotplughandler为mdev,即当设备热插拔时,由mdev接收来自内核的消息并作出相应的回应,比如挂载U盘。
当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev。
这时mdev通过环境变量中的ACTION和DEVPATH,(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys中的那个目录。
接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev下创建设备节点文件。
mdev–s//mdev主要是实现对移动设备的动态挂载在/dev目录下建立必要的设备节点mdev扫描/sys/class和/sys/block中所有的类设备
目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点文件。
(4)在/etc/目录下添加文件fstab,内容如下(该文件定义了文件系统的静态信息):
proc/procprocdefaults00
none/tmpramfsdefaults00
sysfs/syssysfsdefaults00
其中/proc是系统运行时进程和内核的信息存在这里,它属于伪文件系统,存在于内存中。
/tmp用于用户程序运行时产生的临时文件。
/sys内核所支持的sysfs文件系统。
7、构建/dev目录:
cd/root/build_rootfs/rootfs/
mknoddev/consolec51//建立控制台和终端的节点
mknoddev/nullc13
mknoddev/tty1c41
mknoddev/tty2c42
mknoddev/tty3c43
mknoddev/tty4c44
8、添加一个用户程序
进入工作目录
cd/root/build_rootfs/
编辑源文件
vihello.c
#include<
stdio.h>
main()
{
printf(“hellosu\n”);
}
交叉编译
arm-linux-gcchello.c–ohello
复制到目标板的根目录
mvhello/root/build_rootfs/rootfs/usr/bin
9、制作yaffs2映像
找到mkcramfs工具,把它复制到“/root/build_rootfs”目录下。
mkyaffs2image-128Mrootfsrootfs.yaffs2
rootfs.yaffs2就是我们要烧写到目标板的映像文件
10、烧写rootfs.yaffs2到3分区,启动开发板,运行hello程序。
tftp30008000rootfs.yaffs2
nanderase56000040000000
nandwrite.yaffs30008000560000615300(下载完提示下载了多大就多大,是16进制)
setbootargs'
noinitrdroot=/dev/mtdblock3rootfstype=yaffs2rwconsole=ttySAC0,115200init=/linuxrcmem=64M'
saveenv
Inittab文件中每一行的格式如下:
id:
runlevel:
action:
process
其中:
Id:
用来指定所启动进程的控制台,是指入口标识符,它是一个字符串,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
在嵌入式系统中一般不添加;
Runlevel:
是init所处于的运行级别的标识,一般使用0-6以及S或s。
0、1、6运行级别被系统保留:
其中0作为shutdown动作,1作为重启至单用户模式,6为重启;
S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现,实际上,进入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。
在一般的系统实现中,都使用了2、3、4、5几个级别,在Redhat系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件系统 制作