回顾:
最小根文件系统的组成:
1- 终端设备: /dev/console, /dev/null 2- init程序,这里指busybox程序 3- 配置文件,这里指/etc/inittab 文件 4- 配置文件指定的应用程序,例如ls, cp, init等 5- C库文件--busybox会用到printf, 需要由c库等其他库文件 ?
本文主要内容:
1- 制作最小根文件系统
2- mdev自动挂载设备
3- etc/init.d/rcS系统初始化脚本
4- 制作NFS文件系统
相关帖子:
根文件系统--代码简单分析_u010743406的博客-CSDN博客
1- 制作最小根文件系统
1.1- 编译busybox
参考:?根文件系统--代码简单分析_u010743406的博客-CSDN博客? “3- busybox编译安装”
本例中busybox安装路径为:/home/lhk/2440_learn/fs/mini_fs
1.2- 创建dev/console, dev/null设备文件
查看系统中/dev/console、/dev/null设备文件。
可知系统中的/dev/console为字符设备,主次设备号分别为;5,1;/dev/null为字符设备,主次设备号分别为;1,3;
root@book-virtual-machine:/home/lhk/2440_learn/fs/mini_fs# ls -l /dev/console /dev/null
crw------- 1 root root 5, 1 3月 4 20:52 /dev/console
crw-rw-rw- 1 root root 1, 3 3月 4 20:52 /dev/null
在mini_fs中创建这两个设备文件:
cd /home/lhk/2440_learn/fs/mini_fs
mkdir /dev
cd /dev
mknod console c 5 1
mknod null c 1 3
chmod 666 null
1.3- 添加配置文件/etc/inittab
在mini_fs中创建/etc/inittab
cd /home/lhk/2440_learn/fs/mini_fs
mkdir etc
cd etc
vi inittab
其中inittab文件内容为:
# cat inittab
console::askfirst:-/bin/sh
1.4- 拷贝C库文件
在韦东山提供的ubuntu环境/work/tools/gcc-3.4.5-glibc-2.3.6路径下存放了C库文件 拷贝/work/tools/gcc-3.4.5-glibc-2.3.6 C库文件到/home/lhk/2440_learn/fs/mini_fs
cd /home/lhk/2440_learn/fs/mini_fs
mkdir lib
cp /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/*.so* ?/home/lhk/2440_learn/fs/mini_fs/lib -d
cp命令使用-d参数,是保持复制文件的链接指向关系,而不是复制源文件。
1.5- 打包文件系统
制作yaffys2格式的文件系统。 yaffys2打包工具源码:\002_JZ2440资料光盘_20200423(免费)\资料光盘\B盘\uboot+kernel+filesystem的镜像源码及补丁\filesystem\yaffs_source_util_larger_small_page_nand.tar.bz2
#1- 将yaffs_source_util_larger_small_page_nand.tar.bz2上传到ubuntu环境
#2- 解压yaffs_source_util_larger_small_page_nand.tar.bz2
tar -jzvf yaffs_source_util_larger_small_page_nand.tar.bz2
#3- 生成打包工具 mkyaffs2image
cd Development_util_ok/yaffs2
make?
#4- 将mkyaffs2image放在指定路径
cp mkyaffs2image /usr/bin
#5- 制作yaffys2格式文件系统
cd /home/lhk/2440_learn/
mkyaffs2image mini_fs mini_fs.yaffys2
1.6- 烧录文件系统
将制作好的文件系统烧录到nandflash上
可以先擦除nandflash上的文件系统,观察系统起不来后,再烧录编译好的文件系统。做个对比验证。
参考:根文件系统--代码简单分析_u010743406的博客-CSDN博客?“1.2- 擦除、烧录文件系统”
开发板起来后,无法运行ps命令
# ps
? PID ?Uid ? ? ? ?VSZ Stat Command
ps: can't open '/proc': No such file or directory
需要在开发板上手动挂载porc设备到/proc路径
mkdir /proc
mount -t proc none /proc
挂载后可以使用ps命令 进入到/proc路径,可以看到内核各个进程的资源使用情况 例如查看系统1号进程的文件句柄使用情况
ls -l /proc/1/fd
lrwx------ ? ?1 0 ? ? ? ?0 ? ? ? ? ? ? ?64 Jan ?1 00:59 0 -> /dev/console
lrwx------ ? ?1 0 ? ? ? ?0 ? ? ? ? ? ? ?64 Jan ?1 00:59 1 -> /dev/console
lrwx------ ? ?1 0 ? ? ? ?0 ? ? ? ? ? ? ?64 Jan ?1 00:59 2 -> /dev/console
查看系统的挂载情况
cat /proc/mounts
# cat /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / yaffs rw 0 0
proc /proc proc rw 0 0
1.7- 自动挂载proc设备
可以将需要自动挂载的设备写到脚本/etc/init.d/rcS /home/lhk/2440_learn/fs/mini_fs路径下执行:
#1- 修改/etc/init.d/rcS脚本
cat /home/lhk/2440_learn/fs/mini_fs/etc/init.d/rcS
console::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
#2- 新增etc/init.d/rcS脚本
cd /home/lhk/2440_learn/fs/mini_fs/
mkdir etc/init.d
mkdir proc
touch etc/init.d/rcS
#etc/init.d/rcS内容如下:
cat etc/init.d/rcS
mount -t proc none /proc
#3- 给etc/init.d/rcS可执行权限
chmod 777 /home/lhk/2440_learn/fs/mini_fs/etc/init.d/rcS
重新编文件系统、烧录到开发板,可以看到开发板可以使用ps命令,也已经挂载了proc设备。
遇到问题:
报错:
starting pid 764, tty '': '/etc/init.d/rcS'
failed: No such file or directory
原因:/etc/init.d/rcS文件在windows上编写,需要转为unix格式。
解决方案:notpad++可以转格式,或者使用dos2unix工具转格式
参考:can't run '/etc/init.d/rcS': No such file or directory解决方法_yuanzhi7的博客-CSDN博客
1.8- mdev自动挂载设备
我们的开发板/dev路径下只有console、null两个设备,我们使用mdev自动挂载设备 另外我们除了可以在etc/init.d/rcS中将要挂载的设备写道脚本,还可以使用fstab挂载设备。
#1- 修改/etc/init.d/rcS脚本
cat /home/lhk/2440_learn/fs/mini_fs/etc/init.d/rcS
console::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
#2- 创建必要路径
cd /home/lhk/2440_learn/fs/mini_fs/
mkdir etc/init.d
mkdir proc root tmp ?mnt sys?
#3- 修改etc/init.d/rcS
#cat etc/init.d/rcS
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
#4- 编写etc/fstab文件
cd /home/lhk/2440_learn/fs/mini_fs/etc
touch fstab
#fatab文件内容 cat fstab
# device ? ? ? ? ? ? ? mount-point ?fs_type ? ?options ? ? ? ? ? ? ?dump ? fsck ?order ?
proc ? ? ? ? ? ? ? ? ? /proc ? ? ? ? proc ? ? ?defaults ? ? ? ? ? ? ?0 ? ? ?0
tmpfs ? ? ? ? ? ? ? ? ?/tmp ? ? ? ? ?tmpfs ? ? defaults ? ? ? ? ? ? ?0 ? ? ?0
sysfs ? ? ? ? ? ? ? ? ?/sys ? ? ? ? ?sysfs ? ? defaults ? ? ? ? ? ? ?0 ? ? ?0
tmpfs ? ? ? ? ? ? ? ? ?/dev ? ? ? ? ?tmpfs ? ? defaults ? ? ? ? ? ? ?0 ? ? ?0
#5- 给予文件可执行权限
chmod 777 /home/lhk/2440_learn/fs/mini_fs/etc/fstab
#6- 重新制作文件系统,烧录到系统
mount -a :会调用etc/fstab文件,根据文件内容挂载设备,etc/fstab内容详见 echo /bin/mdev > /proc/sys/kernel/hotplug ?:配置内核,当有设备热插拔时候调用/bin/mdev mdev -s ?:在/dev路径下生成内核支持的设备 etc/fstab文件内容:第一列为设备名称;第二列为挂载路径;第三列为挂载设备文件类型;第四列及最后暂时不关心。这样配置号后系统会自动挂载设备到对应路径
开发板起来后,发现可以直接应用ps命令,在/dev路径下也可以看到很多系统设备。
mdev是内核的一种设备自动管理机制,etc/fstab文件编写原则参考busybox源码文件mdev.txt文件。
2- NFS网络文件系统
韦东山讲的NFS文件系统感觉只是文件系统通过NFS加载到开发板,并不是把文件系统制作成NFS格式。和之前理解的有点偏差
2.1-?虚机和开发板交互文件:文件系统+NFS服务
原理:虚机开启NFS服务,设置NFS共享路径;开发板挂载虚机的共享路径。实现:
#1- 开发板、虚机位于同一网段,可以互相ping通
注意:在开发板制作文件系统时,/home/lhk/2440_learn/fs/mini_fs/etc/init.d/rcS配置开发板IP。
# cat etc/init.d/rcS?
ifconfig eth0 192.168.31.15
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
#2- 虚机安装NFS服务
sudo apt-get install nfs-kernel-server
#3- 虚机配置NFS共享路径。将路径/home/lhk/2440_learn/fs/nfs_fs添加到/etc/exports
?vi /etc/exports
?
添加后/etc/exports文件内容为:
# cat /etc/exports?
/home/lhk/2440_learn/fs/nfs_fs ? ? ? ?*(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
#4- 开发板烧写文件系统,并配置网络。
挂载虚机提供的路径到mnt路径
# mount -t nfs -o nolock 虚机IP:虚机NFS共享路径 开发板挂载路径
?mount -t nfs -o nolock 192.168.31.18:/home/lhk/2440_learn/fs/nfs_fs /mnt
注意:在开发板制作文件系统时,/home/lhk/2440_learn/fs/mini_fs/etc/init.d/rcS配置开发板IP。
之后,如果虚机/home/lhk/2440_learn/fs/nfs_fs路径创建文件,开发板/mnt路径也可以看到。
感觉这种方式和搭建TFTP服务是一样的效果,参考:搭建TFTP服务
组网方式
自己电脑是小米笔记本,没有有线网卡,只能借助路由器将虚机、开发板设置在同一网段。 开发板、虚机组网方式:
开发板(192.168.31.15)--路由器
小米笔记本(无线网卡设置IP: 192.168.31.3)--路由器
虚机unbuntu设置IP:192.168.31.18
设置完虚机、开发板可以ping通。 参考:2440开发板环境搭建---很重要
其他:自己买了个USB转网口,通过USB转网口设备让开发板直连电脑,发现开发板和虚机ping不同,不知道怎么回事。。。
2.2- 从虚机上加载文件系统
原理:将文件系统放在虚机NFS共享路径,在uboot中设置从NFS挂载文件系统实验步骤:
实验步骤:
#1- 虚机开启NFS服务、设置NFS共享路径.同2.1
#2- 制作文件系统,放在虚机NFS共享路径下。
注意:这里是指将busybox安装在/home/lhk/2440_learn/fs/nfs_fs
make CONFIG_PREFIX=/home/lhk/2440_learn/fs/nfs_fs install
并在/home/lhk/2440_learn/fs/nfs_fs路径添加C库文件、串口文件、etc文件等
另外配置文件中添加开发板IP
#3- 开发板设置内核启动参数
开发板重启,进入到uboot命令行,设置启动参数:
set bootargs noinitrd root=/dev/nfs nfsroot=192.168.31.18:/home/lhk/2440_learn/fs/nfs_fs ip=192.168.31.15:192.168.31.18:192.168.31.1:255.255.0.0::eth0:off init=/linuxrc console=ttySAC0
命令行参数设置参考\linux-2.6.22.6\Documentation\nfsroot.txt
root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
#4- 重启系统
注意:
1- 第二步“制作文件系统,放在虚机NFS共享路径下”是指,将busybox安装在NFS共享路径下(?make CONFIG_PREFIX=/home/lhk/2440_learn/fs/nfs_fs install)。
并设置mdev等文件,参考“1- 制作最小根文件系统”。
2- 需要在文件系统rcS文件中设置开发板IP。
root@book-virtual-machine:/home/lhk/2440_learn/fs/nfs_fs/etc/init.d# cat rcS
ifconfig eth0 192.168.31.15
mkdir proc root tmp mnt sys
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
遇到问题:
开发板上电后,发现报错:
最后报错为VFS: Mounted root (nfs filesystem).说明开发板和虚机NFS通讯正常,但是“Failed to execute /linuxrc. ?Attempting defaults...”说明内核没有找到/linuxrc.
原因:没有将文件系统安装到虚机共享类路径。注意这里说的是安装busybox到虚机NFS共享路径,而不是将xxx.yaffs2放在虚机共享路径。
解决方案:详细阅读本贴“”2.2- 从虚机上加载文件系统“部分,尤其阅读标记注意的内容。
这个问题真的困扰了很久,韦东山的帖子、视频也都是没有说明,多谢帖子
ALSA device list:
No soundcards found.
TCP cubic registered
NET: Registered protocol family 1
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
IP-Config: Complete:
device=eth0, addr=192.168.31.15, mask=255.255.0.0, gw=192.168.31.1,
host=192.168.31.15, domain=, nis-domain=(none),
bootserver=192.168.31.18, rootserver=192.168.31.18, rootpath=
Looking up port of RPC 100003/2 on 192.168.31.18
Looking up port of RPC 100005/1 on 192.168.31.18
VFS: Mounted root (nfs filesystem).
Freeing init memory: 140K
Warning: unable to open an initial console.
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
从报错来看没有找到串口,执行linuxrc失败,也就是执行busybox失败,不知怎么回事。
|