Chinaunix首页 | 论坛 | 博客
  • 博客访问: 418689
  • 博文数量: 75
  • 博客积分: 2020
  • 博客等级: 大尉
  • 技术积分: 663
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-04 16:56
文章分类

全部博文(75)

文章存档

2010年(10)

2009年(65)

分类: LINUX

2009-06-05 10:38:38

使用busybox-1.13.3制作根文件系统

移植环境:

主机:CentOS 5.1

交叉编译器:arm-linux-gcc-3.4.1

开发板平台:S3C2440Friendly Mini2440开发板)

开始移植


1. 下载最新的busybox1.13.3,并解压缩。

下载busybox源代码:

解压源码:#tar -jxvf busybox-1.13.3.tar.bz2

2. 修改Makefile中的 arch和编译工具链头。

ARCH  ?= arm

CROSS_COMPILE  ?= /usr/local/arm/3.4.1/bin/arm-linux-

3. make menuconfig. 修改编译配置选项。

Busybox Setting----->

       build option-->

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

    [*] Build shared libbusybox                                               

    [*]   Produce a binary for each applet, linked against libbusybox         

    [*]   Produce additional busybox binary linked against libbusybox          

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

installation option-->

    [*] Don't use /usr                                                     

        Applets links (as soft-links) --->                                   

     (./_install) BusyBox installation prefix 

Busybox Library Tuning --->                             

MD5: Trade Bytes for Speed                                      

[*] Faster /proc scanning code (+100 bytes)                            

[*] Support for /etc/networks                                     

[*]   Additional editing keys

[*]   vi-style line editing commands

[*]   History saving

[*]   Tab completion

[*]   Username completion

[*]   Fancy shell prompts

其他的用默认值

4. 编译busybox

执行make CONFIG_PREFIX=/opt/boot/mini2440/rootfs install
/opt/boot/mini2440/rootfs目录下生成sbin,usr目录和linuxrc文件

注意:/opt/boot/mini2440/rootfs是我的根文件所在的目录,请根据需要修改

5. 修改/opt/boot/mini2440/rootfs/bin/busybox的属性。为4755

   #chmod 4755 /opt/boot/mini2440/rootfs/bin/busybox      

必须要要修改属性,否则在busybox中很多命令会受限制,比如:

$ su

su: must be suid to work properly 

6.创建必须的文件夹及设备文件
# cd rootfs
# mkdir bin dev etc lib mnt proc sys root 

#mkdir tmp var
#chmod 1777 tmp
从 Linux-2.6.18开始,负责旧版本的设备管理系统devfs已被废除,但新版本的udev是一个基于用户空间的设备管理系统。在内核启动时并不能自动创建设备节点,固需手动创建consolenull两个启动过程必须的设备节点。我们将采用busybox中内置的mdev,一个简化的udev版本
# mknod -m 660 dev/console  c 5 1
# mknod -m 660 dev/null c 1 3

7.创建etc目录下文件
(1)rootfs/etc目录下创建一个inittab文件,参考busybox 源码下面的examples/inittab”文件,内容如下:
# /etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
注意:上面红色部分在busybox 的参考文件中是ttySAC0,而在s3c24xx 系列芯片的串口驱动里面我们用了s3c2410_serial 做为设备名(在内核源码的drivers/serial/s3c2410.c”文件的949 行),然后我们又是用的串口作为控制台的,所以这里我们使用s3c2410_serial0
(2)创建etc/init.d/rcS文件
#!/bin/sh
ifconfig eth0 192.168.0.3
mount -a

echo "mount all…………………………[OK]" 

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

echo "Starting mdev……………………[OK]"

echo "*************************************************************"
echo " linux-2.6.29.4 bootWelcome to arm-linux world!"
echo "************************************************************"

最后还要改变它的属性使它能够执行。
#chmod +x etc/init.d/rcS
(3)创建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
var /dev tmpfs defaults 0 0

(4)增加为SHELL导入全局变量的文件/etc/profile

# /etc/profile: system-wide .profile file for the Bourne shells

echo

echo "Processing /etc/profile... "

# no-op

# Set search library path

echo "Set search library path in /etc/profile"

export LD_LIBRARY_PATH=/lib:/usr/lib 

# Set user path

echo "Set user path in /etc/profile"

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

export PATH 

# Set PS1 

