IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 根文件系统--制作 -> 正文阅读

[系统运维]根文件系统--制作

回顾:

最小根文件系统的组成:

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失败,不知怎么回事。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:35:20  更:2022-03-06 13:39:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:15:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码