利用busybox制作yaffs2 根文件系统镜像

编译busybox需要用arm-linux-gcc3.XX 编译器,用 arm-unknown-linx-gnueabi-gcc会出问题。


1.http://busybox.net/下载busybox-1.17.2源码包解压后打上最新版本补丁。进入目录,修改Makefile

164行左右修改CROSS_COMPILE := arm-linux-

189行左右改成ARCH := arm


2.修改源代码

修改networking/interface.c文件,其中添加:

#defineARPHRD_INFINIBAND 32


修改networking/libiproute/ipaddress.c


166行附近加入#ifdef IFLA_OPERSTATE

printf("master%s ", ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));

}

#endif

#ifdefIFLA_OPERSTATE

if(tb[IFLA_OPERSTATE]) {

staticconst char operstate_labels[] ALIGN1 =

"UNKNOWN\0""NOTPRESENT\0""DOWN\0""LOWERLAYERDOWN\0"


175行附件加入#endif

*(uint8_t*)RTA_DATA(tb[IFLA_OPERSTATE])));

}

#endif

if(G_filter.showqueue)

print_queuelen((char*)RTA_DATA(tb[IFLA_IFNAME]));


修改networking/libiproute/iplink.c(最左边是行数 )



274 274 return ipaddr_list_or_flush(argv, 0);

275 275 }

276 276

277 #ifdef IFLA_LINKINFO

277 278 #ifndef NLMSG_TAIL

278 279 #define NLMSG_TAIL(nmsg) \

279 280 ((struct rtattr *) (((void *) (nmsg)) +NLMSG_ALIGN((nmsg)->nlmsg_len)))

… …

360 361 return 2;

361 362 return 0;

362 363 }

364#endif

363 365

364 366 /* Return value becomes exitcode. It's okay to not return at all*/

365 367 int do_iplink(char **argv)

