韦东山uboot_内核_根文件系统学习笔记4.4-第004课_根文件系统-第004节_构建根文件系统之构建根文件系统

一 最小的根文件系统需要的项(笔记4.1 4.2小结)

(init 进程需要)

  1. 打开终端: /dev/console, /dev/NULL
    不设置 inittab 格式中的 id(标准输入、输出和标准错误)时,就定位到 /dev/NULL 中去。
  2. /sbin/init(init 程序):它本身就是 busybox .
  3. /etc/inittab:需要配置文件
    配置文件若指定了某些应用程序或执行脚本–这些必须存在,不存在会有默认的。
  4. 应用程序需要的库(printf,fopen、 fwrite 等函数需要库函数) 。

根据以上总结的需求进行构建“最小根文件系统”

1 创建设备文件:/dev/console, /dev/NULL

  1. 看ubuntu上这两个设备文件
    在这里插入图片描述
  2. 在嵌入式文件系统上创建
[email protected]:~/nfs_root/fs_mini$ mkdir dev						//创建dev目录
[email protected]:~/nfs_root/fs_mini$ ls
bin  dev  linuxrc  sbin  usr
[email protected]:~/nfs_root/fs_mini$ cd dev/
[email protected]:~/nfs_root/fs_mini/dev$ sudo mknod console c 5 1  		//创建设备节点 //节点名称:console//字符型设备:c//主设备号:5//次设备号:1
[email protected]:~/nfs_root/fs_mini/dev$ sudo mknod null c 1 3

2 /sbin/init(init 程序)

已经具备了该程序:
在这里插入图片描述

3. /etc/inittab配置文件

[email protected]:~/nfs_root/fs_mini$ mkdir etc								//创建etc文件夹
[email protected]:~/nfs_root/fs_mini/etc$ vim inittab							//创建inittab文件

输入inittab文件的内容:如下图。最简单的配置文件,仅执行-/bin/sh程序。这表示它里面只执行一个 askfirst 的/bin/sh 程序, /bin/sh 这个程序的标准输入、输出和标准错误都定位到“/dev/console”里面去。
在这里插入图片描述

4 .应用程序需要的c库

之前制作交叉工具链的时候已经生成glibc库,可以直接使用它来构建根文件系统。下图就是glibc库文件:
在这里插入图片描述
这些库文件中有一些是链接-指向另外一个文件,例如下图ld-linux.so.2
在这里插入图片描述

.so文件:动态库文件,比如动态数学库libm.so/动态C++库libstdc++.so等。编译动态库时会用到这些文件,但是不会链接它们,运行时才会链接。

在拷贝的时候需要将目录下所有 .so 文件拷贝过来即可。 -d 是本来是个链接文件,则也保持是个链接文件。不然就拷贝成了真正的文件,这样会很大。
在这里插入图片描述

以上制作完成最小根文件系统。

二 如何把根文件系统烧写到开发板

  1. 制作/使用yaffs文件系统映像文件使用该工具yaffs_source_util_larger_small_page_nand.tar.bz2(可以支持nand512page也可以支持nand2048page)。
    解压缩该工具之后进入目录:/Development_util_ok/yaffs2/utils执行make命令,编译出下列工具。后面主要使用mkyaffs2image
    在这里插入图片描述

  2. mkyaffs2image拷贝到ubuntu的系统目录并添加可执行属性:
    在这里插入图片描述

  3. 创建文件系统映像
    回到创建的嵌入式文件系统目录:~/nfs_root/
    输入命令:mkyaff2image查看该命令的用法;
    在这里插入图片描述
    输入命令:mkyaffs2image fs_mini fs_mini.yaffs2生成名字为fs_mini.yaffs2的映像文件。
    在这里插入图片描述

  4. 烧写映像fs_mini.yaffs2
    (1)开发板上电进入uboot目录后输入y
    在这里插入图片描述
    (2)打开dnw软件进行烧写

  5. 查看开发板启动过程
    问题:按照上面的步骤制作的文件系统提示下图错误,重新尝试过几次均无效,该错误后面再解决吧…
    在这里插入图片描述

正常启动后应当为下图的效果
在这里插入图片描述
查看该文件系统中的etc/inittab文件:

# cat /etc/inittab
# /etc/inittab
ttySAC0::askfirst:-/bin/sh
  1. bootargs设置默认值
bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200

三 完善根文件系统1-支持PS命令

  1. 支持PS命令

PS命令:要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,ps命令就是最基本进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等.总之大部分信息都是可以通过执行该命令得到。ps是显示瞬间进程的状态,并不动态连续;如果想对进程进行实时监控应该用top命令。

该命令需要内核提供的虚拟文件系统PROC,那么需要首先内核加载起来该文件系统。

