1 编译busybox:
make menuconfig (具体见《嵌入式linux应用开发完全手册》P347
make
book@book-desktop:~/workspace/jz2440/systems/busybox-1.7.0$ make CONFIG_PREFIX=../firstbusybox install //将文件系统安装在该目录下
之后要构建文件系统
{
2 构建文件系统:(详细见《嵌入式linux开发手册 P352)
2.1 创建lib目录,拷贝×.so× 到lib P350
2.2 构建 etc 目录:
2.2.1 etc/initab
//init进程根据/etc/inittab 文件来创建其它子进程,比如调用脚本配置ip(/etc/init.d/rcS),挂接文件系统(),启动shell
{
(initab中的没一条都是一个子进程)
# /etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh //用s3c2410_serial0这个设备启动shell
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
:::
例如:
ttySAC0::askfirst:-/bin/sh
对于Busybox init进程,上述各个字段作用如下:
: 表示这个子进程要使用的控制台(既标准输入、标准输出、标准错误设备)。若果省略,则使用与init进程一样的控制台
:对于busybox init程序,这个字段没有意思,可以省略。
:表示init进程如何控制这个子进程。
:要执行的程序,它可以只可执行程序,也可以是脚本
如果字段前有“-”字符,这个程序被称为“交互的”
所以:::sysinit:/bin/sh 使用的是和init进程一样的控制台
而我们的console使用的是ttySAC0,所以就报错了。
}
2.2.2 etc/init.d/rcS //用shell命令执行脚本,其中用 mount -a 根据 etc/fstab中的信息挂载; 开机启动的命令
{
内容:
{
#!/bin/sh //表示是一个脚本文件,运行时用/bin/sh解析
ifconfig eth0 192.168.1.17
mount -a //挂接/etc/fstab 文件所指的所有文件
}
}
2.2.3 etc/fstab // 貌似会开机自动运行
{
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
}
etc目录总结:init程序调用/etc/inittab ;/etc/inittab 调用/etc/fstab ;
3 构建dev目录:
方法一:静态创建设备文件:sudo mknod console c 5 1 ;sudo mknod null c 1 3 ; 等
方法二:使用mdev创建设备文件:
{
改进:udev机制:自动创建/dev/设备(p354)
mdev是udev的简化版;在busybox中搜索mdev获得相关信息
}
构建其他目录:
}
{
4 制作文件系统镜像:
方法一:制作ysffs2映像文件(书上是ysffa1的文件 针对小页的nand flash用的 一页512字节; 现在是2048,是大页的,要用ysffa2)
之后要构建文件系统
book@book-desktop:/work/system$ tar xjf yaffs_source_util_larger_small_page_nand.tar.bz2
book@book-desktop:/work/system/Development_util_ok/yaffs2/utils$ make menuconfig;make
book@book-desktop:/work/system/Development_util_ok/yaffs2/utils$ sudo cp mkyaffs2image /usr/local/bin/
book@book-desktop:/work/system/Development_util_ok/yaffs2/utils$ sudo chmod +x /usr/local/bin/mkyaffs2image
book@book-desktop:~/workspace/jz2440/systems$ mkyaffs2image firstbusybox firstbusybox.yaffs2
得到yaffs2文件系统 firstbusybox.yaffs2
方法二:制作jffs2 印象文件:
{
P360
会出现错误;VFS;mounted root (yaffs filesystem).
需要指定根文件系统的类型:set rootfstype=jffs2;saveenv;
制作海思的jffs2:
hisilicon$ mkfs.jffs2 -d ./rootfs -l -e 0x40000 -o jffs2-root.img
其中, mkfs.jffs2
工具可以从互联网中下载,也可以在 SDK
包中找到。 rootfs 为之前已
经制作好的根文件系统。参数说明如
经制作好的根文件系统。参数说明如表4-2所示。
表4-2 JFFS2 参数表
参数
说明
d
指定根文件系统
l
little-endian 小端模式
e
Flash 的块大小
o
输出映像文件
}
5 启动后挂载网络文件系统NFS:
{
条件:1 服务器允许那个目录被挂载
1.1 (要在/etc/exports中定义这个目录,及添加/home/book/workspace/jz2440/systems/firstbusybox *(rw,sync,no_root_squash));
1.2 重启单板nfs服务 sudo /etc/init.d/nfs-kernel-server restart
1.3 修改文件夹权限: sudo chmod 777 /home/book/workspace/jz2440/systems/firstbusybox -R
1.4 mount -t nfs 10.170.33.245:/home/book/workspace/jz2440/systems/firstbusybox /mnt //本地实验
1.5 本地去挂载:sudo umount /mnt
2 单板去挂载;
mount -t nfs -o nolock, vers=2 192.169.1.19:/work/nfs_root /mnt
}
用nfs网络文件系统启动:
{
写该启动参数:
bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
改为:
在内核源码的 。。/document/nfsroot 中有讲解:
root=/dev/nfs
nfsroot=[:][,]
ip=::::::
解析为(附带了输入的内容):
改后的信息:setenv bootargs noinitrd root=/dev/nfs nfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:off init= /linuxrc console=ttySAC0
(hi3518e参数) setenv bootargs noinitrd root=/dev/nfs nfsroot=10.170.52.106: /home/wooya/work/hi3518e/Hi3518_SDK_V1.0.A.0/package/rootfs_uclib ip=10.170.52.111:10.170.52.106:10.170.1.1:255.255.0.0::eth0:off init= /linuxrc console=ttyAMA0
警示:用nfs挂载虚拟文件系统时,不要在/etc/init.d/rcS 中 开机设置ip地址(如:ifconfig eth0 ×××)
原信息:set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
saveenv
}
ps命令可以参看当前系统什么程序在跑(ps命令是一个虚拟的挂载系统)
要想使用ps命令:mkdir proc;mount -t proc none /proc
改进:udev机制:自动创建/dev/设备
mdev是udev的简化版;在busybox中搜索mdev获得相关信息
6 不同文件系统的启动参数
YAFFS启动参数设置:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3; save //实测有效
jffs2设置启动参数:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2; save
hi3518e启动参数:
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs) '
set bootargs noinitrd root=/dev/nfs nfsroot=10.170.52.106:/home/wooya/work/hi3518e/Hi3518_SDK_V1.0.A.0/package/rootfs_uclibc ip=10.170.12.61(该ip随意设置):10.170.52.106:10.170.1.1:255.255.0.0::eth0:off init=/linuxrc console=ttyAMA0
jz2440启动参数:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)
set bootargs noinitrd root=/dev/nfs nfsroot=10.170.12.158:/work/nfs_root/first_fs ip=10.170.12.61:10.170.12.158:10.170.1.1:255.255.0.0::eth0:off init=/linuxrc console=ttySAC0
set bootargs noinitrd root=/dev/nfs nfsroot=10.170.12.158:/home/book/workspace/jz2440/systems/firstbusybox ip=10.170.12.61:10.170.12.158:10.170.1.1:255.255.0.0::eth0:off init=/linuxrc console=ttySAC0
警示:用nfs挂载虚拟文件系统时,不要在/etc/init.d/rcS 中 开机设置ip地址(如:ifconfig eth0 ×××)
(2) nfs server xx.xx.xx.xx not response,still try
总出现如题所示提示,然后DM9000停止活动,折腾了一下午,原来是由于根文件系统中/etc/init.d/rcS中网络配置部分导致的问题,由于nfs启动参数已经指定了linux的IP、网关等,如果在启动脚本中在设置一次就会导致这个问题,而不是网上说的由于使用UDP(当然这也可能导致出现该问题)。简单地在/etc/init.d/rcS中注释掉网络设置部分后,nfs成功挂载。