一 最小的根文件系统需要的项(笔记4.1 4.2小结)
(init 进程需要)
打开终端: /dev/console, /dev/NULL
不设置 inittab 格式中的 id(标准输入、输出和标准错误)时,就定位到 /dev/NULL 中去。/sbin/init(init 程序):它本身就是 busybox ./etc/inittab:需要配置文件
配置文件若指定了某些应用程序或执行脚本–这些必须存在,不存在会有默认的。应用程序需要的库(printf,fopen、 fwrite 等函数需要库函数) 。
根据以上总结的需求进行构建“最小根文件系统”
1 创建设备文件:/dev/console, /dev/NULL
看ubuntu上这两个设备文件在嵌入式文件系统上创建
book@:~/nfs_root/fs_mini$ mkdir dev//创建dev目录book@:~/nfs_root/fs_mini$ lsbin dev linuxrc sbin usrbook@:~/nfs_root/fs_mini$ cd dev/book@:~/nfs_root/fs_mini/dev$ sudo mknod console c 5 1 //创建设备节点 //节点名称:console//字符型设备:c//主设备号:5//次设备号:1book@:~/nfs_root/fs_mini/dev$ sudo mknod null c 1 3
2 /sbin/init(init 程序)
已经具备了该程序:
3. /etc/inittab配置文件
book@:~/nfs_root/fs_mini$ mkdir etc//创建etc文件夹book@:~/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 是本来是个链接文件,则也保持是个链接文件。不然就拷贝成了真正的文件,这样会很大。
以上制作完成最小根文件系统。
二 如何把根文件系统烧写到开发板
制作/使用yaffs文件系统映像文件使用该工具yaffs_source_util_larger_small_page_nand.tar.bz2
(可以支持nand512page也可以支持nand2048page)。
解压缩该工具之后进入目录:/Development_util_ok/yaffs2/utils
执行make
命令,编译出下列工具。后面主要使用mkyaffs2image
。
把mkyaffs2image
拷贝到ubuntu的系统目录并添加可执行属性:
创建文件系统映像
回到创建的嵌入式文件系统目录:~/nfs_root/
输入命令:mkyaff2image
查看该命令的用法;
输入命令:mkyaffs2image fs_mini fs_mini.yaffs2
生成名字为fs_mini.yaffs2
的映像文件。
烧写映像fs_mini.yaffs2
(1)开发板上电进入uboot目录后输入y
(2)打开dnw软件进行烧写
查看开发板启动过程
问题:按照上面的步骤制作的文件系统提示下图错误,重新尝试过几次均无效,该错误后面再解决吧…
正常启动后应当为下图的效果
查看该文件系统中的etc/inittab文件:
# cat /etc/inittab# /etc/inittabttySAC0::askfirst:-/bin/sh
bootargs设置默认值
bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200
三 完善根文件系统1-支持PS命令
支持PS命令PS命令:要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,ps命令就是最基本进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等.总之大部分信息都是可以通过执行该命令得到。ps是显示瞬间进程的状态,并不动态连续;如果想对进程进行实时监控应该用top命令。
该命令需要内核提供的虚拟文件系统
即PROC
,那么需要首先内核加载起来该文件系统。
mkdir procmount -t proc none /procps
下图中PID表示进程号;
进入进程号为1的进程中查看:
查看进程号为1的文件夹中fd的属性如下图:都指向/dev/console
0 -> /dev/console//表示标准输出1 -> /dev/console//表示标准输入2 -> /dev/console//表示标准错误
如何支持PS命令(方法1)
(1)我们需要自动挂载以上PROC,所以需要编译inittab文件,让配置文件要求内核自动执行一个脚本:vim /etc/inintab
(2)创建/etc/init.d/rcS文件,给rcS文件添加可执行属性
rcS文件内容如下图:即要求内核执行下图命令
如何支持PS命令(方法2)
(1)rcS文件内容还可以修改为:mount -a
;
含义:读出/etc/fstab
文件内容,根据该内容挂载文件系统
(2)/etc/fstab
文件格式讲解
#devicemount-pointtypeoptionsdumpfsckorderproc/procprocdefaults 00
查看效果:
查看当前已经挂载的文件系统,如下图:已经挂载了yaffs文件系统,rootfs根文件系统,proc虚拟文件系统
四 完善根文件系统2-mdev使用(参见P355)
udev:自动创建/dev/设备节点;mdev:udev的简化版本,通过读取内核信息来创建设备文件。用法参见:busybox-1.7.0/doc/mdev.txt文件。具体操作步骤
其中,[2] echo /bin/mdev > /proc/sys/kernel/hotplug
表示热插拔,当动态加载某个驱动或者插入U盘的时候内核自动调用/proc/sys/kernel/hotplug
程序;
[3]mdev -s
表示把内核中现有的驱动节点全部创建出来;
查看效果
(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服务器上的文件,在客户端端看起来,就像访问本地文件一样。
设置ubuntu服务器和开发板的网段为同一个网段:
ubuntu ip地址:192.168.8.201
开发板ip地址:ifconfig eth0 192.168.8.210
开发板可以ping通ubuntu
使用命令挂接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
直接从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>
说明:中括号[]表示的参数可以省略;尖括号<>表示的参数不可省略
说明文档中有用法的解释,这里就不截图了。
韦东山uboot_内核_根文件系统学习笔记4.4-第004课_根文件系统-第004节_构建根文件系统之构建根文件系统