韦东山第11课-构建根文件系统busybox、启动参数

2019-07-12 21:56发布

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成功挂载。