用 busybox 制作 根文件系统

用busybox制作根文件系统

busybox-1.15.2
下载busybox,网址: http://www.busybox.net/downloads/
解压,进入目录

1.
修改 Makefile 文件,
#CROSS_COMPILE = /home/yhf/crosstools/embedSky-EABI/opt/4.3.3/bin/arm-none-linux-gnueabi-
CROSS_COMPILE = /home/yhf/crosstools/embedSky-EABI/opt/crosstools_3.4.5_softfloat/gcc-3.4.5-
glibc-2.3.6/arm-linux/bin/arm-linux-
ARCH = arm
注意:制作文件系统所用的交叉编译链应该和移植内核时用的一致!!!
此交叉编译链的下载地址
http://bbs.embedsky.net/viewthread.php?tid=630&extra=page%3D1
里面有两个编译链,此处选用不支持EABI的那种

2.
然后输入:#make menuconfig,进入配置单
Busybox Library Tuning --->
            [*] Support for /etc/networks
                   Additional editing keys
            [*]
            [*]    vi-style line editing commands
            (15) History size
            [*]    History saving
                   Tab completion
            [*]
            [*]      Username completion
           [*]   Fancy shell prompts

将在busybox应用里关闭 ionice 选项。
Miscellaneous Utilities     --->
        [ ] ionice
若不去掉这个选项,会出现如下错误
> make[1]: *** [miscutils/ionice.o] Error 1
> make: *** [miscutils] Error 2
配置完毕 ,保存,退出

3.
执行命令:
make
make install
此时在目录下面生成_install目录,进入该目录,
$ ls -l
总用量 12
drwxr-xr-x 2 yhf yhf 4096 2010-01-18 16:33   bin
lrwxrwxrwx 1 yhf yhf     11 2010-01-18 16:33 linuxrc -> bin/busybox
drwxr-xr-x 2 yhf yhf 4096 2010-01-18 16:33   sbin
drwxr-xr-x 4 yhf yhf 4096 2010-01-18 16:29   usr
此时,busybox已经完成了任务
/************************************************************************/


制作文件系统

1.
建立目录fsv2.0
将busybox 目录里_install目录下的内容都拷到此目录下

2.
使用glibc库!(注意库的位置!)
在fsv2.0 下建立目录 lib
拷贝库(从交叉编译链里拷)
yhf@yhf-desktop:~/crosstools/embedSky-EABI/opt/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-
linux/arm-linux/lib$ cp ./*so.* /home/yhf/rootfs-new/fsv2.0/lib/
yhf@yhf-desktop:~/crosstools/embedSky-EABI/opt/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-
linux/arm-linux/lib$rm -f ./libwv* ./libuniconf*

3.
在fsv2.0 下建立目录 etc
建立文件
inittab,init.d/rcS,fstab
文件内容如下:
inittab
# /etc/inittab
::sysinit:/etc/init.d/rcS
ttySAC0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
init.d/rcS
#!/bin/sh
ifconfig eth0 192.168.1.17
mount -a
fstab
# device     mount-point      type options         dump fsck order
proc           /proc          proc defaults          0   0
tmpfs          /tmp           tmpfs defaults         0   0

4.
创建dev 目录
进入 dev
执行
$ mknod console c 5 1
$ mknod null c 1 3
$ mknod ttySAC0 c 204 64
$ mknod mtdblock0 b 31 0
$ mknod mtdblock1 b 31 1
$ mknod mtdblock2 b 31 2
$ mknod mtdblock3 b 31 3

注意:
需要改变rcS的属性   #chmod 777 rcS

5.
构建其他目录,这些目录可以是空目录
$ mkdir proc mnt tmp sys root
现在,fsv2.0就是一个非常小的根文件系统了
/************************************************************************/

烧写

1.
制成yaffs格式
退出文件系统fsv2.0 的目录,将工具 mkyaffsimage_2,拷打和fsv2.0 相同的目录
执行如下命令
./mkyaffsimage_2 fsv2.0 fsv2.0.yaffs
注意:fsv2.0.yaffs 的后缀名没有什么约束,这里只是便于记得是yaffs 的映像,完全可以取名为fsv2.0.img

