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

来源:互联网 发布:mac os 顶部菜单栏 编辑:程序博客网 时间:2024/05/31 19:41

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

<id>:<runlevels>:<action>:<process>

例如:

ttySAC0::askfirst:-/bin/sh

对于Busybox init进程,上述各个字段作用如下:

<id>: 表示这个子进程要使用的控制台(既标准输入、标准输出、标准错误设备)。若果省略,则使用与init进程一样的控制台

<runlevels>:对于busybox init程序,这个字段没有意思,可以省略。

<action>:表示init进程如何控制这个子进程。

<process>:要执行的程序,它可以只可执行程序,也可以是脚本

如果<process>字段前有“-”字符,这个程序被称为“交互的”

所以:::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=[<server-ip>:]<root-dir>[,<nfs-options>]

ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>

解析为(附带了输入的内容):

改后的信息: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成功挂载。







原创粉丝点击