BusyBox构建根文件系统

BusyBox构建根文件系统

BusyBox是一个复合了大量简易版Linux工具的程序,嵌入式系统中使用它可以快速建立一个相对简易的根文件系统。

1.下载busybox
官网 www.busybox.net
目前(2015.8.8)的最新稳定版为1.23.2

BusyBox各版本下载

2.编译busybox
编译busybox前,请安装好交叉工具链,比如我这里是omapl138的工具链,安装位置/opt/arm-linux-gcc/omapl138/bin/,因为编译器前缀和另外一个编译器的相同,每次使用前设置环境变量

PATH=$PATH:/opt/arm-linux-gcc/omapl138/bin/
cd ~/buildspace
tar xf ~/Downloads/busybox-1.23.2.tar.bz2
cd  busybox-1.23.2
make menuconfig
make
make install

menuconfig时,
Busybox Settings  —>
  Build Options  —>
    ()  Cross Compiler
prefix          填入交叉工具链的前缀,这里是arm-none-linux-gnueab-
  Installation Options(“make install” behavior) ->
    What kind of applet links to install (as soft-links) 
    (./_install) BusyBox installation
prefix     安装路径,我喜欢用这个默认值
其他选项一般默认就够用。
3.构建根文件系统目录
以root用户创建根目录,拷贝busybox文件,创建几个目录

sudo -s
mkdir /home/rootfs
cd /home/rootfs
cp -r ~/biuldspace/busybox-1.23.2/_install/* .
mkdir dev etc lib mnt opt var tmp proc sys root

创建两个基本设备文件

mknod dev/console c 5 1
mknod dev/null c 1 3

创建/linuxrc的初始化配置文件/etc/inittab
该文件中指定linuxrc初始化完成后运行/etc/init.d.rcS脚本。然后在ttyS2运行一个shell,该shell不需要登陆。

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

::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init

ttyS2::respawn:-/bin/sh

 /etc/init.d/rcS的内容。在rcS文件中,必须使用绝对路径,因为环境变量还没有初始化……

mount -a                      #
挂载在/etc/fstab中定义的所有挂载点
echo /sbin/mdev > /proc/sys/kernel/hotplug  #
设置热插拔事件处理程序为mdev
mdev
-s                       #设备节点维护程序mdev初始化
mkdir
/dev/pts                   #为telnetd创建pts目录
mount -t devpts devpts /dev/pts          #挂载pts目录
/bin/hostname -F /etc/hostname          #
设置主机名。/etc/hostname 的内容为主机名字符串

mkdir /var/run                    #ifup需要该目录
/sbin/ifup
-a                    #根据/etc/network/interface设置网卡

/usr/sbin/telnetd &                #运行telnetd
#后台运行你的程序

/etc/fstab的内容

tmpfs /dev tmpfs  defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /var tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0

创建ifup需要的文件夹

cd /home/rootfs/etc/
mkdir network
cd  network
mkdir if-down.d  if-post-down.d  if-pre-up.d  if-up.d

/etc/network/interfaces 的内容

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.5
netmask 255.255.255.0
gateway 192.168.0.1

/etc/passwd 的内容

root::0:0:root:/root:/bin/sh

/etc/profile 的内容

PS1=’\[email protected]\h:\w
\$ ‘            #设置终端提示符
PATH=$PATH:/usr/local/bin        #设置搜索路径
export TERM=vt102             #termcap的环境变量,gdb
-tui需要
export TERMINFO=/usr/share/terminfo

 拷贝动态库

cd /opt/arm-linux-gcc/omap_4.3.3/arm-none-linux-gnueabi/libc
cp lib/* /home/rootfs/lib/
cp usr/lib/libstdc++.* /home/rootfs/lib/

制作ubi镜像文件

if [ -e ubifs.img ]; then rm ubifs.img; fi
if [ -e ubi.img ]; then rm ubi.img; fi
rootfs=/home/rootfs
mkfs.ubifs -v -r ${rootfs} -m 2048 -e 126976 -c 3717 -o ubifs.img -F
ubinize -v -o ubi.img -O 2048 -m 2048 -p 128KiB -s 512 ubinize.cfg
rm ubifs.img

其中,mkfs.ubifs需要加-F参数,否则ubi文件系统很可能在启动一次后就坏掉。-F参数的意思是在第一次启动时清空空闲区域。

ubinize.cfg的内容

[rootfs]
mode=ubi
image=ubifs.img
vol_id=0
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize

mkfs.ubifs是创建单个卷(类似逻辑分区)的镜像,ubinize是创建一个可以包含多个卷的镜像(类似扩展分区)。ubinize.cfg中,[]内为卷的名字。

移植Busybox与构建根文件系统

本文永久更新链接地址:

BusyBox是一个复合了大量简易版Linux工具的程序,嵌入式系统中使用它可以快速建立一个相对简易的根文件系统。
1.下…

保存退出后:

./mkfs.ubifs -r
<path>/_install -m 512 -e 15360 -c 3897 -o ubifs.img

转:

git clone
git://git.infradead.org/mtd-utils.git

然后修改_install/bin/busybox权限:

/opt/arm-2010q1/bin/arm-none-linux-gnueabi-readelf
-a busybox  | grep Shared

fstab

代码

make
(生成busybox)

上下载busybox源代码,目前最新的稳定版本为1.18.1,解压至Workspaces。

 

 

修改Makefile:

ubimkvol /dev/ubi0 root 0
(注意这里的名字必须跟bootargs匹配,默认为ubi0.root)

 

 

 

make
install (生成文件到_install目录)

make 成功产生mkfs.ubifs

以下切换到root用户进行操作(在其他用户模式下编译出来的rootfs登录时不是以root登录,好像是比较麻烦,简单起见先)

mkdir -p dev etc home lib
mnt proc root sys tmp usr var/lib/misc var/lock var/log var/run var/tmp

inittab

更改rcS和inittab的权限为777:

CROSS_COMPILE =
/opt/arm-2010q1/bin/arm-none-linux-gnueabi-

inittab会被init执行

进入到_install目录创建linux需要的一些目录:

init.d/rcS

 

 

 

 

ubiattach
/dev/nand0.root

cd mtd-utils

 

 

sudo apt-get install
liblzo2-dev

passwd,group,shadow用户/组/密码,可以用PC机上的替代,这里是一些说明:

进入mkfs.ubifs编译出错,在FAQ中看到需要3个库,安装之:

erase
/dev/nand0.root

sudo apt-get install
uuid-dev

dhcp

现在来看一下busybox需要哪些动态链接库,返回到busybox目录后输入:

git
describe master  (版本号是v1.3.1-138-gf0cc488)

1
#
see busybox/examples/inittab
2  
3  #
Boot-time system configuration/initialization script.
4 # This is
run first except when booting in single-user mode.
5  ::sysinit:/etc/init.d/rcS
6
7  #Start an
“askfirst” shell on the console (whatever that may be)
8 #use
respawn instead askfirst to make sure console always active
9  ::respawn:-bin/sh
10
11  # Stuff to
do when restarting the init process
12  ::restart:/sbin/init
13
14 # Stuff to
do before rebooting
15 ::ctrlaltdel:/sbin/reboot
16 ::shutdown:/bin/umount
-a -r
17 ::shutdown:/sbin/swapoff
-a
18
19