注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

deisp的博客

 
 
 

日志

 
 

用Busybox制作嵌入式Linux的文件系统 - zcx3000的专栏 - CSDNBlog  

2008-07-23 19:55:20|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1 busybox简介
        熟悉嵌入式Linux的人对busybox一定不会陌生它被非常形象地称为嵌入式Linux系统中的瑞士军刀,因为它将许多常用的UNIX命令和工具结合到了一个单独的可执行程序中虽然与相应的GNU工具比较起来,busybox所提供的功能和参数略少,但在比较小的系统(例如启动盘)或者嵌入式系统中,已经足够了
         busybox在设计上就充分考虑了硬件资源受限的特殊工作环境它采用一种很巧妙的办法减少自己的体积:所有的命令都通过插件的方式集中到一个可执行文件中,在实际应用过程中通过不同的符号链接来确定到底要执行哪个操作例如最终生成的可执行文件为busybox,当为它建立一个符号链接ls的时候,就可以通过执行这个新命令实现列目录的功能采用单一执行文件的方式最大限度地共享了程序代码,甚至连文件头内存中的程序控制块等其他操作系统资源都共享了,对于资源比较紧张的系统来说,真是最合适不过了
        在busybox的编译过程中,可以非常方便地加减它的插件,最后的符号链接也可以由编译系统自动生成下面就来一步步地用busybox从无到有地建立一个全新的Linux文件系统

2 编译busybox
        2004年10月中旬,busybox的1.00稳定版终于推出了,完整的源代码可以从下载,压缩包大小为1.3 MB左右将源码解压之后,进入到busybox1.00目录中,运行make menuconfig可以打开它的编译界面这个界面和Linux内核编译有些接近,如图1所示
在这个菜单界面中除了可以对最终编译到可执行文件中的命令进行选择外,还有很多其他设置也是非常重要的下面三个目录是很多人都会感兴趣的:

Build Options --->
Installation Options --->
Login/Password Management Utilities --->

        在Build Options里面有是否使用交叉编译的选项(Do you want to build BusyBox with a Cross Compiler)如果要对其他平台进行编译就要选择它并设置相应的编译程序前缀
        在Installation Options里面可以设置安装的路径,即设置为新文件系统的根目录当然也可以用缺省的 _install目录,安装之后再复制到新文件系统中去
        在设置Login/Password Management Utilities的时候,为了免去配置glibc的麻烦,最好设置使用busybox自己的password和shadow文件的功能(Use internal password and group functions rather than system functions)
        busybox提供的命令无疑比较全面,但它的缺省配置还不能构成一个功能比较完备的文件系统必须要添加的命令有Login/Password Management Utilities里面的gettylogin和passwd,这些命令从前是由另外一个软件包tinylogin所提供的当然,如果不需要一个交互的登录界面,这些命令也可以去掉通过设定内核参数init=/bin/sh可以在系统启图1busybox的编译配置界面动后直接得到一个shell
         tlenetd命令是一个远程登录服务程序,把它编译进busybox中会为将来的调试提供很多的方便当然也可以通过串口终端的方式管理嵌入式设备,但网络登录的方式却更为方便
        设置完毕后保存退出,执行make; make install命令,busybox将在未来的根文件系统中建立/usr/bin/sbin等目录从中可以看到,编译好的busybox可执行文件和其他应用命令的符号链接典型的busybox文件大小在动态链接的情况下是300 KB左右,静态链接为800 KB左右,用它实现的文件系统完全可以控制在1 MB以下但就目前为止,得到的还不是一个完整可用的文件系统,必须要在这个基础上添加一些必要的文件,让它可以工作


3 完善文件系统
3.1 需要增加的文件
        参考一个正常的Linux系统就会发现,busybox建立的文件系统还缺少很多文件下面三行命令建立了常见UNIX系统中包含的一些目录,虽然它们不全是必需的,但建立它们更符合标准一些这些命令都是在新文件系统的根目录中执行的,第三条命令的执行还必须要有root权限

mkdir mnt root var tmp proc boot etc lib
mkdir /var/{lock,log,mail,run,spool}
chown 0:0R *

如果busybox采用了动态链接的方式编译,还需要把busybox所需要的动态库:libcrypt.so.1libc.so.6ldlinux.so.2放到lib目录中最好按照标准的方式建立相应的文件和链接,可以参考下面的列表:

-rwxrwxrwx 192519ld-2.3.2.so
lrwxrwxrwx 111ld-linux.so.2 -> ld-2.3.2.so
-rwxrwxrwx 1 1190032libc-2.3.2.so
lrwxrwxrwx 113libc.so.6 -> libc-2.3.2.so
-rwxr-xr-x 118348libcrypt-2.3.2.so
lrwxrwxrwx 117libcrypt.so.1 -> libcrypt-2.3.2.so

3.2 编写 etc文件夹下的文件
        etc文件夹是许多系统配置文件保存的地方这些文件非常重要,如果配置错误,就可能影响系统的启动busybox源代码 example/bootfloopy/etc目录中的文件算是一个简单的例子,可以把其中的文件拷贝过来作为基础(在 example/bootfloopy目录中的一些脚本和文档也很值得阅读)
        首先inittab文件是系统启动后所访问的第一个脚本文件,后续启动的文件都由它指定这个文件的格式和普通微机Linux上的inittab是有区别的,其具体含义可以参考busybox的文档下面是一个比较简单的例子:

::sysinit:/etc/init.d/rcS
tty0::respawn:/sbin/getty 38400 tty0
tty2::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount ar
::shutdown:/bin/mount / o remount,ro

       其中第一行指定了系统的启动脚本为/etc/init.d/rcS;第二行指定在第一个虚拟终端打开一个登录会话;第三行指定在第三个虚拟终端打开一个无须登录验证的shell;第四行指定了当按下ctrl+alt+del组合键时的执行命令;最后两行指定了关机时执行的操作
fstab文件定义了文件系统的各个挂接点,需要与实际的系统相配合一个简单的fstab文件如下:proc/procprocdefaults00
/dev/hda1/ext2rw,noauto01
devpts/dev/ptsdevptsdefaults00

其中第三行是为UNIX PTYs准备的,telnetd要用到
profile 文件是终端登录之后首先运行的脚本,这里可以不去管它我们比较关心的是系统在无人登录的情况下有哪些程序要执行从inittab文件可以看出系统启动之后要运行/etc/init.d/rcS脚本,需要启动的程序和需要进行的设置都可以写在这里面一个可能的rcS文件如下:

#! /bin/sh
echo e 'Starting System'
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.0.100
hostname F /etc/hostname
/bin/mount / o remount,rw
/bin/mount /proc
/bin/mount /dev/pts
/usr/sbin/telnetd
dmesg > /var/log/dmesg

为了满足终端登录用户验证的要求,etc目录下还需要有passwdgroup和shadow (在编译busybox时如果不选择shadow功能将不需要这个文件)这些文件至少要包含 root用户的定义,如下所示:

passwd:
root:x:0:0:root:/root:/bin/sh
group:
root:x:0:
shadow:
root::12179:0:99999:7:::

其中,如果shadow (对于不支持shadow的系统则是passwd )文件的第一个冒号和第二个冒号之间没有内容,表示这个用户登录不需要密码如果需要设定密码或者增加新的登录用户,就可以参考开发主机上的相应文件,或者在目标系统启动之后用passwd命令和adduser命令完成
        最后还可以给目标机起一个名字,在/etc目录下建立文件hostname,将起好的名字写到里面前面介绍的启动脚本rcS,通过hostname命令把文件的内容设置为机器名


4 测试新的文件系统
        文件系统的安装随着应用环境的不同差别比较大在嵌入式环境中,一般只要通过特殊的打包工具将文件系统打包,并烧录到非易失性存储器中就可以了例如,对于JFFS2类型的文件系统就可以用mkfs.jffs2命令生成文件系统的映像
        文件系统安装之后重新启动目标设备,应该就可以使用新建立的文件系统了如果系统启动失败,则可以通过内核消息查找错误的原因如果错误信息提示不能正确挂载文件系统,问题可能出在启动引导装载程序(bootloader)上文件系统比较容易出问题的是用户的验证和动态链接库的加载最简单的检测办法是把busybox编译为静态链接并设置内核参数init=/bin/sh来躲开对用户登录的验证


5 总结
        一般构建文件系统的方式是从原有的文件系统进行剪裁和修补其实使用最新的busybox制作全新的文件系统并不复杂,甚至更加简便,对启动脚本的配置也更加灵活和自由

评论:没有评论
发表评论请输入评论





引文来源  用Busybox制作嵌入式Linux的文件系统 - zcx3000的专栏 - CSDNBlog

----------------------------
一键转贴,快速捕捉生活精彩,赢每周好礼!查看活动首页>>

  评论这张
 
阅读(113)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017