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

busybox(四)完善的更多相关文章

  1. Docker运行操作系统环境(BusyBox&Alpine&Debian/Ubuntu&CentOS/Fedora)

    目前常用的Linux发行版主要包括Debian/Ubuntu系列和CentOS/Fedora系列.前者以自带软件包版本较新而出名:后者则宣称运行更稳定一些.选择哪个操作系统取决于读者的具体需求.同时, ...

  2. python实现自动发送微博,当自己写博客时同步上去。

    一.需求: 自己在github上搭建一个基于Jekyll的博客(http://beginman.cn/),每次写完博客后就要push上去,博客写的再好,基本上没人访问,为了增加访问量,就想利用起来微博 ...

  3. MODBUS-RTU学习

    一 RTU比ASCII传输密度高.参数格式:起始位+8BITS数据位+校验位+停止位. 1.1校验默认为偶校验,建议为无校验,测试要多1个停止位(即停止位为2位) 1.2发送顺序为从左到右LSB-&g ...

  4. docker_flannel

    目录 一.安装etcd 安装 运行 验证 二.安装和配置 flannel 三. Docker 中使用 flannel 配置 Docker 连接 flannel 容器连接到 flannel 网络 四.f ...

  5. Docker微容器Alpine Linux

    Alpine 操作系统是一个面向安全的轻型 Linux 发行版. 它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功 ...

  6. 跟我学SpringCloud | 第十八篇:微服务 Docker 化之基础环境

    1. 容器化 Docker 的横空出世,给了容器技术带来了质的飞跃,Docker 标准化了服务的基础设施,统一了应用的打包分发,部署以及操作系统相关类库等,解决了测试生产部署时环境差异的问题.对于运维 ...

  7. Linux 发行版本简介

    1991年的10月5日Linus Benedict Torvalds在comp.os.minix 新闻组上发布消息,正式向外宣布他自行编写的完全自由免费的内核诞生(Freeminix-like ker ...

  8. 从容器镜像的选择-alpine 说起

    在 容器崛起之前,Alpine 还是个无名之辈,可能是因为大家并不是很关心操作系统本身的大小,毕竟大家只关心业务数据和文档,程序.库文件和系统本身的大小通常可以忽略不计. 容器技术席卷整个软件产业之后 ...

  9. coreseek实战(四):php接口的使用,完善php脚本代码

    coreseek实战(四):php接口的使用,完善php脚本代码 在上一篇文章 coreseeek实战(三)中,已经能够正常搜索到结果,这篇文章主要是把 index.php 文件代码写得相对完整一点点 ...

随机推荐

  1. errno 的使用

    error是一个包含在<errno.h>中的预定义的外部int变量,用于表示最近一个函数调用是否产生了错误.若为0,则无错误,其它值均表示一类错误. perror()和strerror() ...

  2. 播放器的书签--推荐使用Potplayer

    VLC Player https://www.vlchelp.com/skipping-and-playing-audio-and-video-portions-in-vlc/ PotPlayer  ...

  3. 先vue-cli,再nuxt试试路由

    https://segmentfault.com/a/1190000007933349

  4. tmpfs使用探讨

    一. 什么是tmpfs? tmpfs是一种基于内存的文件系统,它和虚拟磁盘ramdisk比较类似,但不完全相同,和ramdisk一样,tmpfs可以使用RAM,但它也可以使用swap分区来存储. 而且 ...

  5. ElasticSearch(八):elasticsearch.yml配置说明

    集群名称:cluster.name: my-application确保在不同的环境中的集群的名称不重复,否则,节点可能会连接到错误的集群上 节点名称:node.name: node-1默认情况下,当节 ...

  6. android开发学习 ------- 关于getSupportFragmentManager()不可用的问题

    在Android开发中,少不了Fragment的运用. 目前在实际运用中,有v-4包下支持的Fragment以及app包下的Fragment,这两个包下的FragmentManager获取方式有点区别 ...

  7. MongoDB 创建基础索引、组合索引、唯一索引以及优化

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...

  8. NodeJS之异常处理

    1. 为什么要处理异常? 如果我们不处理异常的话,直接会导致程序奔溃,用户体验比较差,因此我们要对异常进行处理,当出现异常的情况下,我们要给用户一个友好的提示,并且记录该异常,方便我们排查. 2. 在 ...

  9. JS--编码规范

    1. 请修复给定的 js 代码中,函数定义存在的问题 function functions(flag) { if (flag) { function getValue() { return 'a'; ...

  10. oracle--数据筛选

    一:当统一社会信用代码或者工商注册号两个字段中,有的时候只有一个字段含有数据,但是所取的值必须要拥有字段,这个时候,语句为下: select t.entname, case when t.unisci ...