Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174477
  • 博文数量: 32
  • 博客积分: 1910
  • 博客等级: 上尉
  • 技术积分: 495
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-31 21:28
文章存档

2009年(3)

2008年(29)

我的朋友

分类: LINUX

2008-11-28 15:36:02

 

一、主机环境

 Linux vm-dev 2.6.9-42.EL RedHatEL4, VMWare6.0.3;
 gcc version 3.4.6 20060404 (Red Hat 3.4.6-3) Thread model: posixgcc version 3.4.6
 
所需源文件: busybox-1.12.2.tar.bz2;

二、用Busybox创建nfs文件系统

1、解压busybox-1.12.2.tar.bz2,路径为

[root@vm-dev rootfs]# ls

busybox-1.12.0.tar.bz2

[root@vm-dev rootfs]# tar -vxjf busybox-1.12.2.tar.bz2

[root@vm-dev rootfs]# cd busybox-1.12.2

[root@vm-dev busybox-1.12.2]# pwd

/opt/develop/lyj/common/porting/rootfs/busybox-1.12.2

[root@vm-dev busybox-1.12.2]# vi Makefile

[root@vm-dev busybox-1.12.2]#

修改Makefile中的ARCHCROSS_COMPILE与本机的路径一致:

 

CROSS_COMPILE ?= /opt/crosstool/bin/arm-s3c2410-linux-gnu-
...

ARCH
?= arm

 

2、编译busybox。先make menuconfig,修改以下:

 

[root@vm-dev busybox-1.12.2]# make menuconfig

Busybox Settings --->
    Build Options --->
        [*] Build BusyBox as a static binary (no shared libs)
        //
直接编译成静态库,省事点
        (/opt/crosstool/bin/arm-s3c2410-linux-gnu-) Cross Compiler prefix
        //
这里和Makefile里保持一致,应该写一处就行了
    Installation Options --->
        [ ] Don't use /usr
        //
使用usr目录

Busybox Library Tuning  --->  

[*]   Fancy shell prompts  

//一定要选上,否则很多转意字符无法识别
Shells --->
    Choose your default shell (ash) --->
    //
这里选择shellash,应该是默认选中的
        --- ash
        //
ash这档的选项全部选上

Miscellaneous Utilities  --->

[ ] inotifyd

//不选

保存退出,直接makemake install
可以看到如下目录

[root@vm-dev busybox-1.12.2]# ls _install/

bin  linuxrc  sbin  usr

[root@vm-dev busybox-1.12.2]#

3、用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。我是用root用户登陆的,直接创建了设备节点。

[root@vm-dev root_stand]# cat build_fs.sh

#!/bin/sh

echo "makeing rootdir"

mkdir rootfs

cd rootfs

 

echo "makeing dir: bin dev etc lib proc sbin sys usr"

mkdir bin dev etc lib proc sbin sys usr #8 dirs

mkdir usr/bin usr/lib usr/sbin lib/modules

 

#Don't use mknod, unless you run this Script as

mknod -m 600 dev/console c 5 1

mknod -m 666 dev/null c 1 3

 

echo "making dir: mnt tmp var"

mkdir mnt tmp var

chmod 1777 tmp

mkdir mnt/etc mnt/jiffs2 mnt/yaffs mnt/data mnt/temp

mkdir var/lib var/lock var/log var/run var/tmp

chmod 1777 var/tmp

 

echo "making dir: home root boot"

mkdir home root boot

echo "done"

 

[root@vm-dev root_stand]#

执行这个sh

[root@vm-dev root_stand]# sh build_fs.sh

makeing rootdir

makeing dir: bin dev etc lib proc sbin sys usr

making dir: mnt tmp var

making dir: home root boot

done

创建出一个主文件夹rootfs,里面有一批文件:

[root@vm-dev root_stand]# cd rootfs/

[root@vm-dev rootfs]# ls

bin  boot  dev  etc  home  lib  mnt  proc  root  sbin  sys  tmp  usr  var

[root@vm-dev rootfs]#

4、把busybox源码目录下的etc的内容拷贝到这里的etc

[root@vm-dev rootfs]# cd etc/

[root@vm-dev etc]# ls

[root@vm-dev etc]# cp -a /opt/develop/lyj/common/porting/rootfs/busybox-1.12.2/examples/bootfloppy/etc/* ./

[root@vm-dev etc]# ls

fstab  init.d  inittab  profile

[root@vm-dev etc]#

5、修改拷贝过来的profile文件

[root@vm-dev etc]# vi profile

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

echo "Processing /etc/profile"
# no-op

# Set search library path
echo " Set search library path"
export LD_LIBRARY_PATH=/lib:/usr/lib