mkdir proc
mount -t proc none /proc
ps

下图中PID表示进程号;
在这里插入图片描述
进入进程号为1的进程中查看:
在这里插入图片描述
查看进程号为1的文件夹中fd的属性如下图:都指向/dev/console

 0 -> /dev/console	//表示标准输出
 1 -> /dev/console	//表示标准输入
 2 -> /dev/console	//表示标准错误

在这里插入图片描述

  1. 如何支持PS命令(方法1)
    (1)我们需要自动挂载以上PROC,所以需要编译inittab文件,让配置文件要求内核自动执行一个脚本:vim /etc/inintab
    在这里插入图片描述
    (2)创建/etc/init.d/rcS文件,给rcS文件添加可执行属性
    rcS文件内容如下图:即要求内核执行下图命令
    在这里插入图片描述
    在这里插入图片描述

  2. 如何支持PS命令(方法2)
    (1)rcS文件内容还可以修改为:mount -a
    含义:读出/etc/fstab文件内容,根据该内容挂载文件系统
    (2)/etc/fstab文件格式讲解

#device	mount-point	type	options		dump	fsck	order
proc	/proc		proc	defaults    0		0

在这里插入图片描述
在这里插入图片描述

  1. 查看效果:
    查看当前已经挂载的文件系统,如下图:已经挂载了yaffs文件系统,rootfs根文件系统,proc虚拟文件系统
    在这里插入图片描述

四 完善根文件系统2-mdev使用(参见P355)

  1. udev:自动创建/dev/设备节点;
  2. mdev:udev的简化版本,通过读取内核信息来创建设备文件。用法参见:busybox-1.7.0/doc/mdev.txt文件。
    在这里插入图片描述
  3. 具体操作步骤
    在这里插入图片描述

其中,[2] echo /bin/mdev > /proc/sys/kernel/hotplug表示热插拔,当动态加载某个驱动或者插入U盘的时候内核自动调用/proc/sys/kernel/hotplug程序;
[3]mdev -s表示把内核中现有的驱动节点全部创建出来;

  1. 查看效果
    (1)dev目录下出现了很多设备节点,这些就是mdev自动创建的节点
    在这里插入图片描述
    (2)查看装载的文件系统
    在这里插入图片描述

五 使用其他文件系统-jffs2(参见P360)

jffs2:一般用于nor flash上,那么我们目前把它用到nand flash上。

在这里插入图片描述

./configure --shared --prefix=/usr 配置信息
–shared表示编译成动态库
–prefix=/usr表示安装到/usr目录下
sudo make install表示安装到系统目录

在这里插入图片描述

注意:使用不同的flash修改修改对应的参数
-s 512修改为-s 2048
-e 16KiB修改为-e 128KiB

在这里插入图片描述

查看效果:
在这里插入图片描述

六 使用其他文件系统-网络文件系统NFS

开发阶段经常使用网络文件系统进行程序调试

NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过网络共享资源。将NFS主机分享的目录,挂载到本地客户端当中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,在客户端端看起来,就像访问本地文件一样。

  1. 设置ubuntu服务器和开发板的网段为同一个网段:
    ubuntu ip地址:192.168.8.201
    开发板ip地址:ifconfig eth0 192.168.8.210
    开发板可以ping通ubuntu

  2. 使用命令挂接NFS的前提条件
    (1)ubuntu服务器允许某个目录被挂载
    编辑Ubuntu服务器对应文件:sudo vim /etc/exports
    在这里插入图片描述
    重新启动Ubuntu的nfs服务:
    在这里插入图片描述
    尝试一下ubuntu自己挂载自己的nfs目录:sudo mount -t nfs 192.168.8.201:/home/book/nfs_root/fs_mini1 /mnt
    在这里插入图片描述
    (2)单板去挂载
    单板挂载命令:mount -t nfs -o nolock 192.168.8.201:/home/book/nfs_root/fs_mini1 /mnt

  3. 直接从NFS启动开发板
    (1)uboot修改环境变量

bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200
修改为
bootargs=noinitrd root=/dev/nfs nfsroot=192.168.8.201:/home/book/nfs_root/fs_mini1 ip=192.168.8.210:192.168.8.1:255.255.255.1:eth0:off init=/linuxrc console=ttySAC0,115200

(2)NFS启动参数:服务器IP/挂载目录/开发板的IP
查找说明文档:linux-2.6.22.6\Documentation\nfsroot.txt那么查到参数为

nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>

说明:中括号[]表示的参数可以省略;尖括号<>表示的参数不可省略
说明文档中有用法的解释,这里就不截图了。

猜你喜欢

转载自blog.csdn.net/xiaoaojianghu09/article/details/104211168