#注意:ash 除了SHELL变量外,支持\u\h\W\$\!\n\w \nnnASCII字符对应的八进制数)

#以及\e[xx;xxm (彩色特效)等等!

#而且前面还要多加一个 '\'

echo "Set PS1 in /etc/profile"

export PS1="\\e[05;32m[$USER@\\w\\a]\\$\\e[00;34m"

echo "Done"

8.复制主机/etc/下面的文件passwd, group, shadow文件到/etc

[root@centos etc]# cp /etc/group .

[root@centos etc]# cp /etc/passwd .

[root@centos etc]# cp /etc/shadow .

ok,所需要的文件都已经建立ok

这 3个文件是从Host中拷贝过来的,只留下root帐号。那么现在 root的登陆密码和Host的登陆口令一致了,可以登录后再修改以及创建新用户。

9. 因为是编译的时候使用的是动态链接。所以先看看/busybox/_install/bin/busybox使用了哪些lib,然后从glibc复制相应的lib/nfsroot/s3c2440/lib中。

[root@centos bin]#/usr/local/arm/4.3.2/bin/arm-linux-readelf -d busybox

Dynamic section at offset 0xcf3a4 contains 25 entries:

  Tag        Type                         Name/Value

 0x00000001 (NEEDED)                     Shared library: [libm.so.6]

 0x00000001 (NEEDED)                     Shared library: [libc.so.6]

 0x0000000c (INIT)                       0xc208

 0x0000000d (FINI)                       0xba308

 0x00000019 (INIT_ARRAY)                 0xde000

 0x0000001b (INIT_ARRAYSZ)               4 (bytes)

 0x0000001a (FINI_ARRAY)                 0xde004

 0x0000001c (FINI_ARRAYSZ)               4 (bytes)

 0x00000004 (HASH)                       0x8128

 0x00000005 (STRTAB)                     0xa4dc

 0x00000006 (SYMTAB)                     0x8b9c

 0x0000000a (STRSZ)                      3324 (bytes)

 0x0000000b (SYMENT)                     16 (bytes)

 0x00000015 (DEBUG)                      0x0

 0x00000003 (PLTGOT)                     0xdf494

 0x00000002 (PLTRELSZ)                   3104 (bytes)

 0x00000014 (PLTREL)                     REL

 0x00000017 (JMPREL)                     0xb5e8

 0x00000011 (REL)                        0xb540

 0x00000012 (RELSZ)                      168 (bytes)

 0x00000013 (RELENT)                     8 (bytes)

 0x6ffffffe (VERNEED)                    0xb500

 0x6fffffff (VERNEEDNUM)                 2

 0x6ffffff0 (VERSYM)                     0xb1d8

 0x00000000 (NULL)                       0x0

复制lib 文件到lib目录下:

“etc”目录
用来存放系统的配置文件。
etc”目录下面有如下常用的文件:
fstab:指明需要挂载的文件系统;
group:用户组;
inittabinit 进程的配置文件;
passwd:密码文件;
profile:用户环境配置文件;
mdev.conf:因为2.6.18 版本开始linux 放弃使用devfs 而采用udevmdev udev 的简化版本),这里的mdev.conf 文件可以是空,也可以按照一定规则来编写,这里我采用了为空;
resolv.conf:存放DNS 信息的文件,访问外网时需要DNS 的信息。
常用的目录有:
init.d 目录:启动文件目录,该目录下面有个rcS”的文件,里面存放了系统启动时配置以及自启动加载
的进程等;


“lib”目录
常用的库文件,获取库文件的方法:
#cp -f /usr/local/arm/3.4.5/arm-linux/lib/*so* lib –a
这里拷贝了常用的库文件,如果需要特殊的库,需要再从相应的位置复制过来。
“mnt”目录
我们一般用来挂载的盘之类的外设,这里建立两个目录udisk”sd”,分别用来挂载盘和SD卡。
“opt”目录

“proc”目录
提供一些目录和虚拟文件系统。
“root”目录
超级用户的目录。
“sys”目录
“tmp”目录
存放临时文件的目录。
“var”目录
存放临时文件的目录。
 

http://blog.csdn.net/yang_dk/archive/2008/05/09/2422898.aspx

http://blog.chinaunix.net/u1/34474/showart_485837.html

 

阅读(2110) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~