内核如何知道在哪里可以找到文件系统?

内核如何知道在哪里可以找到文件系统?

我对 Linux 特别是嵌入式 Linux 还很陌生。

我正在嵌入式设备上开发一个已开发的项目,其中根文件系统类型是 SquashFS,即压缩的只读文件系统类型。

当内核启动时,它如何知道如何查找并挂载根文件系统,特别是当它是 SquashFS 类型而不是普通的 EXT4 类型时?提前致谢。

答案1

有两种方法可以做到这一点:

  • 您可以将根设备名称作为参数 ( ) 传递给内核root,并且内核必须(内置)所有必需的模块来定位存储设备、识别和挂载文件系统以进行启动init。您可以指示内核它是哪个文件系统(使用rootfstype),但我不确定这是必需的;

  • 如今,绝大多数系统都使用initramfs,它是一个粘贴到内核(或由引导加载程序引用)的小型文件系统映像,用于在将控制权传递给进程之前在用户态中准备(如果需要)并安装根文件系统init。执行操作后的实际根文件系统switch_root

答案2

有一个概念神奇数字你可以参考一下。

定义于的幻数列表魔法.h头文件

例如,如果您检查磁盘:

sudo file -Ls /dev/mapper/vg-home               
/dev/mapper/vg-home: Linux rev 1.0 ext4 filesystem data, UUID=fd8eb0e8-073d-4ae3-810a-87e8af0981d7 (needs journal recovery) (extents) (64bit) (large files) (huge files)

file命令根据幻数匹配类型。您可以通过 hexdump 工具查看这些值:

sudo hexdump /dev/mapper/vg-home -C  | grep "53 ef"
00000430  1b da d0 5e 49 00 ff ff  53 ef 01 00 01 00 00 00

这里0x53ef是 ext4 文件系统的幻数

对于squashfs(幻数 0x73717368)

sudo hexdump /dev/somedisk -C  | head -n 1    
0000000  73 71 73 68 00 00 14 7e  01 ea 27 0d 00 01 00 00 |sqsh...~..'.....|

相关内容