• 详解-制作根文件系统,并使用yaffs,jffs,nfs挂载系统(2)


    1.安装mkyaffsimage, mkyaffs2image命令(用来制作yaffs文件系统)

    第一个命令针对Flash小页512B,第二个针对Flash大页2KB
    首先下载压缩文件 yaffs_source_util_larger_small_page_nand.tar.bz2
    安装mkyaffs2image命令为例:

    tar –xjf yaffs_source_util_larger_small_page_nand.tar.bz2 //解压出yaffs1和yaffs2
    cd /Development_util_ok/yaffs2/utils
    make    //生成mkyaffsimage和mkyaffs2image
    sudo cp mkyaffs2image /usr/local/bin 
    //将mkyaffs2image命令复制到可执行目录路径下

    然后输入mkyaffs2image命令,如果不能运行,则使用chmod命令加可执行属性即可

    2.安装mkfs.jffs2命令(用来制作jffs文件系统)
    首先下载压缩文件mtd-utils-05.07.23.tar.bz2,然后安装步骤如下:

    tar -xf mtd-utils-05.07.23.tar.bz2
    cd mtd-utils-05.07.23/util
    make
    sudo make install

    3.制作文件系统

    3.1 解压安装busybox-1.7.0

    cd busybox-1.7.0
    make menuconfig    

    然后在菜单里进入-> Busybox Settings-> Busybox Library Tuning选上:

    [*] Tab completion //tab补齐命令

    然后输入vi Makefile,找到CROSS_COMPILE字段,后面添加”arm-linux-”:

     接着输入:

    make //编译
    mkdir /work/nfs_root/busybox1.7_fs //创建要安装的文件系统目录 
    make install CONFIG_PREFIX=/work/nfs_root/busybox1.7_fs //指定安装位置

    安装好了后,可以看到busybox1.7_fs/bin里便保存着linux命令,如下图所示:

    3.2构造lib目录(被应用程序调用的C库函数,比如:printf,strcmp,fopen等)

    cd /work/nfs_root/busybox1.7_fs
    mkdir lib //创建lib目录 (存放库函数)
    cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib //进入源目录
    cp *.so* /work/nfs_root/ busybox1.7_fs/lib -d //复制glibc库到lib目录(*:匹配符,-d:表示如果是链接文件,则继续保持链接)

    3.3构造etc目录
    在etc目录下,需要构造以下3个文件

    • etc/inittab :     init进程会根据inittab文件里,来创建其它子进程,比如-/bin/sh进程
    • etc/init.d/rcS: 脚本文件,里面用来执行命令,比如设置网卡,使用mount -a来装载/etc/fstab中的文件系统
    • etc/fstab :       里面保存要被挂载的哪个文件系统,比如proc、sysfs、tmpfs、devpts等系统

    1)构造/etc/inittab

    cd /work/nfs_root/busybox1.7_fs
    mkdir etc/
    vi etc/inittab

    添加以下几句:

    ::sysinit:/etc/init.d/rcS     //内核启动时,执行/etc/init.d/rcS
    console::askfirst:-/bin/sh    //启动console对应的-/bin/sh进程之前,等待用户按enter键,等价于: ::askfirst:-/bin/sh
    ::ctrlaltdel:/sbin/reboot     //按下ctrl+alt+del组合键时,启动reboot命令
    ::shutdown:/bin/umount -a -r  //系统关机前,卸载所有文件系统

    2)构造etc/init.d/rcS

    mkdir etc/init.d/ 
    vi etc/init.d/rcS

    添加以下几句:

    mount -a //装载/etc/fstab中的文件系统
    echo /sbin/mdev > /proc/sys/kernel/hotplug //使/sbin/medv指向hotplug,从而支持热拔插
    mdev -s 
    //使用medv命令将会扫描/sys/class和/sys/block中所有的类设备目录,然后把读取到的dev相关文件自动在/dev创建下的所有设备节点,

    并给rcS文件加上可执行权限:

    sudo chmod +x etc/init.d/rcS //使脚本rcS能够执行命令

    3)构造etc/fstab

    PS: 使用mdev命令需要sysfs、tmpfs、devpts这3个文件系统的支持

    • mdev:   是udev的一个迷你版, 它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及热插拔的功能
    • proc:     虚拟文件系统, 它只存在内存当中,而不占用外存空间, 可以通过proc得到系统的信息,比如运行的每个进程pid便存在/proc里
    • sysfs:    管理虚拟系统,为udev提供设备入口和uevent通道, sysfs类型,需要挂载到/sys目录下
    • tmpfs:   临时文件系统,用来减少对flash频繁读写,tmpfs类型,需要挂载到/dev目录下
    • devpts:  内核虚拟系统, devpts类型,需要挂载到/dev/pts目录下
    mkdir proc/ //创建proc要挂载的目录
    mkdir sys/ //创建sysfs要挂载的目录,
    mkdir dev/pts -p //创建devpts要挂载的目录
    vi etc/fstab

    添加以下几句

    # device mount-point type options dump fsck order
    proc /proc proc defaults 0 0
    tmpfs /tmp tmpfs defaults 0 0
    sysfs /sys sysfs defaults 0 0
    devpts /dev/pts devpts defaults 0 0

    3.4构造其它文件/目录
    1)创建终端文件(dev/console和dev/null)

    sudo mknod -m 660 dev/console c 5 1 
    sudo mknod -m 660 dev/null c 1 3 

    2)创建其它目录

    mkdir mnt tmp root


    4.制作烧写yaffs2

    mkyaffs2image busybox1.7_fs busybox1.7_fs.yaffs2    //使用mkyaffs2image生成yaffs2

    进入uboot烧写:

    nfs 30000000 192.168.1.199:/work/nfs_root/busybox1.7_fs.yaffs2
    nand erase root
    nand write.yaffs 0x30000000 0x260000 $(filesize) 
    // write.yaffs:实现yaffs文件系统镜像的烧写, 如果NandFlash相应的区域有坏块,可以跳过坏块。

    设置启动参数:

    set bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 init=/linuxrc console=ttySAC0
    save

    启动内核:


    5.制作烧写jffs2

    mkfs.jffs2 -n -s 2048 -e 128KiB -d busybox1.7_fs -o busybox1.7_fs.jffs2
    /*-n:表示每块不添加清除标记, -s:size一页大小为2k,  -e:一块大小为128kb
      -d:制作的dir目录,    -o:输出文件 */

    进入uboot烧写:

    nfs 30000000 192.168.1.199:/work/nfs_root/busybox1.7_fs.jffs2
    nand erase root
    nand write.jffs2 0x30000000 0x260000 $(filesize) 
    // write. jffs2 :和yffs原理一样 

    设置启动参数:

    set bootargs noinitrd root=/dev/mtdblock3 rootfstype=jffs2 init=/linuxrc console=ttySAC0
    save

    启动内核:

    6.通过uboot启动nfs系统
    6.1 在内核documentation目录里找到nfsroot.txt文档
    找到nfs服务器地址设置"nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]":

    • server-ip:    服务器(虚拟机)IP地址
    • root-dir:      nfs根目录位置
    • nfs-options:选项,默认可以不填

    找到nfs客户端设置"ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>":

    • client-ip:  客户端(开发板)IP地址
    • server-ip:服务器(虚拟机)IP地址
    • gw-ip:      网关地址,一般都是192.168.1.1
    • netmask:  子网掩码,255.255.255.0
    • hostname:主机名,可以不填
    • device:      网卡设备,默认一个网卡就填eth0
    • autoconf:  自动连接,填off不自动连接

    6.2 所以设置启动参数为

    set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.199:/work/nfs_root/busybox1.7_fs ip=192.168.1.198:192.168.1.199:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 

    启动内核:

    7.在内核里使用mount挂载nfs目录

    mount -t nfs -o nolock,vers=2 192.168.1.199:/work/nfs_root /mnt 
    //mount命令将远端虚拟机/work/nfs_root目录挂载到开发板/mnt目录里
    //nolock:禁用文件锁 vers=2:nfs版本协议2 192.168.1.199:虚拟机地址

    运行出错:

    找到原因是网卡没设置,输入mount前设置即可(也可以直接写入/etc/init.d/rcS):

    ifconfig eth0 up
    ifconfig eth0 192.168.1.198


    8.如果mount挂载/启动nfs系统失败,那么有可能有下面两个原因
    8.1 确定板子是否与虚拟机位于同一网段

    ifconfig eth0 up //开启网关0,连接网线到路由器
    ifconfig eth0 192.168.1.107 //设置ip,与虚拟机ip网段一样,
    ping 192.168.1.106 //与虚拟机ping一下,是否已通


    8.2 确定虚拟机是否能被挂载目录
    要使虚拟机能够被挂载目录,在/etc/exports中添加需要被挂载的目录即可
    例如:

    sudo vi /etc/exports 
    /work/nfs_root *(rw,sync,no_root_squash)            //要被挂载的目录:/work/nfs_root
    sudo /etc/init.d/nfs-kernel-sever restart            //然后输入命令重启nfs服务
  • 相关阅读:
    JVM启动参数小结
    Java 线程池学习
    myeclipse 8.5安装freemarker插件方法
    开源文件比较工具:WinMerge、KDiff3、diffuse
    初探淘宝技术构架
    Java获取IP地址:request.getRemoteAddr()注意
    Spring MVC 教程,快速入门,深入分析
    分布式服务框架 Zookeeper -- 管理分布式环境中的数据
    YARN作业提交流程剖析
    经典的MapReduce1解析
  • 原文地址:https://www.cnblogs.com/lifexy/p/7049743.html
Copyright © 2020-2023  润新知