rootfs 是一个 squashfs 映像,我的引导加载程序将其加载到 SDRAM 中的某个地址。我需要向内核传递哪些参数,以便它可以从那里挂载 rootfs? Squashfs 支持是内置的,并且已经可以与
root=/dev/mtdblock2 rootfstype=squashfs
用于从闪存启动。
编辑:这是一个基于 MIPS 的嵌入式设备,使用自定义引导加载程序。通常,引导加载程序将压缩后的内核从闪存中提取到SDRAM中,然后内核将/dev/mtdblock2挂载为rootfs。我正在尝试改进引导加载程序,以便它可以将映像下载到 RAM 并启动,而无需写入闪存。
我不知道如何让 Linux 将文件系统映像作为 rootfs 挂载在 RAM 中。
答案1
我会使用 initramfs。 (http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt)
许多 Linux 发行版在引导过程中使用 initramfs(不要与 initrd 混淆,它们是不同的),主要是为了能够在引导过程的早期启动用户空间程序。但是,您可以将其用于任何您想要的用途。
initramfs 相对于 initrd 的优势在于 initramfs 使用 tmpfs 文件系统,而 initrd 使用 ram 块设备。这里的主要区别是,对于 initrd,您必须为文件系统预先分配所有空间,即使您不打算使用所有这些空间。因此,如果不使用文件系统空间,就会浪费内存,而内存在嵌入式设备上通常是稀缺资源。 Tmpfs 是一个耗尽 RAM 的文件系统,但仅使用文件系统当前使用的 RAM 量。因此,如果您从 tmpfs 中删除文件,该内存会立即被释放。
现在,通常 initramfs 是临时的,仅用于在启动过程的早期运行某些程序。这些程序运行后,控制权将移交给物理磁盘上运行的真实文件系统。但是,您不必这样做。没有什么可以阻止您无限期地耗尽 initramfs。
答案2
答案3
我使用该phram
驱动程序来实现此目的:它使用物理内存模拟 MTD 设备,这意味着您可以使用完全相同的 rootfs 映像进行测试/开发,稍后您将将该映像刻录到真正的闪存中。内核命令行上必要的魔法类似于
phram.phram=rootfs,0x100000,9Mi root=/dev/mtdblock0 memmap=9M\$100000
请注意,您还需要参数memmap
来确保内核不会尝试自行使用该内存。 9MB 是我的 rootfs 有多大(或曾经有多大)。我的引导加载程序中需要 $ 之前的 \,但您的引导加载程序中可能不需要。我在那里选择的地址是任意的,因为我不知道物理内存在您的设备上是如何布局的,所以选择一个对您有意义的地址。我假设您之前使用 tftp 或其他东西在该地址加载您的 rootfs
- https://cateee.net/lkddb/web-lkddb/MTD_PHRAM.html 内核配置选项的描述
- https://ww.telent.net/2018/1/2/gehen_sie_bitte_mit_hier_ist_nix_zu_sehen 有关我如何做到这一点的更多详细信息我的设备