# Set user path
echo " Set user path"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

# Set PS1
echo " Set PS1"
HOSTNAME=`/bin/hostname`
#
此处让shell提示符显示host名称的。是`,不是,要注意
#
会在进入根系统后显示Jacky

export PS1="\\e[32m[$USER@$HOSTNAME \\w\\a]\\$\\e[00;37m "
#
此处\\e[32m是让后面的“[$USER@$HOSTNAME \\w\\a]”显示为绿色

# \\e[00
是关闭效果
# \\e[05
是闪烁
# 37m
是让后面的显示为白色
#
多个命令可以;号隔开


echo "All done!"
echo

 

6、修改初始化文件inittabfstab

Inittab

[root@vm-dev etc]# vi inittab

::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init

tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff –a

Fstab

[root@vm-dev etc]# vim fstab

proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0

 

7、修改初始化的脚本文件init.d/rcS

 

[root@vm-dev etc]# vi init.d/rcS

#! /bin/sh
echo "Processing etc/init.d/rc.S"

#hostname ${HOSTNAME}
hostname up-tech
echo " Mount all"
/bin/mount -a

echo " Start mdev...."
/bin/echo /sbin/mdev > proc/sys/kernel/hotplug
mdev -s

echo "****************************************************"
echo " rootfs by NFS, s3c2410"
echo " Created by lyj_uptech @ 2008.11.28"
echo " Good Luck"

echo " "
echo "****************************************************"
echo

 


8
、创建一个空的mdev.conf文件,在挂载根文件系统时会用到的

[root@vm-dev etc]# touch mdev.conf


9
、从本机拷贝passwdshadowgroup文件。

[root@vm-dev etc]# cp /etc/passwd .
[root@vm-dev etc]# cp /etc/shadow .
[root@vm-dev etc]# cp /etc/group .

修改passwd文件,把第一行和最后一行的bash修改成ash

10、把busybox默认安装目录中的文件全部复制到这里的rootfs中。会发现多了linuxrc -> bin/busybox文件,这是挂载文件系统需要执行的。

[root@vm-dev etc]#  cd ..
[root@vm-dev etc]#  cp -Rfv /opt/develop/lyj/common/porting/rootfs/busybox-1.12.2/_install/* ./


OK
,以上用busybox创建了一个基本的文件系统。
PS:
   
如果编译busybox时选择动态库方式编译,则需要查看生成的busybox使用哪些动态库,然后把它们拷贝到rootfs/lib目录下。
[root@vm-dev lib]# arm-linux-readelf -d ../bin/busybox

Dynamic section at offset 0xc1014 contains 21 entries:
  Tag Type Name/Value
 0x00000001 (NEEDED) Shared library: [libm.so.6]
 0x00000001 (NEEDED) Shared library: [libc.so.6]
 0x0000000c (INIT) 0xc2ec
 0x0000000d (FINI) 0xa96b8
 0x00000004 (HASH) 0x80e8
 0x00000005 (STRTAB) 0xa4c4
 0x00000006 (SYMTAB) 0x8b64
 0x0000000a (STRSZ) 3505 (bytes)
 0x0000000b (SYMENT) 16 (bytes)
 0x00000015 (DEBUG) 0x0
 0x00000003 (PLTGOT) 0xd10e4
 0x00000002 (PLTRELSZ) 3112 (bytes)
 0x00000014 (PLTREL) REL
 0x00000017 (JMPREL) 0xb6c4
 0x00000011 (REL) 0xb674
 0x00000012 (RELSZ) 80 (bytes)
 0x00000013 (RELENT) 8 (bytes)
 0x6ffffffe (VERNEED) 0xb5a4
 0x6fffffff (VERNEEDNUM) 2
 0x6ffffff0 (VERSYM) 0xb276
 0x00000000 (NULL) 0x0

可以看出,使用了libm.so.6libc.so.6两个库。发现只拷贝这两个库还不够,还需要ld-linux.so.2libgcc_s.so.1,也就是我编译出来的这个busybox需要4个动态库文件。

# cp /opt/crosstools/gcc-3.4.6-glibc-2.3.6/lib/libm.so.6 .
# cp /opt/crosstools/gcc-3.4.6-glibc-2.3.6/lib/libc.so.6 .
# cp /opt/crosstools/gcc-3.4.6-glibc-2.3.6/lib/ld-linux.so.2 .
# cp /opt/crosstools/gcc-3.4.6-glibc-2.3.6/lib/libgcc_s.so.1 .

这样,使用动态库可以节省一半左右的空间,不过效率有所降低。

 

 

 

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