1 常用嵌入式文件系统
需要Linux内核的配合
文件系统格式:cramfs jffs2 yaffs2…
- 基于存储设备的文件系统,有实际大小。
- 基于逻辑的虚拟文件系统
1.1 基于存储设备的文件系统:Flash文件系统
- cramfs:压缩
- squashfs:压缩,支持单个文件更大;
- jffs/jffs2:日志缓存文件系统,NOR flash
- yafffs/yaffs:NAND flash
内核必须支持这种文件系统,Linux内核必须需要配置这个文件系统
可以在内核中通过make ARCH=arm menuconfig来配置支持那种文件系统
Linux内核版本高于3.9会没有yaffs2的配置信息;
可以下载yaffs2补丁压缩包,然后解压打补丁
./patch-ker.sh c m ~[内核路径]
2.2 基于逻辑的虚拟文件系统
虚拟文件系统用于使用于文件接口统一的操作来完成系统信息管理
- 进程文件系统:procfs
- 设备文件系统:devfs、sysfs
2.2.1 procfs
是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中/proc。这样就可以通过echo或cat进行插曲和调整。
- procfs的挂载:确定内核支持procfs;一般会默认挂载
# mount -t proc none /proc
# cat /proc/cmdline #启动信息
# /proc/sys # 系统内核的参数和选项配置
# echo 32768 > /proc/sys/kernel/pid_max # echo对系统的参数进行调整
2.2.2 tmpfs
是一种虚拟内存文件系统,使用**内存作为存储分区**进行文件的临时性存取,掉电会丢失,创建时不需要使用mkfs等进行格式化。
- tmpfs的挂载:内核需要支持
# mkdir tmp # 需要一个挂载点
# mount -t tmpfs none -o size=10M /tmp #手动挂载在内存某一块上,需要指定大小
2.2.3 sysfs
挂在于/实验室目录下,把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以使用这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应。
挂载命令(也就是创建)
# mount -t sysfs none /sys
# /sys下每个文件的内容详见https://blog.csdn.net/qq_42611237/article/details/125296921
- 原理:
kobject子系统:建立目录树
当一个kobject被创建的时候,/sys/目录下对应的目录也就被创建
每个设备在sysfs中都有唯一对应的目录,可以被用户空间读写。
3 网络文件系统
NFS:Network FileSystem
NFS模式:C/S模式,RPC服务框架
Ubuntu作为客户端:
sudo apt-get install nfs-kernel-server
sudo service nfs-kernel-server status
NFS 配置文件:/etc/exports
设置的是共享目录:
/home/lcx/nfsroot *(rw,sysnc,no_subtree_check,no_root_squash)
/home/lcx/nfsroot *(rw,sysnc,no_subtree_check,no_root_squash)
showmount -e
查看可以被挂载的目录
开发板:
NFS需要在制作内核镜像时进行配置
cat /proc/filesystems命令,查看有没有nfs一行
挂载命令
mount -t nfs 宿主机目录 自己目录 -o nolock
4 intramfs文件系统
Linux内核在启动的最后阶段需要加载根文件系统,然后执行/init程序;因此需要知道根文件系统到底位于哪里?
4.1 rootfs、ramfs、ramdisk与tmpfs
rootfs:内核启动的虚拟的根文件系统,如果rootfs里面有相关内容就会执行相关内容,如果没有内容就会去查找额外的根文件系。Linux内核可以挂载在rootfs下进行启动
ramfs:基于内存的文件系统,直接利用内核的磁盘高速缓存,不定内存大小。
ramdisk:基于ram的块设备,固定内存,使用特定工具格式化,需要文件系统驱动读写内容
tmpfs:
4.2 initrd与initramfs
过渡根文件系统机制:将加载真正的根文件系统需要的设备驱动、工具以及初始化程序先加载到内存运行
- initrd:initial Ramdisk。系统启动完成之后从指定的启动的位置将 initr.img镜像 拷贝到内存中,挂载作为临时根文件,再由initrd的初始化程序(/linuxrc文件)最终完成真正根文件系统的挂载。
- initramfs:嵌入式常用的
init文件作为初始化文件;
cpio格式镜像文件;
在内核启动完成后把它复制到rootfs中,rootfs作为内核初始化的根文件系统,再由initramfs初始化程序完成挂载真正的根文件系统。
4.2.1 initramfs
- initramfs的初始化文件是 init文件
init实例
#include <stdio.h>
int main(int argc,char *argv[])
{
printf("Hello World Initramfs!\n");
sleep(999999);
}
生成为ARM的二进制文件
初始化程序是内核启动的第一个程序,PID=1.,不能被终止。
打包命令
find .|cpio -o -H newc|gzip >../test.cpio.gz
解压查看内容,**--no-absolute-filename不要解压到相对路径下**
zcat test.cpio.gz | cpio -i -d -H newc --no-absolute-filename
- 内核initramfs的构建
initramfs的配置和指定需要在linux内核配置时完成
需要启动支持,并在Initramfs source files中指定cpio的镜像位置。
make ARCH=arm uImage
内核进行编译之后,就可以得到一个含有指定initramfs镜像的内核镜像。
5 总结
Linux内核启动 ------- initrd/initramfs(包含有根文件系统的设备驱动)------- Real Root Filesystem