因为项目要用到buildroot, 其中涉及到文件系统,所以看看rootfs什么的到底是什么东西
文件系统是什么
文件系统是操作系统提供的一系列’存取存储设备上数据并抽象为文件’的方法。也就是用来组织管理文件的。
文件系统可以分为:
+ 基于磁盘的文件系统
+ 内存文件系统(有时称临时文件系统)
+ 闪存文件系统
linux中的文件分别存放到不同(物理)介质中。(这可能是‘一切皆文件’的由来?)
ext4、ntfs、xfs等是基于磁盘的,procfs、tmpfs、sysfs等是基于内存的, fat32、exfat等是基于闪存的。
根目录下挂载了哪些文件系统:
执行find / -maxdepth 2 -type d -exec sh -c 'echo "$(df -T "{}" | tail -1 | awk "{print \$2}") : {}"' \;
得到如下结果:
1 | xfs : / |
以上列出了linux根目录下的文件系统。 这里可以看到根目录使用了xfs, 还挂载了其他文件系统。
这里根目录并不是根文件系统,根目录使用的xfs类型是linux启动运行完毕后另外加载的另一个文件系统,是基于磁盘的。详见以下rootfs介绍
rootfs是什么
顾名思义是根文件系统(废话),具体来说是基于内存的fs。rootfs不算是procfs、tmpfs等,而是一种独立的文件系统。也有说是一种特殊的tempfs?没有读过源码,猜测这种分界线是模糊的。并且也不用在意究竟是哪种具体的类型。
rootfs用于在计算机启动后,挂载其他(用于初始化的)必要的文件系统到根目录下(注意这里仍然是基于内存的),比如initramfs、initrd等。
initrd是早期的ram磁盘映像,现在已被弃用,改为使用initramfs。
initramfs是一个^cpio格式的归档,用于存放内核的初始化代码。设置initramfs的过程也是在bootloader时期完成的。详见以下加载rootfs的过程。
加载rootfs的过程
计算机启动后,bootloader读取配置文件,其中包含内核位置、根文件系统位置等。
一般bootloader选择grub。
以下是我的grub.cfg的一部分:
1 | // 启动选项 |
grub负责挂载根文件系统,随后告诉内核initramfs镜像在内存中的位置。这里执行sudo file /boot/initramfs-linux.img
发现其实就是cpio归档。
之后内核将initramfs释放到rootfs中,执行一些初始化代码(略)。
初始化后 内核将文件系统切换为基于硬盘的文件系统,也就是我们看到的xfs了。