busybox(四)完善

目录

  • busybox(四)完善
    • proc挂载
      • 手动挂载
      • proc解析
      • 使用脚本自动挂载
      • 使用mount-a挂载
    • udev/mdev 挂载
    • 使用jffs2 文件系统格式
      • 安装zlib
      • 安装jffs2 生成工具
      • 修改命令行识别
    • NFS网络文件系统
      • 设置主机
      • 设置单板(手动挂载)
      • NFS启动
      • FAQ

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. 命令行参数 ,具体格式在linux\Documentation\nfsroot.txt中有说明.或者直接搜索root nfs mount

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

    nfsroot=[:][,]
    ip=::::::
  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的内核来启动,否则无法挂载文件系统。

转载于:https://www.cnblogs.com/zongzi10010/p/10023719.html

你可能感兴趣的:(busybox(四)完善)