busybox(四)完善
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
-
源码包是
zlib-1.2.3.tar.gz
,使用xzf
,不是xjf
来解压.tar xzf zlib-1.2.3.tar.gz
-
配置
./configure --shared --prefix=/usr/
,shared
表示动态库,prefix
表示安装路径 -
make
-
最后安装到系统,
sudo make install
安装jffs2 生成工具
-
源码包是
mtd-utils-05.07.23.tar.bz2
,先解压tar xjf mtd-utils-05.07.23.tar.bz2
-
cd util/
去make
-
安装
sudo make install
-
生成工具
mkfs.jffs2
-
使用生成,不同的
flash
使用不同的参数mkfs.jffs2 -n -s 2048 -e 128KiB -d first_fs -o first_fs.jffs2 -s 一页大小是2048 -e 一个块大小 128KiB -d 源目录 -o 输出
修改命令行识别
-
启动单板,输入
j
使用dnw烧写,启动后发现内核还是以yaff去识别VFS: Mounted root (yaffs filesystem).
-
.需要在启动命令行指定根文件系统的类型
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网络文件系统
设置主机
-
启动
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)
-
重启主机
NFS
,sudo /etc/init.d/nfs-kernel-server restart
-
showmount -e
即可查看已经声明过的可被挂载的目录 -
尝试使用主机自己挂载自己的
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
设置单板(手动挂载)
-
查询设置ip
ifconfig eth0 up ifconfig eth0 192.168.5.200
-
新建
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下原有数据将会被隐藏,无法找到)
-
在主机新建一个文件
echo hello >test.txt
,单板可以马上看到,在单板更改文件echo mcu > test.txt
,主机也能看到 -
注意看下
etc/init.d/rcS
里面是否有ip配置,如果有,可以删除或者改成对的.光盘的文件有设置这个,如果复制过来需要修改
NFS启动
上述方式是先挂载了FLASH的文件系统,然后挂载另一个文件系统,下面尝试使用NFS文件系统为根文件系统
-
命令行参数 ,具体格式在
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>
-
查看之前的启动参数
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
-
运行提示
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
-
可以在主机直接使用
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上使用命令安装即可,
- 主机安装NFS
sudo apt-get install nfs-kernel-server
sudo vi /etc/exports
showmount -e
即可查看已经声明过的可被挂载的目录sudo /etc/init.d/nfs-kernel-server status
即可查看nfsd是否正在运行- 光盘提供的文件系统中
etc/init.d/rcS
文件中已经默认添加了设置开发板IP的命令,如果你不需要这个IP或者跟你的网段不同,可以修改以符合自己的需要。光盘里提供的文件系统都是用arm-linux-gcc 3.4.5版本制作的),因此你必须使用2.6.22.6的内核来启动,否则无法挂载文件系统。