我对 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...~..'.....|