2.
烧写根文件系统映像,将
启动uboot,进入命令行,输入如下命令,fsv2.0.yaffs 放到nfs 目录,
我的电脑IP为211.87.227.75,nfs 目录是 /nfsshare
nfs 0x30008000 211.87.227.75:/nfsshare/fsv2.0.yaffs
nand erase 0x2b0000 0x700000
nand write.yaffs 0x30008000 0x2b0000 0x****
注意:
    2.1 擦除的起始地址是你存放根文件系统映像的分区的起始地址,我的root=/dev/mtdblock3,在第四个分区,
我的分区如下:
Creating 4 MTD partitions on "NAND 32MiB 3,3V 8-bit":
0x000000000000-0x000000080000 : "BootLoader"
0x000000080000-0x0000000b0000 : "params"
0x0000000b0000-0x0000002b0000 : "kernel"
0x0000002b0000-0x0000012b0000 : "rootFS"
    2.2 uboot 需要支持yaffs 的烧写,这个可以看另一篇文章,关于uboot的修改
    2.3 nand write.yaffs 0x30008000 0x2b0000 0x**** 中,最后一个参数是映像的实际大小,
当下载完成的时候会告诉你Bytes transferred = 10858320 (a5af50 hex),如下
Load address: 0x30008000
Loading: #################################################################
    ………………………………
     #################################################################
     #########################################
done
Bytes transferred = 10858320 (a5af50 hex),此处a5af50即为映像大小的16进制表示
所以,此处命令为nand write.yaffs 0x30008000 0x2b0000 0xa5af50

3.
烧写内核映像
将制作内核映像时生成的 zImage,uImage 放到nfs 的目录,执行如下命令
nfs 0x30008000 211.87.227.75:/nfsshare/zImage
go 0x30008000
或者
nfs 0x30010000 211.87.227.75:/nfsshare/uImage
bootm 0x30010000
即可启动kernel

此时,根文件系统已经在Nand Flash 中了,可以挂载FS了,
烧写启动效果
..........................................
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem) on device 31:3.
Freeing init memory: 148K

ifconfig: SIOCSIFADDR: No such device

Please press Enter to activate this console.

/ # ls
bin         lib           mnt        sbin        usr
                          proc       sys
dev         linuxrc
etc         lost+found root          tmp
/ #

至此 根文件系统算是可以使用了
/************************************************************************/

常见错误:
Warning: unable to open an initial console.
Failed to execute /linuxrc.  Attempting defaults...
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
网友解决如下:
创建rootfs过程中,在/dev目录下手动创建如下节点:
mknod -m 660 null c 1 3
mknod -m 660 console c 5 1

Kernel panic - not syncing: Attempted to kill init!
网友解决如下:
Kernel Features  --->
            [*] Use the ARM EABI to compile the kernel                 
            [*]   Allow old ABI binaries to run with this kernel (EXPERIMENTA)
把这个选上就可以了

我的也出现了上面的错误,但是上面的我都已经做了……
我觉得unable to open an initial console,可能是拷入的库不对,检查一下库的位置……
我的在crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/arm-linux/lib
Attempted to kill init,我也一直没解决,但很多网友这样说:
用arm-linux-gcc 4.00以上的编译器做出都 文件系统老是报这个错 ,
而用arm-linux-gcc 3.xx 版本都没有问题,所以我尝试了arm-linux-gcc 3.xx 版本,结果搞定……
所以,不妨试试看……

还有要注意

交叉编译链的一致性,也就是编译内核和制作文件系统(编译busybox时用的)所有的应该是同一个交叉编译链
启动参数的一致性,此处应该和uboot中的bootargs一致,可以在启动uboot后设置环境变量,也可以编译
uboot的时候,修改配置文件(include/configs/my2410.h)
#define CONFIG_BOOTARGS        "noinitrd console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=cramfs mem=32M"
/************************************************************************/

你可能感兴趣的:(kill,library,features,makefile,hex,2010)