如何在RAM中使用rootfs进行Linux引导?


16

rootfs是一个squashfs映像,我的引导程序正在将其加载到SDRAM中的某个地址中。我需要将什么参数传递给内核,以便可以从那里挂载rootfs?Squashfs支持是内置的,已经可以与

root=/dev/mtdblock2 rootfstype=squashfs  

从闪存启动。

编辑:这是使用自定义引导程序的基于MIPS的嵌入式设备。通常,引导加载程序将闪存中的压缩内核提取到SDRAM中,然后内核将/ dev / mtdblock2挂载为rootfs。我正在尝试改进引导程序,以便它可以将映像下载到其RAM并引导而不写入闪存。

我无法弄清楚如何使Linux在RAM中将文件系统映像作为rootfs挂载。


如果您已经知道squashfs可以工作,请更好地描述您要达到的目标。您怎么知道它有效?怎么了?最重要的是,什么适合您的方式?
rozcietrzewiacz 2011年

1
另外,设备使用什么引导程序
rozcietrzewiacz 2011年

我认为,如果您使用memdisk(来自SYSLINUX)作为内核,则会将整个映像加载到内存中,然后从中进行引导
golimar 2012年

Answers:


10

我会使用initramfs。(http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

许多Linux发行版在引导过程中使用initramfs(不要与initrd混淆,它们是不同的),主要是为了能够在引导过程的早期就启动用户空间程序。但是,您可以将其用于任何所需的对象。

与initrd相比,initramfs的好处在于,initramfs使用tmpfs文件系统,而initrd使用ram块设备。此处的主要区别在于,对于initrd,即使您不打算使用所有空间,也必须为文件系统预分配所有空间。因此,如果您不使用文件系统空间,则会浪费内存,而内存在嵌入式设备上通常是一种稀缺资源。Tmpfs是一个用完ram的文件系统,但仅使用与该文件系统上当前使用的ram一样多的ram。因此,如果您从tmpfs中删除文件,则该ram将立即释放。

现在,通常,一个initramfs是临时的,仅用于在启动过程中非常早地运行某些程序。这些程序运行后,控制权移交给物理磁盘上运行的实际文件系统。但是,您不必这样做。没有什么可以阻止您无限期地耗尽initramfs。


因此,我实际上一直在尝试设置一个“无限期运行在initramfs之外”的系统。该系统在大多数情况下都可用,但是我遇到了一些问题-我想知道您是否能够阐明一些想法?问题发布在这里
dtmland


0

我将phram驱动程序用于此目的:它使用物理内存模拟MTD设备,这意味着您可以使用完全相同的rootfs映像进行测试/开发,然后再将其刻录到真实的闪存中。内核命令行上的必要魔术将是这样的

phram.phram=rootfs,0x100000,9Mi root=/dev/mtdblock0 memmap=9M\$100000

请注意,您还需要该memmap参数以确保内核不会尝试自行使用该内存。我的rootfs有多少(或以前)有9MB。我的引导程序中需要$之前的\,可能不在您的计算机中。我在此处选择的地址是任意的,因为我不知道物理内存在设备上的布局方式,因此请选择一个对您有意义的地址。我假设您以前使用tftp或其他东西在该地址加载rootfs

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.