第三部分 linux busybox最小文件系统的移植


原文地址:http://blog.csdn.net/woshidahuaidan2011/article/details/51693525


1、源码包下载

首先要说明移植文件系统无非就是添加一些文件夹(有的需要加入一些配置文件)而已,这里是利用Busybox( http://www.busybox.net/downloads/ )创建/bin 和/sbin等目录的文件。

至于以上两种名字的含义,google很详细了。

言归正传,正式开始。

首先下载完成后将这两个压缩包可以用cuteftprro工具拷贝到linux文件夹下,

然后解压,tar –xvf busybox-1.23.2.tar.bz2

本版本的busybox是1.23.2本版本的所支持的内核、gcc、使用方法等的版本信息在加压后的busybox-1.23.2的文件夹下readme有详细的介绍,建议在进行下面配置前能浏览一下。

1、busybox菜单配置及其编译

进入busybox-1.23.1文件后执行make menuconfig进入菜单配置选项。如图。


最上面写的操作使用说明。

在这里我在linux sysytem utilities -à 选择了(根据自身要求设置,选择后会出现错误,至于是否编译出错,跟具体的gcc版本有关系)



这两个默认未选择的选项。

这就算配置完成。打开后,假如内核默认选择,请去掉选择(去掉前面的“*“)否则可能出现错误信息。

接下来就要稍微修改一下makefile文件了,在 busybox-1.22.1下用vi Makefile 设置结构和交叉编译。

内容是如下:

ARCH?=arm       //大概  191

CROSS_COMPILE ?=arm-linux-2440-          //156 名字因人而异,根据实际修改前缀

完成后保存退出,执行make。然后就是稍微漫长的等待。

 

说明,由于使用的交叉编译工具链的版本不同,有些版本可能会出现编译错误

假如使用的是gcc的版本是4.9.1可能会出现如下的错误(假如没有出错,直接跳过洗面的错误提示与改正):

 

然后可能提示错误:

networking/inetd.c:178:22: fatal error:rpc/rpc.h: No such file or directory

 # include<rpc/rpc.h>

compilation terminated.

make[1]: *** [networking/inetd.o] 错误 1

make: *** [networking] 错误 2

由于使用交叉编译器编写的,其收索路径是在交叉编译器的安装目录内。我的交叉编译器是用crosstool-ng制作的,因此其搜索的路径为在交叉编译器的安装的目录下:

参考 :http://blog.csdn.net/caspiansea/article/details/21581043

/work/tools/crosstool/arm-jason-linux-gnueabi/sysroot/usr/include/在这里确实没有 rpc/rpc.h但是在系统的/usr/include/的目录下存在,于是将该文件夹拷贝到arm-jason-linux-gnueabi/sysroot/usr/include/,然后执行:

sudo cp -r /usr/linclude/rpc /work/tools/crosstool/arm-jason-linux-gnueabi/sysroot/usr/include/

这里最好修改一下用户组参考:http://www.cnblogs.com/jdonson/archive/2011/04/28/2031878.html

sudo chown +r  jasonwork/tools/crosstool/arm-jason-linux-gnueabi/sysroot/usr/include/rpc/*

拷贝完继续make

networking/lib.a(inetd.o): In function`unregister_rpc':

inetd.c:(.text.unregister_rpc+0x20):undefined reference to `pmap_unset'

networking/lib.a(inetd.o): In function`register_rpc':

inetd.c:(.text.register_rpc+0x50):undefined reference to `pmap_unset'

inetd.c:(.text.register_rpc+0x74):undefined reference to `pmap_set'

collect2: error: ld returned 1 exit status

这里好像由于glibc版本过高有关,找不到相关函数,make menuconfig 去掉如下选项。感兴趣的可以换下glibc版本然后再次尝试。

Networking Utilities  —>[ ] inetd (Internet 超级服务器 )

去掉以后有什么影响等后面遇到在解决。

继续make就编译成功了,何为编译成功,linux因为此处无声胜有声,不提示错误就是正确的。成功后就开始安装了。

 

 

总结:所有的这些错误都是因为include没有打开的原因,遇见其他类似的错误,解决方案也是不尽雷同,解决方法总结起来两种:

1将对应的文件或者定义放到里面:

2,将对应文件复制到编译出错的文件的同一个文件夹下,修改include路径

3、Busybox的安装及其网络文件系统挂载

在readme里有使用说明如下所示:

The build automatically generates a file "busybox.links",which is used by 'make install' to create symlinks to the BusyBox binary forall compiled in commands.  This uses theCONFIG_PREFIX environment variable to specify where to install, and installshardlinks or symlinks depending on the configuration preferences.  (You can also manually run the install scriptat "applets/install.sh").

在这里使用make installCONFIG_PREFIX=/work/root

这里需注意,在执行此命令的时候需要在busybox-1.22.1目录下执行不然可能会提示:

make: *** No rule to make target `install'.  Stop.

最后会有如下目录和文件生成:


目前位置,busybox安装完毕,可以利用busybox制作文件系统了,但是在制作之前,还需要了解两个概念------动态库和加载器。

加载器英语Loader(本版本的加载器为ld-x.x.x.so和ld-linux.so.2),又译为加载器、加载程序,是操作系统一部份,负责程序的加载。:加载器(它是程序运行中不可或缺的一个步骤,加载器会将程序置放在存储器中,让它开始运行。加载程序的步骤包括,读取可执行文件,将可执行文件的内容写入存储器中,之后开展其他所需的准备工作,准备让可执行文件运行。当加载完成之后,操作系统会将控制权交给加载的代码,让它开始运作;何为动态库:这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。 linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib;那么与之对应的有个静态库:这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

我们的busybosx安装的知识一盒shell解析命令,因此我们需要将一些动态库和加载器(在我们的交叉编译工具链中)拷贝到即将要制作的文件系统之中:

首先我们要做的实在Busybox的安装的目录下/home/book/mywork/files/first_fsroot建立一个lib文件夹

mkdir -p /work/root/lib然后将交叉编译工具链安装目录下的/arm-class-linux-gnueabi/lib的*so.*的文件复制到/home/book/mywork/files/first_fsroot/lib这个里面

cp -p   安装目录/arm-class-linux-gnueabi/lib/*so.*  work/root/lib

(-p保持元件原有属性)

4、建立文件体统相关文件

进入ubuntu的根目录,可以看到ubuntu的文件系统,执行ls可以看到:


实际上他们每个文件都有一些特殊性的用途,那么我们要制作一个文件系统也需要他们之中的必要文件夹或者文件,接下来我们将手动的去创建这些文件夹或者文件。

这里进入busybox的安装后的目录,也就是上面刚才make install CONFIG_PREFIX= /work/root指定的目录,进入/work/root

建立etc目录

/etc放置的是一些配置文件,其不同的子文件夹下是对于不同功能的配置功能。至于每个子文件的建立,书本上网上也有相应的介绍。例如http://www.jb51.net/article/15800.htm  。

建立etc/inittab文件(文件系统初始的配置文件,每次进入文件系统时读取该文件,执行该文件所规定的命令)

这里只需要在win系统下打开busybox的源码包里的example/inittab的文件复制出来修改一下就可以

在busybox的安装目录下新建etc目录

mkdir etc

cd etc/

vi inittab

修改内容为可为:

# /etc/inittab  

::sysinit:/etc/init.d/rcS

::askfirst:-/bin/sh

# Stuff to do before rebooting

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

 

其中,第一句的意思是: 启动系统初始化文件/etc/init.d/rcS。字段sysinit表明文件/etc/init.d/rcS在系统启动后最先执行,并且只执行一次,init进程等待它结束才继续执行其它动作。(脚本文件名一般为rc,后缀S代表单用户运行级别脚本具体级别下文做出说明);第二句:在串口上启动askfirst动作的shell。需要注意的是。askfirst表明init进程先输出“Please press Enter to actvie this console”,等用户输入回车键之后才启动-/bin/sh;第三句:  当按下Ctrl+Alt+Delete组合键时,init重启执行程序。字段ctrlaltdel表明当按下Ctrl+Alt+Delete组合键时,执行相应的进程;第四句:告诉init在关机时运行umount命令卸载所有的文件系统,如果卸载失败,试图以只读方式重新挂载。字段shutdown表明在重启关闭系统命令时执行相应进程。

/etc/inittab 文件中每个条目用来定义一个子进程,并确定它的启动方法,具体说明在busybox-1.22.1/examples/inittab中有介绍。格式如下 

  <id>:<runlevels>:<action>:<process>

<id>:前面会自动加上/etc/即为/etc/id表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省略,则使用与进程一样的控制台。
<runlevels>:对于Busybox init程序,可以省略。
<action>:表示init程序如何控制这个子进程,
<process>: 要执行的程序,它可以是可执行程序,也可以是脚本

 

刚才提到的运行级别这里说明一下:

在Debian Linux中,下列路径对应不同的运行级别。当系统启动时,通过其中的脚本文件来启动相应的服务。

/etc/rc0.d Run level 0运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

/etc/rc1.d Run level 1运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
/etc/rc2.d Run level 2运行级别2:多用户状态(没有NFS)
/etc/rc3.d Run level 3运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
/etc/rc4.d Run level 4运行级别4:系统未使用,保留
/etc/rc5.d Run level 5运行级别5:X11控制台,登陆后进入图形GUI模式
/etc/rc6.d Run level 6运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

比如上面说的rcS,其中的“S“代表拥有所有级别权限。

可以参考:http://blog.chinaunix.net/uid-22746363-id-383989.html

 

 

建立etc/init.d/rcS文件

同样的参考busybox的源码包里的examples/bootfloppy/etc/init.d/rcS文件

在etc/目录下执行

mkdir init.d

cd init.d

vi rcS

内容定义为:

#!/bin/sh

mount –a

mkdir /dev/pts

mount -t devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

#! /bin/sh   #用busybox的shell

mount -a           #将文件 /etc/fstab 中指明的文件挂载到对应的挂载点上

mkdir /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug    #当有热插拔事件产生时, 内核就会调用位于/sbin目录的 mdev。 这时 mdev通过环境变量中的 ACTION 和 DEVPATH,(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为 这个设备在/dev 下创建设备节点文件。

mdev -s    #建立dev目录。以‘-s’为参数调用位于/sbin 目录写的 mdev(其实是个链接,作用是传递参数给/bin目录下的busybox 程序并调用它) ,mdev扫描 /sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则 mdev 就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次  “mdev -s” 。

 

然后修改rcS的属性:

chmod +x etc/init.d/rcS (加上可执行属性)

第一行指明该文件为脚本文件;第二行用于挂接/etc/fastab的文件系统;

 

建立dev设备文件

建立dev设备文件有两种方案,其一是使用较为原始的静态建立设备文件,其二使用mdev建立设备文件,这里使用的是第二种方案。

mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是较优的选择。

medv的使用方法在doc/medv.txt上有说明。

此时,可以建立etc/fstab

在etc/目录下执行

vi fstab

内容如下

# device      mount-point      type     options    dump   fsck order

proc                  /proc             proc          defaults     0        0

tmpfs        /tmp              tmpfs   defaults    0      0

sysfs              /sys             sysfs     defaults     0        0

tmpfs        /dev              tmpfs   defaults    0      0

这个文件是用来自动挂载文件系统的,至于它的含义可以参考

文件fstab包含了你的电脑上的存储设备及其文件系统的信息。它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件。

具体来说:用fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等。对于Windows与arch双操作系统用户,用fstab挂载FAT格式和NTFS格式的分区,可以在Linux中共享windows系统下的资源。具体参考:http://ckc620.blog.51cto.com/631254/394238

其格式如下:

device:这里用来指定你要挂载的文件系统的设备名称或块信息,也可以是远程的文件系统。

mount-point:挂载点,也就是自己找一个或创建一个dir(目录),然后把文件系统device挂到这个目录上,然后就可以从这个目录中访问要挂载文件系统。对于swap分区,这个域应该填写:none,表示没有挂载点。

type:这里用来指定文件系统的类型。下面的文件系统都是目前Linux所能支持的:adfs、befs、cifs、ext3、 ext2、ext、iso9660、kafs、minix、msdos、vfat、umsdos、proc、reiserfs、swap、 squashfs、nfs、hpfs、ncpfs、ntfs、affs、ufs。

options :这里用来填写设置选项,各个选项用逗号隔开。

auto: 系统自动挂载,fstab默认就是这个选项
        defaults: rw, suid, dev, exec, auto,nouser, and async.
        noauto 开机不自动挂载
        nouser 只有超级用户可以挂载
        ro 按只读权限挂载
        rw 按可读可写权限挂载
        user 任何用户都可以挂载
        (请注意光驱和软驱只有在装有介质时才可以进行挂载,因此它是noauto)

其他不在一一列出,可以用命令 man mount 来查看具体的选项信息。

dump :先说明这个dump名词含义,Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用WinDbg打开。此处为1的话,表示要将整个device里的内容备份;为0的话,表示不备份。现在很少用到dump这个工具,在这里一般选0。

  fsck order:告诉fsck程序以什么顺序检查文件系统,为0就表示不检查,(/)分区永远都是1,其它的分区只能从2开始,当数字相同就同时检查(但不能有两1),比如第一和第二个分区填写2,第三和第四个分区填写3,则系统在检查完根分区后,接着同时检查第一和第二个分区,然后再同时检查第三和第四个分区。

其中:proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

tmpfs是一种基于内存的文件系统,读取速度非常快,它和虚拟磁盘ramdisk比较类似像,但不完全相同,和ramdisk一样,tmpfs可以使用RAM,但它也可以使用swap分区来存储。而且传统的ramdisk是个块设备,要用mkfs命令来格式化它,才能真正地使用它;而tmpfs是一个文件系统,并不是块设备,只是安装它,就可以使用了。tmpfs是最好的基于RAM的文件系统。详情参考:

http://baike.baidu.com/link?url=377ZSRpUtRGUf95aioIRF_Y5XVAJdhVmEpnf3irpkJfZoBVoO5pVF9XaQ4AQW7REKiUAeWkAqphhclrwfu71OK

Sysfs 是 Linux 2.6 所提供的一种虚拟文件系统。这个文件系统不仅可以把设备(devices)和驱动程序(drivers) 的信息从内核输出到 用户空间,也可以用来对设备和驱动程序做设置。

 

到这里就基本设置完毕了,啊但是由于mdev是通过init进程来启动的,所以在使用mdev构造/dev目录前,init需要用到设备文件/dev/

Console 和/dev/null,因此要建立这两个空文件:

因此进入文件系统建立dev目录并手动设置这两个文件的主次设备号:

mkdir  dev/

cd dev/

执行

sudo mknod console c  5     1

sudo mknod null  c  1      3

 建立其它目录

进入/home/book/mywork/files/first_fsroot/:

mkdir proc/  mnt/  tmp/ sys/  root/

 

5、文件系统的挂载

⑴为了确保文件系统可以正确的被挂载,必须设置允许服务器去挂载文件系统,为此,首先需要设置服务器的/etc/exports的内容

设置如下 sudo vi  /etc/exports

然后在后面加上: /work/root  *(rw,sync,no_root_squash)

其中前面的目录就是代表nfs的共享目录,也就是nfs的挂载目录,*代表所有的客户机都可以挂载此目录,其中对于括号中参数:rw代表,挂载此目录的客户机有对该目录文件有读写权利;sync 表示文件同步写入内存和硬盘当中,与之对应的是async表示文件先暂时放入内存而不是直接写入内存中;no_root_squash代表挂载客户机拥有该主机的root权限,与之对应的参数是root_squash代表如何登陆共享目录是root用户,那么他的权限将被限制为匿名使用者,一般情况下,他的uid和gid会变成nobody,同时还有与之对应的参数,all_squash,通过名字就就可以看得出来(所有的被镇压),也就是说无论登陆共享目录的是什么身份都会被限制为匿名用户。

然后可以重启下nfs服务器:

sudo /etc/init.d/nfs-kernel-server restart 或者

sudo service nfs-kernel-server restart

大功告成,然后在服务器上自己挂载自己进行测设:

sudo mount -t nfs 192.168.1.110:/home/book/mywork/files/first_fsroot/mnt (ip为ubuntu IP)

假如没出现错误的话,最小文件系统就基本完成了

⑵接下来在板子上挂载一下。

①假设nand已经烧写有文件系统平且已经进入文件系统主要在用mount命令挂载nfs就可以,

在板子的文件系统下建立一个mnt的文件夹 mkdir  /mnt 然后

mount  –t nfs –o nolock  192.168.1.110:/work/root  /mnt

②假设nand里面没有文件系统存在,只需要在uboot引导设置文件系统类型就可以:

set bootargs noinitrd root=/dev/nfsnfsroot=192.168.1.132work/root

ip=192.168.1.17192.168.1.132:192.168.1.1:255.255.255.0::eth0:offinit=/linuxrc console=ttySAC0,115200

具体的使用方法可以参考:linux源码包下的Documentation/filesystems/nfs/nfsroot.txt

本人的客户ip(开发板ip)为192.168.1.11,主机ip(linux的ip)是192.168.1.110,网关为192.168.1.1,默认掩码为255.255.255.0

(使用route命令中会显示一条default的里边标有GATEWAY的那个就是你的网关!当然,也可以使用ip route 来显示网关,随便说一下:dns可以查看cat /etc/resolv.conf查看nameserver)。

 

然后save,设置完成的print后会输如下图。重启开发板就可以:


 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值