因为项目要用到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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
xfs : /
xfs : /boot
xfs : /var
devtmpfs : /dev
tmpfs : /run
xfs : /etc
tmpfs : /tmp
sysfs : /sys
proc : /proc
xfs : /usr
ext4 : /home
xfs : /mnt
xfs : /opt
xfs : /root
xfs : /srv
xfs : /media

以上列出了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
2
3
4
5
6
7
8
9
10
11
// 启动选项
menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-bcd9e201-bbf1-4c49-b249-c78cb29ec1fc' {
load_video // 加载视频驱动程序,用于图形显示
insmod gzio // 加载gzip,用于解压缩内核和initramfs
insmod part_gpt // 加载gpt分区模块,用于读取磁盘分区。
insmod xfs // 加载xfs模块,以支持xfs文件系统
search --no-floppy --fs-uuid --set=root bcd9e201-bbf1-4c49-b249-c78cb29ec1fc // 通过uuid查找根文件系统的分区,并将其设为根文件系统
linux /boot/vmlinuz-linux root=UUID=bcd9e201-bbf1-4c49-b249-c78cb29ec1fc rw loglevel=3 // 加载Linux内核,并挂载根文件系统
echo 'Loading initial ramdisk ...'
initrd /boot/amd-ucode.img /boot/initramfs-linux.img // 加载amd微码和initramfs。微码是amd或intel等制造商发布的处理器补丁。详见[archwiki](https://wiki.archlinux.org/title/microcode)
}

grub负责挂载根文件系统,随后告诉内核initramfs镜像在内存中的位置。这里执行sudo file /boot/initramfs-linux.img 发现其实就是cpio归档。
之后内核将initramfs释放到rootfs中,执行一些初始化代码(略)。

初始化后 内核将文件系统切换为基于硬盘的文件系统,也就是我们看到的xfs了。