busybox 根文件系统制作

来源:互联网 发布:linux文件下载到本地 编辑:程序博客网 时间:2024/04/29 21:46


busybox是构造文件系统最常用的软件工具包它被非常形象地称为嵌入式Linux系统中的“瑞士军刀”,因为它将许多常用的Linux命令和工具结合到了一个单独的可执行程序(busybox)中。


  虽然与相应的GNU工具比较起来,busybox所提供的功能和参数略少,但在比较小的系统(例如启动盘)或者嵌入式系统中已经足够了。


  busybox在设计上就充分考虑了硬件资源受限的特殊工作环境。它采用一种很巧妙的办法减少自己的体积:所有的命令都通过“插件”的方式集中到一个可执行文件中,在实际应用过程中通过不同的符号链接来确定到底要执行哪个操作。采用单一执行文件的方式最大限度地共享了程序代码,甚至连文件头、内存中的程序控制块等其他系统资源都共享了,对于资源比较紧张的系统来说,真是最合适不过了。在busybox的编译过程中,可以非常方便地加减它的“插件”,最后的符号链接也可以由编译系统自动生成。


【实验目的】

      熟悉Linux文件系统目录结构,创建自己的文件系统,通过NFS方式测试;用文件系统工具生成ramdisk文件系统映象文件。

【实验环境】

主机:ubuntu 12.04发行版

目标机:FS210平台

交叉编译工具:arm-none-linux-gnueabi-gcc

【实验步骤】

一、根文件系统制作

1、  源码下载

我们选择的版本是busybox-1.17.3.tar.bz2

下载路径为:http://busybox.net/downloads/

2、  解压源码

$ tar  xvf busybox-1.17.3.tar.bz2

3、  进入源码目录,修改Makefile

$ cd busybox-1.17.3

vim Makefile

ARCH = arm

CROSS_COMPILE = arm-none-linux-gnueabi-

4、  配置源码

$ make menuconfig

Busybox Settings --->

      Build Options --->

              [*] Build BusyBox as a static binary(no shared libs)

              [ ] Force NOMMU build

              [ ] Build with Large File Support(for accessing files > 2 GB)

              ()Cross Compiler prefix

              () Additional CFLAGS

     Installation Options  --->

                   [*] Don't use /usr

                     Appletslinks (as soft-links)  --->

           (./_install) BusyBoxinstallation prefix (NEW)

5、  编译

$ make

6、  安装

$ make install

   busybox默认安装路径为源码目录下的_install

7、  进入安装目录下

$ cd _install

$ ls

bin linuxrc  sbin

8、  创建其他需要的目录

$ mkdir dev  etc  mnt proc  var  tmp sys  root  lib home usr

9、  添加动态库

?  将工具链中的库拷贝到_install目录下的lib目录

$cp -raf/usr/local/toolchain-4.5.1-farsight/arm-none-linux-gnueabi/lib/*  lib/

?  删除库文件中的符号表,也叫瘦身

$ rm -rf lib/*.a

$ arm-none-linux-gnueabi-strip  lib/*

10、 添加系统启动文件

在_install/etc下添加文件inittab,文件内容如下:

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

::askfirst:-/bin/ash

::ctrlaltdel:/sbin/reboot

::shutdown:/sbin/swapoff -a

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

::restart:/sbin/init

格式说明:

<id>:<runlevels>:<action>:<process>: 在什么时间启动什么进程

id: 进程所使用的终端名

runlevels:不用填写

<action>: Valid actions include:sysinit, respawn, askfirst, wait, once, restart, ctrlaltdel, and shutdown.\

 sysinit: 系统初始化的时候,放在最前面

 respawn,askfirst是一样的,如果process意外终止啦,系统会讲其重启

 askfirst 会有提示Please press Enter to activate this console

 wait: 该进程一定要执行完,才能执行下一个

 once, 进程如果意外终止,那么不会重启

11,在_install/etc下添加文件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

      这里我们挂载的文件系统有三个proc、sysfs和tmpfs。在内核中proc和sysfs默认都支持,而tmpfs是没有支持的,我们需要添加tmpfs的支持

修改内核配置:

File systems --->

      Pseudo filesystems --->

            [*] /proc file system support (NEW)

            [*] sysfs file system support(NEW)

            [*] Virtual memory file systemsupport (former shm fs)

            [*]   Tmpfs POSIX Access Control Lists

重新编译内核

     

12,在_install/etc下创建init.d目录,并在init.d下创建rcS文件,rcS文件内容为:

   cd _install/etc   

   mkdir init.d

   vim init.d/rcS 

===============================================    

#!/bin/sh

echo ">>>>>>>>in/etc/init.d/rcS<<<<<<<<<<<<<<<<<"

/bin/mount -a

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

/sbin/mdev -s

===============================================

mdev是用于自动创建设备节点  

       为rcS添加可执行权限:

$ chmod   +x  init.d/rcS

13,在_install/etc下添加profile文件,文件内容为:

#!/bin/sh

export HOSTNAME=farsight

export USER=root

export HOME=root

export PS1="[$USER@$HOSTNAME \W]\#"

PATH=/bin:/sbin:/usr/bin:/usr/sbin

LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

export PATH LD_LIBRARY_PATH

14、 设备文件创建

根文件系统中有一个设备节点是必须的,在dev下创建console节点

$ mknod  dev/console  c  5  1

以上的步骤就完成了linux根目录所需要的所有文件,可以直接使用


 NFS测试

1、将做好的根目录复制成/opt/rootfs(如果你已经有这个目录,就要注意啦)

$sudo  cp  -raf  _install  /opt/rootfs

2, 在ubuntu中将/opt/rootfs设置成nfs文件系统

   修改ubuntu的/etc/exports: 将/opt/rootfs设置成nfs文件系统格式

    /opt/rootfs           *(subtree_check,rw,no_root_squash,async)


   sudo service nfs-kernel-server restart


测试:

       sudo mount -t nfs 192.168.7.22:/opt/filesystem/ /mnt/nfs/


   设置uboot环境变量

===========================================================================

# setenv bootcmd  tftp  20800000 zImage \;  go  20800000

# setenv bootargs  root=nfs  nfsroot=192.168.7.100:/opt/rootfs  init=/linuxrc console=ttySAC0,115200 ip=192.168.7.200

# saveenv

===========================================================================

如果开机就运行一个自己可执行程序,可以做如下处理


1、编译出一个可执行程序:/bin/hello_arm/

2、/etc/init.d/rcS中启动可执行程序


方法一:直接在/etc/init.d/rcS添加一条:

          /bin/hello_arm

方法二:另外再写一个脚本,然后在/etc/init.d/rcS中启动这个脚本

写一个脚本:/etc/local/mysrv.sh

#!/bin/ash

echo "my first app"

/bin/hello_arm

然后在/etc/init.d/rcS添加一条

       /etc/local/mysrv.sh

     重新启动开发板,查看是否能够正常挂载,功能是否正常


0 0
原创粉丝点击