zoukankan      html  css  js  c++  java
  • busybox(四)完善


    title: busybox(四)完善
    tag: arm
    date: 2018-11-14 19:22:57

    busybox(四)完善

    proc挂载

    手动挂载

    在Linux中存在着一类特殊的伪文件系统,用于使用与文件接口统一的操作来完成各种功能,例如ptyfs、devfs、sysfs和procfs。procfs是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就可以简单直接的通过echo或cat这样的文件操作命令对系统信息进行查取和调整了。

    尝试使用ps命令来查看当前单板的进程,发现不能使用,这是因为proc文件系统还未挂载,

    # ps
      PID  Uid        VSZ Stat Command
    ps: can't open '/proc': No such file or directory
    

    尝试手动挂载

    mkdir proc 
    mount -t proc none /proc
    ps 即可查看
    

    使用man mount 查看下帮助,使用/proc搜索下,发现使用-t是挂载虚拟文件系统的意思

    mount -t type device dir
    对于proc文件系统来说,它没有设备,proc filesystem根本没有处理dev_name这个参数,所以传什么都没有影响,只影响你的mount命令输出。好的实践应该将设备名指定为nodev。 
    参考链接 https://www.zhihu.com/question/263885160
    

    然后我们使用reboot重启系统,发现这次虽然有proc文件夹,但是没有自动挂载,所以也不能再次正确显示

    proc解析

    打开proc目录,发现里面有按数字命名的文件夹,他实际上就是进程号.我们打开文件夹1,查看fd文件夹,其文件1,2,3分别指向了标准输出输入和错误

    # cd /proc/1/fd
    # ls -l
    lrwx------    1 0        0              64 Jan  1 00:21 0 -> /dev/console
    lrwx------    1 0        0              64 Jan  1 00:21 1 -> /dev/console
    lrwx------    1 0        0              64 Jan  1 00:21 2 -> /dev/console
    

    使用脚本自动挂载

    参考下默认的配置文件中的脚本::SYSINIT:/etc/init.d/rcS,手动添加

    ::CTRLALTDEL:reboot
    ::SHUTDOWN:umount -a -r
    ::RESTART:init
    ::ASKFIRST:-/bin/sh:
    tty2::ASKFIRST:-/bin/sh
    tty3::ASKFIRST:-/bin/sh
    tty4::ASKFIRST:-/bin/sh
    ::SYSINIT:/etc/init.d/rcS
    

    默认的配置表的路径在/etc/inittab,这个是在busybox代码中的parse_inittab函数体现的.修改为:

    #/etc/inittab
    console::askfirst:-bin/sh
    ::sysinit:/etc/init.d/rcS #这个是本次新增的
    

    注意,这里的sysinit是小写的,大写是不识别的,提示Bad inittab entry: ::SYSINIT:/etc/init.d/rcS

    然后创建所需的脚本mount -t proc none /proc

    #/etc/init.d/rcS
    mount -t proc none /proc
    

    手动先创建proc文件夹,加上可执行权限

    mkdir proc
    chmod +x rcS
    

    然后制作映像文件启动

    mkyaffs2image  2th 2th.yaffs2
    

    使用mount-a挂载

    重新烧录最原始的文件系统,手动使用mount -a挂载,这个命令依赖于etc/fstab文件【实际上一般的mount命令也受它的控制】,实际的格式如下:

    device mount-ponit type options dump fsck
    设备名,对于proc可以为任意值 挂载点 文件系统类型 挂载参数,逗号隔开
    proc /proc proc defaults 0 0

    手动建立文件 etc/fstab

    # etc/fstab
    
    #device mount-ponit type options dump fsck
    proc /proc proc defaults    0 0
    

    手动创建文件夹proc,执行挂载,成功

    # mkdir proc
    # mount -a
    # ps
    

    自动挂载

    同样的我们可以使用etc/init.d/rcS来实现自动挂载,对rcS添加可执行权限

    # /etc/inittab
    console::askfirst:-bin/sh
    ::sysinit:/etc/init.d/rcS
    
    # /etc/init.d/rcS
    mount -a
    
    # etc/fstab
    	#device mount-ponit type options dump fsck
    proc /proc proc defaults    0 0
    

    手动创建文件夹proc后制作映像文件mkyaffs2image 3th/ 3th.yaffs2

    然后可以查看下挂载了什么文件系统

    # cat proc/mounts
    rootfs / rootfs rw 0 0
    /dev/root / yaffs rw 0 0
    proc /proc proc rw 0 0
    

    udev/mdev 挂载

    dev目录下对应着设备和驱动,我们最开始使用手动创建的形式添加.Linux下使用udev来实现自动创建dev下的设备节点.在busybox有其简化般般mdev.在busybox下搜索mdev的帮助docs/mdev.txt.

    Here's a typical code snippet from the init script:
    [1] mount -t sysfs sysfs /sys
    挂载sysfs文件系统
    [2] echo /bin/mdev > /proc/sys/kernel/hotplug
    [3] mdev -s
    
    Of course, a more "full" setup would entail executing this before the previous
    code snippet:
    [4] mount -t tmpfs mdev /dev
    [5] mkdir /dev/pts
    [6] mount -t devpts devpts /dev/pts
    

    先创建sysfs文件夹mkdir sys

    然后实现挂载文件系统,使用mount -a根据etc/fstab去挂载[1,4,6]

    # etc/fstab
    
    #device mount-ponit type options dump fsck
    proc    /proc   proc    defaults    0   0     
    sysfs   /sys    sysfs   defaults    0   0
    tmpfs   /dev    tmpfs   defaults    0   0	
    

    修改脚本文件/etc/init.d/rcS

    # /etc/init.d/rcS
    #这里去挂载`fstab`的文件  #1,4
    mount -a
    #5
    mkdir /dev/pts
    #6
    mount -t devpts devpts /dev/pts
    #2,支持热拔插,hotplug指向mdev,自动创建设备节点
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    #3创建内核原有的设备系统
    mdev -s								
    

    制作文件系统后烧入

     mkyaffs2image 4th/ 4th.yaffs2
    

    使用ls dev可以看到自动生成很多节点设备

    # ls dev
    console          ptyrf            tty17            ttyq7
    dsp              ptys0            tty18            ttyq8
    event0           ptys1            tty19            ttyq9
    ----......
    

    再使用cat /proc/mounts 查看已经挂载的文件系统

    # cat proc/mounts
    rootfs / rootfs rw 0 0
    /dev/root / yaffs rw 0 0
    proc /proc proc rw 0 0
    sysfs /sys sysfs rw 0 0
    tmpfs /dev tmpfs rw 0 0
    devpts /dev/pts devpts rw 0 0
    

    使用jffs2 文件系统格式

    这个文件格式一般使用在nor上,当然也可以在nand使用.zlib 是个压缩库,jffs2是一个压缩的文件系统.jffs2需要用到zlib工具

    安装zlib

    1. 源码包是zlib-1.2.3.tar.gz,使用xzf,不是xjf来解压.tar xzf zlib-1.2.3.tar.gz

    2. 配置./configure --shared --prefix=/usr/ ,shared 表示动态库,prefix表示安装路径

    3. make

    4. 最后安装到系统,sudo make install

    安装jffs2 生成工具

    1. 源码包是mtd-utils-05.07.23.tar.bz2,先解压tar xjf mtd-utils-05.07.23.tar.bz2

    2. cd util/make

    3. 安装 sudo make install

    4. 生成工具mkfs.jffs2

    5. 使用生成,不同的flash使用不同的参数

      mkfs.jffs2 -n -s 2048 -e 128KiB -d  first_fs -o  first_fs.jffs2
      
      -s  一页大小是2048
      -e  一个块大小 128KiB
      -d  源目录
      -o 输出
      

    修改命令行识别

    1. 启动单板,输入j使用dnw烧写,启动后发现内核还是以yaff去识别VFS: Mounted root (yaffs filesystem).

    2. .需要在启动命令行指定根文件系统的类型

      Enter your selection: q
      OpenJTAG> print
      bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
      bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
      baudrate=115200
      ethaddr=08:00:3e:26:0a:5b
      ipaddr=192.168.7.17
      serverip=192.168.7.11
      netmask=255.255.255.0
      mtdids=nand0=nandflash0
      mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)
      bootdelay=10
      stdin=serial
      stdout=serial
      stderr=serial
      partition=nand0,0
      mtddevnum=0
      mtddevname=bootloader
      
      Environment size: 444/131068 bytes
      

      设定根文件系统格式并保存rootfstype=jffs2

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

      输入boot启动VFS: Mounted root (jffs2 filesystem).成功启动

    NFS网络文件系统

    设置主机

    1. 启动NFS服务,使得主机上的文件夹允许被单板访问挂载.NFS服务在/etc/exports上配置,在该文件上增加新建的文件系统的路径sudo vi /etc/exports ,添加内容,其中*表示允许所有文件

       /work  		*(rw,sync,no_root_squash,no_subtree_check)
       /home/book/stu/fs/5th  *(rw,sync,no_root_squash,no_subtree_check)
      
    2. 重启主机NFS, sudo /etc/init.d/nfs-kernel-server restart

    3. showmount -e 即可查看已经声明过的可被挂载的目录

    4. 尝试使用主机自己挂载自己的NFS文件夹,主机自身ip为192.168.5.107,然后可以在mnt下看到文件

      
      book@100ask:~/stu/fs$ sudo mount -t nfs 192.168.76.135:/home/book/stu/fs/5th  /mnt
      book@100ask:~/stu/fs$ ls /mnt
      bin  dev  etc  lib  linuxrc  proc  sbin  sys  usr
      
      

    设置单板(手动挂载)

    1. 查询设置ip

      ifconfig eth0 up
      ifconfig eth0 192.168.5.200
      
    2. 新建mnt文件夹,尝试挂载

      mkdir /mnt
      mount -t nfs -o nolock 192.168.5.222:/home/book/stu/fs/5th /mnt
      
      
      mount :挂载命令 
      nfs :使用的协议 
      nolock :不阻塞  
      IP : NFS服务器的IP(NFS服务器运行在哪个系统上,就是哪个系统的IP) 
      /work/nfs: 要挂载的目录(Ubuntu的目录) 
      /mnt : 要挂载到的目录(开发板上的目录,注意挂载成功后,/mnt下原有数据将会被隐藏,无法找到)
      
    3. 在主机新建一个文件echo hello >test.txt,单板可以马上看到,在单板更改文件 echo mcu > test.txt,主机也能看到

    4. 注意看下etc/init.d/rcS 里面是否有ip配置,如果有,可以删除或者改成对的.光盘的文件有设置这个,如果复制过来需要修改

    NFS启动

    上述方式是先挂载了FLASH的文件系统,然后挂载另一个文件系统,下面尝试使用NFS文件系统为根文件系统

    1. 命令行参数 ,具体格式在linuxDocumentation fsroot.txt中有说明.或者直接搜索root nfs mount

      https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt

      nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
      ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
      
    2. 查看之前的启动参数bootargs,修改省略hostname

      # 原来的
      # bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
      set bootargs noinitrd root=/dev/nfs nfsroot=192.168.5.222:/home/book/stu/fs/5th ip=192.168.5.200:192.168.5.222:192.168.5.222:255.255.255.0::eth0:off  init=/linuxrc console=ttySAC0
      
    3. 运行提示

      
      IP-Config: Complete:
            device=eth0, addr=192.168.5.200, mask=255.255.255.0, gw=192.168.5.222,
           host=192.168.5.200, domain=, nis-domain=(none),
           bootserver=192.168.5.222, rootserver=192.168.5.222, rootpath=
      Looking up port of RPC 100003/2 on 192.168.5.222
      Looking up port of RPC 100005/1 on 192.168.5.222
      
      
    4. 可以在主机直接使用arm-linux-gcc编译,产生的程序直接在单板运行

    FAQ

    NFS:Network File System(网络文件系统),NFS只是一种文件系统,本身并没有传输功能,是基于RPC协议实现的,为C/S架构。也就是说,NFS也只是文件系统而已,与jffs2,yaffs,ext4等是一类东西。但是NFS的特殊之处在于,它可以通过网络来挂载,而不用烧写到设备上。这就跟网吧里使用PXE启动来搭建无盘系统一样:每台电脑并没有安装硬盘,而是直接通过PXE启动服务器上的系统,看起来每台电脑都有硬盘,其实都是挂载服务器上的硬盘。

    NFS怎么用? 前边已经介绍过,NFS是C/S架构,也就是说,使用NFS需要搭建服务器和客户端。客户端很简单,自带的uboot已经添加了对NFS客户端的支持,我们只需要管NFS服务器。这个服务器其实跟TFTP、Samba、 Ftp服务器是一类的东西,直接在Ubuntu上使用命令安装即可,

    1. 主机安装NFS
    sudo apt-get install nfs-kernel-server
    sudo vi /etc/exports
    
    1. showmount -e 即可查看已经声明过的可被挂载的目录
    2. sudo /etc/init.d/nfs-kernel-server status 即可查看nfsd是否正在运行
    3. 光盘提供的文件系统中etc/init.d/rcS文件中已经默认添加了设置开发板IP的命令,如果你不需要这个IP或者跟你的网段不同,可以修改以符合自己的需要。光盘里提供的文件系统都是用arm-linux-gcc 3.4.5版本制作的),因此你必须使用2.6.22.6的内核来启动,否则无法挂载文件系统。
  • 相关阅读:
    [Python]执行Linux命令
    [Linux]命令返回值以及错误对照表
    [ERROR]pip insall pyodbc
    [CentOS7]安装ODBC Driver 17 for SQL Server
    [Python]获取字典所有值
    [Python]判断变量类型是否为List列表
    十分钟了解pandas
    Docker容器化技术(上)
    C语言位域
    PAT基础级-钻石段位样卷2-7-7 危险品装箱 (25 分)
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/10023719.html
Copyright © 2011-2022 走看看