366 368 {

367 369 static const char keywords[] ALIGN1 =

370#ifdef IFLA_LINKINFO

368 371 "add\0""delete\0""set\0""show\0""lst\0""list\0";

372#else

373 "set\0""show\0""lst\0""list\0";

374#endif

369 375 if (*argv) {

370 376 smalluint key = index_in_substrings(keywords,*argv);

371 377 if (key > 5) /* invalid argument */

372 378 bb_error_msg_and_die(bb_msg_invalid_arg,*argv, applet_name);

373 379 argv++;

380#ifdef IFLA_LINKINFO

374 381 if (key <= 1) /* add/delete */

375 382 return do_change(argv, key ? RTM_DELLINK: RTM_NEWLINK);

376 383 else if (key == 2) /* set */

384#else

385 if (key == 0) /* set */

386 #endif

377 387 return do_set(argv);

378 388 }

379 389 /* show, lst, list */



3.目录下执行makemenuconfig 进入配置单


BusyboxSettings --->

BuildOptions --->

[*]Build BusyBox as a static binary (no shared libs) //这里编译为静态库

[] Build with Large File Support //这里要去掉这一项

()Cross Compiler perfix //设置交叉编译器路径

InstallationOptions --->

[*]Don't use /usr //不安装到系统的usr目录下,以解压目录下的_install来代替

LinuxSystem Utilities --->

[] mkfs_ext2

[] mkfs_vfat //这两项不选,否则编译会报错

别的选项工具自己需要进行选择

MiscellaneousUtilities --->

[] ionice //去掉,否则编译报错

其他选项根据个人需要

NetworkingUtilities --->

可以去除一些不必要的选项


保存配置文件为.config


4.完成后编译

make

makeinstall

最终在_install文件夹下生存了工具包


5.制作文件系统

新建一个目录root

_install目录下的文件都复制过来,并建立相关目录

mkdirroot

cp-arf busybox-1.17.2/_install/* root/

cdroot

mkdirdev etc home lib mnt opt proc tmp var

向各目录中添加文件系统所需的目录或文件,

这里要注意各种文件的权限,一般都设为 777, 命令是

chmod777 文件名”


dev目录,创建两个设备文件:

#mknodconsole c 5 1

#mknodnull c 1 3


etc目录,创建以下文件:

group


root:*:0:

daemon:*:1:

bin:*:2:

sys:*:3:

adm:*:4:

tty:*:5:

disk:*:6:

lp:*:7:lp

mail:*:8:

news:*:9:

uucp:*:10:

proxy:*:13:

kmem:*:15:

dialout:*:20:

fax:*:21:

voice:*:22:

cdrom:*:24:

floppy:*:25:

tape:*:26:

sudo:*:27:

audio:*:29:

ppp:x:99:

500:x:500:plg

501:x:501:fa


inittab文件:

#/etc/inittab

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

console::askfirst:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount-a -r


mime.types暂时为空


passwd:系统密码文件,内容如下:

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

ftp::14:50:FTPUser:/var/ftp:

bin:*:1:1:bin:/bin:

daemon:*:2:2:daemon:/sbin:

nobody:*:99:99:Nobody:/:

gcx::502:502:LinuxUser,,,:/home/gcx:/bin/sh


sysconfig/HOSTNAME:主机名称

EMA2440


fstab:系统挂载文件系统列表

#device mount-point type options dump fsck order

none /proc proc defaults 0 0

none /dev/pts devpts mode=0622 0 0

tmpfs /dev/shm tmpfs defaults 0 0


init.d/rcS:系统启动加载项

#!/bin/sh

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

runlevel=S

prevlevel=N

umask022

exportPATH runlevel prevlevel

#

# TrapCTRL-C &c only in this shell so we can interrupt subprocesses.

#

/bin/mount-t proc none /proc

/bin/mount-t tmpfs none /tmp

/bin/mount-t tmpfs none /var

/bin/mkdir-p /var/log

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


mdev.conf:mdev 设备配置文件,暂时为空。

net.conf:网络配置文件,暂时为空。


profile:用户环境配置文件,内容如下:

# Ashprofile

# vim:syntax=sh

# Nocore files by default

#ulimit-S -c 0 > /dev/null 2>&1

USER="`id-un`"

LOGNAME=$USER

PS1='[\u@\h\W]\# '

PATH=$PATH:/usr/local/bin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

HOSTNAME=`/bin/hostname`

exportUSER LOGNAME PS1 PATH LD_LIBRARY_PATH


resolv.conf:DNS 配置文件,内容如下:

nameserver61.144.56.100

至此dev目录内容结束


"home"目录:创建一个gcx 目录,etc 目录 passwd文件中的 gcx 相对应

"lib"目录:这个里面放的都是库文件,直接从交叉编译器的库文件目录中拷贝过来:

cp-arf /usr/local/arm/3.4.1/arm-linux/arm-linux/lib/*so*/home/hu/development/root/lib/

为了适当缩减目录大小,可只拷贝常用的库文件


6使用yaffs制作工具制作文件系统镜像

下载工具mkyaffs2image.tgz

mkyaffs2image解压缩到development目录

./mkyaffs2imageroot/ root.bin

镜像制作完成


7.u-boot下载镜像到开发板

启动开发板,使其停在uboot 命令行下,并让其交叉网线连到开发主机,执行下面的命令:

tftp30008000 root.bin

//tftpyaffs2文件系统下载到内存的 0x30008000位置


nanderase 0x250000 0x3dac000

//擦除Nand的文件系统分区


nandwrite.yaffs2 0x30008000 0x250000 0x8f5c20 //将内存中的yaffs2文件系统写入Nand的文件系统分区,注意这里

0x8f5c20yaffs2文件系统的实际大小(可以在tftp传送完后可以看到),要写正确,否则会形成假坏块


至此,文件系统移植成功,用root=/dev/mtdblock2init=/linuxrc console=ttySAC0 rootfstype=yaffs mem=64Mrw作为启动参数即可通过yaffs2文件系统启动内核。


本文部分参考了以下博客:

http://blog.csdn.net/huihui1988/article/details/5867067

你可能感兴趣的:(list,Path,library,makefile,编译器,下载工具)