使用BusyBox构建根文件系统

busybox构建系统之前的准备

第一安装:

为了解决busybox编译出错:fatal error:curse.h错误是因为缺少套件ncurses devel

apt-get install libncurses5-dev

问题就可以解决;


第二步:下载arm-linux-gcc安装,这个是基于arm架构的linux平台交叉编译工具,下载arm-linux-gcc-4.4.3版本

1、tar -zxvf arm-linux-gcc-4.4.3.tar.gz -C /

2、在终端sudo vim /root/.bashrc最后一行填写

export PATH=$PATH:/opt/tools/4.4.3/bi

3、安装兼容库
sudo apt-get install g++-muItilib

source /root/.bashrc

4、测试  arm-linux-gcc -v


第三步下载

下载busybox的源码包,最新版本为busybox-1.15.0
http://www.busybox.net/downloads/

解压并进入目录:
# tar jxvf busybox-1.15.0.tar.bz2
# cd busybox-1.15.0

修改Makefile:
# gedit Makefile &

把 164 行修改为:
CROSS_COMPILE = arm-linux-

把 189 行修改为:
ARCH = arm

配置:
# make menuconfig

 进入busybox目录

          vim  Makefile

          将ARCH  ?= $(SUBARCH) 修改为

              ARCH   ?= arm

           将CROSS_COMPILE ?=   修改为

               CROSS_COMPILE ?= arm-linux-

3. 执行source /etc/profile使编译器生效

4. make menuconfig配置busybox选项:

a.进入 Busybox Settings à
build Options->
   选中 “Build busybox as a static binary”, 静态链接
   Cross Compiler prefix (arm-linux-)
   Installation Options->
   选中 “Don‘t use /usr”, 选中该项可以避免busybox 被安装到宿主系统的/usr目录下,破坏宿主系统
   Busybox Installation Prefix (/xxx/rootfs)
   该选项表明编译后的busybox的安装位置


选上以下几项:

Busybox Settings --->
         Build Options --->
               [*] Build BusyBox as a static binary (no shared libs)
               [*] Build with Large File Support (for accessing files > 2 GB)
         Busybox Library Tuning --->
               [*] vi-style line editing commands
               [*] Fancy shell prompts
Linux Module Utilities --->
        [ ] Simplified modutils
        [*] insmod
        [*] rmmod
        [*] lsmod
        [*] modprobe
        [*] depmod


退出并保存配置。

编译:
# make

安装:
# make install

在busybox-1.15.0目录下可以找到_install子目录,这就是刚才的安装目录。

二)加入必要的目录与文件
改名为最小化根文件系统目录:
# mv 
_install mini_rootfs

进入最小化根文件系统目录:
# cd mini_rootfs

mini_rootfs目录里建立一个名为create_rootfs.sh的脚本文件:

#!/bin/sh

#root dir
mkdir bin sbin lib etc dev sys proc tmp var opt mnt usr home root media

#usr sub dir
cd usr
mkdir bin sbin lib local
#usr/local sub dir
cd local
mkdir bin sbin lib
cd ../..

#etc sub dir
cd etc
touch inittab
touch fstab
touch profile
touch passwd
touch group
touch shadow
touch resolv.conf
touch mdev.conf

touch inetd.conf

mkdir rc.d
mkdir init.d
touch init.d/rcS
chmod +x init.d/rcS
mkdir sysconfig
touch sysconfig/HOSTNAME
cd ..

#dev sub dir
cd dev
mknod console c 5 1
chmod 777 console
mknod null c 1 3
chmod 777 null
cd ..

#var sub dir
cd var
mkdir log
cd ..


为create_rootfs.sh脚本加上可执行权限:
# chmod +x create_rootfs.sh

执行该脚本以生成最小化根文件系统所需要的目录与文件:
# ./create_rootfs.sh

拷贝交叉编译器里的动态链接库到 最小化根文件系统的  lib 和 usr/lib 目录:

# cp -f /opt/arm-2009q1/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -a

# cp -f /opt/arm-2009q1/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* usr/lib -a

etc/fatab文件的内容为:

# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /var tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0


etc/inittab文件的内容为:

::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
::shutdown:/bin/umount --r
::restart:/sbin/init


etc/profile文件的内容为:

# Ash profile
# vim: syntax=sh

# No core files by default
ulimit --c 0 > /dev/null 2>&1

USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\# '
PATH=$PATH

HOSTNAME=`/bin/hostname`

export USER LOGNAME PS1 PATH


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


etc/init.d/rcS文件的内容为:

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin

runlevel=S
prevlevel=N

umask 022

export PATH runlevel prevlevel

mount -a

mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

/bin/hostname -F /etc/sysconfig/HOSTNAME

ifconfig eth0 192.168.0.80


resolv.conf文件的内容为:

nameserver 202.96.128.166


etc/inetd.cof是inetd的配置文件,它 的内容为:

# It is generally considered safer to keep these off.
echo stream tcp nowait root internal
echo dgram udp wait root internal
daytime stream tcp nowait root internal
daytime dgram udp wait root internal
time stream tcp nowait root internal
time dgram udp wait root internal

# These are standard services.
ftp    stream tcp nowait root /usr/sbin/tcpd in.ftpd
telnet stream tcp nowait root /sbin/telnetd  /sbin/telnetd


etc/sysconfig/HOSTNAME文件的内容为你的英文名字。

etc/passwd、etc/group、etc/shadow文件的内容为空。


etc/mdev.conf是mdev设备文件系统的配置文件,可以参考:
busybox下mdev的使用以及mdev.conf的规则配置
mdev实现U盘和SD卡的自动挂载

OK,算是做好了~~

三)用户管理
在文件系统正常运行起来后,使用adduser命令:
# adduser root

会打印出如下消息:
passwd:unknown uid 0

这表示不能为该用户设置密码,此时你会发现passwd命令也无法使用。

解决的办法是,打开/etc/passwd文件,其内容为:
root:x:1000:1000:Linux User…:/home/root:/bin/sh

将用户ID和组ID均修改为0。

打开/etc/group文件,其内容为:
root:x:1000:

同样将组ID修改为0。

然后,passwd命令就可以正常使用了。

这时为root用户设置口令:
# passwd root

根据提示输入密码。

这是我做好的最小化根文件系统的压缩包:
文件:mini_rootfs.tar.gz
大小:2971KB
下载:下载
解压:
# tar zxvf mini_rootfs.tar.gz



第二种:

STEP 1:构建目录结构 

创建根文件系统目录,主要包括以下目录
/dev  /etc /lib  /usr  /var /proc /tmp /home /root /mnt /bin  /sbin  /sys 

#mkdir     /home/rootfs
#cd        /home/rootfs

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

 

STEP 2:    使用busybox构建/bin /sbin linuxrc

进入busybox-1.16.1目录,执行

#make defconfig

#make menuconfig

Busybox Setting ----->
    Build Options -----> 
        //1选择将busybox进行静态编译 
        [*]Build BusyBox as a static binary (no shared libs) 
        //2.指定交叉编译器为 
        (/usr/local/arm/4.3.2/bin/arm-linux-)Cross Compiler prefix

Installation Options -----> (选择生成的文件存放目录,也可以直接放在rootfs下就不用拷贝了)

        //3.选择上 Don’t use /usr 
Busybox Library Tuning---> 
    [*]Username completion 
    [*]Fancy shell prompts 
    [*]Query  cursor  position  from  terminal 
        //4.编译出的busybox的shell命令解释器支持显示当前路径及主机信息

保存退出

#make   
#make install

在busybox目录下会看见 _install目录,里面有/bin /sbin linuxrc三个文件
将这三个目录或文件拷到第一步所建的rootfs文件夹下。

#cp bin/ sbin/ linuxrc /home/rootfs -ra 

   切记一定要带上-a的参数,因为bin目录里大部分都是链接,如果不带-a的参数,拷过去之后会做相应的复制,不再是链接的形式

 

STEP 3  构建etc目录:

1)进入根文件系统rootfs的etc目录,执行如下操作:

 

       拷贝Busybox-1.16.1/examples/bootfloopy/etc/* 到当前目录下
        #cp –r busybox-1.16.1/examples/bootfloopy/etc/*  rootfs/etc

        修改inittab,

                原始文件为:

        1 ::sysinit:/etc/init.d/rcS
        2 ::respawn:-/bin/sh
        3 tty2::askfirst:-/bin/sh
        4 ::ctrlaltdel:/bin/umount -a -r

      修改后为:

        ---(1):开机免登陆,直接打开shell(前面数字为行号)         

        1 ::sysinit:/etc/init.d/rcS
        2 #::respawn:-/bin/sh
        3 #::respawn:-/bin/login
        4 console::askfirst:-/bin/sh
        5 #tty2::askfirst:-/bin/sh
        6 ::ctrlaltdel:/bin/umount -a -r

        ---(2):开机需要登陆(前面数字为行号)         

        1 ::sysinit:/etc/init.d/rcS
        2 #::respawn:-/bin/sh
        3 ::respawn:-/bin/login
        4 #console::askfirst:-/bin/sh
        5 #tty2::askfirst:-/bin/sh
        6 ::ctrlaltdel:/bin/umount -a -r

2)拷贝虚拟机上的/etc/passwd, /etc/group, /etc/shadow到rootfs/etc下

 

        # cp /etc/passwd   rootfs/etc
        # cp /etc/group    rootfs/etc 
        # cp /etc/shadow   roofs/etc

 

  对以下三个文件修改,只保存与root相关的项,根据具体情况内容会有所不同。

  修改passwd为root:x:0:0:root:/root:/bin/sh,即只保存与root相关项,而且最后改成/bin/ash。

  修改group为root:x:0:root

  修改shadow为root:$1$x9yv1WlB$abJ2v9jOlOc9xW/y0QwPs.:14034:0:99999:7:::

  登陆开发板时需输入用户名密码,同虚拟机相同

3)修改profile

  PATH=/bin:/sbin:/usr/bin:/usr/sbin          //可执行程序 环境变量

  export LD_LIBRARY_PATH=/lib:/usr/lib        //动态链接库 环境变量

  /bin/hostname osee

  USER="`id -un`"

  LOGNAME=$USER

  HOSTNAME='/bin/hostname'

  PS1='[\u@\h \W]# '                          //显示主机名、当前路径等信息:

4)修改 etc/init.d/rc.S文件

  /bin/mount -n -t ramfs ramfs /var

  /bin/mount -n -t ramfs ramfs /tmp

  /bin/mount -n -t sysfs none /sys

  /bin/mount -n -t ramfs none /dev

  /bin/mkdir /var/tmp

  /bin/mkdir /var/modules

  /bin/mkdir /var/run

  /bin/mkdir /var/log

  /bin/mkdir -p /dev/pts                    //telnet服务需要

  /bin/mkdir -p /dev/shm                    //telnet服务需要

  #echo /sbin/mdev > /proc/sys/kernel/hotplug//USB自动挂载需要

  /sbin/mdev -s         //启动mdev在/dev下自动创建设备文件节点

  /bin/mount -a

   #######配置网络################################

   /sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0

  /sbin/ifconfig eth0 192.168.1.70
  /sbin/ifconfig eth0 netmask 255.255.255.0
  /sbin/route add default gw 192.168.1.1 eth0

  /sbin/ifconfig eth1 192.168.1.71 netmask 255.255.255.0
  /sbin/route add default gw 192.168.1.1 eth1

 

5)修改etc/fstab文件,增加以下文件

        none   /dev/pts    devpts   mode=0622      0 0
       tmpfs  /dev/shm    tmpfs    defaults       0 0

 

STEP 4 构建lib目录:

     (~/at91/x-tools/arm-zch-linux-gnueabi/arm-zch-linux-gnueabi/sysroot/lib我的只是把这个目录下的SO文件复制就可以了)

 

     1)#cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

     将以下动态库拷贝到rootfs/lib下
     #cp  *so*  roofs/lib  -a

     2)#cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib
     将以下动态库拷贝到rootfs/lib下 
     #cp ./libstdc++.so.*  rootfs/lib  -a


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值