如何将 Ubuntu 加载到 RAM 并从中启动?

如何将 Ubuntu 加载到 RAM 并从中启动?

问题

我有一个 USB 闪存驱动器,其中除 Windows PE 和其他东西外,还有一个虚拟(基于文件的)分区上的 Ubuntu 11.04 系统:

<drive>/ubuntu/disks/boot.disk      mount point /boot  (contains GRUB)
<drive>/ubuntu/disks/root.disk      mount point /      (contains rest of system)

它运行良好...

然而,所有的变化坚持关机后。

我也想要一个额外的GRUB2 菜单上的选项将引导相同的安装,但会重定向全部写入从根文件系统到 RAM,因此丢弃对根文件系统所做的所有更改(root.disk)。

强调:那里必须仍然可以选择正常启动系统。

(当然,对其他文件系统的修改不应被重定向 —— 使用此选项时,只有根磁盘和启动磁盘应保持不变。)

我已经做了什么

我的 /etc/fstab 当前如下所示:

# <file system>              <mount point> <type> <options>              <dump> <pass>
proc                         /proc         proc   nodev,noexec,nosuid    0      0
/host/ubuntu/disks/root.disk /             ext2   loop,errors=remount-ro 0      0
/host/ubuntu/disks/boot.disk /boot         ext2   loop,errors=remount-ro 0      0

我的 grub.cfg 如下所示:

menuentry "Ubuntu, Linux 2.6.38-13-generic" {
    insmod part_msdos
    insmod ntfs
    set root='(/dev/sdb,msdos1)'
    search --no-floppy --fs-uuid --set=root MY_DRIVE_UUID
    loopback loop0 /ubuntu/disks/root.disk
    set root=(loop0)
    linux /boot/vmlinuz-2.6.38-13-generic root=UUID=MY_DRIVE_UUID loop=/ubuntu/disks/root.disk ro   acpi_sleep=nonvs acpi_osi=Linux acpi_backlight=vendor
    initrd /boot/initrd.img-2.6.38-13-generic
}

我有已经尝试过了将我的 fstab 更改为例如:

# <file system>              <mount point> <type> <options>              <dump> <pass>
proc                         /proc         proc   nodev,noexec,nosuid    0      0
/host/ubuntu/disks/root.disk /rootdisk     ext2   loop,errors=remount-ro 0      0
tmpfs                        /ramdisk      tmpfs  defaults               0      0
none                         /             aufs   br:/rootdisk=ro:/ramdisk=rw 0 1
/host/ubuntu/disks/boot.disk /boot         ext2   loop,errors=remount-ro 0      0

由于某种原因,它无法正确安装(我已经尝试了所有我能想到的、、、排序、标志等/的组合),并在启动时出现错误。nonetmpfsaufs

那么...我该如何进行设置?

答案1

如果没有自定义文件系统,你可能需要做的事情可能无法完成,但是内存文件系统(不是虚拟硬盘也不临时文件) 非常接近。 拉姆斯有时在(嵌入式)Linux 启动时用作初始文件系统,即初始化内存文件系统。由于此根文件系统位于内存中,因此对它所做的任何更改都不会传播回闪存中的源,并且在关机或下次重启时会丢失。初始化内存文件系统来自初始化ramfs文件附加到内核二进制文件的存档文件。

可能需要一个自定义文件系统来“将所有写入从根文件系统重定向到 RAM”。这有点像我帮助开发的分层文件系统:顶层文件系统是用户可访问的,实际上由两个单独的文件系统组成。用户访问文件需要先在 A 文件系统中查找该文件;如果该文件在 A 中不存在,则 B 文件系统应该有该文件。(A 文件系统包含 B 文件系统的更新文件,而无需在只读媒体上更新/替换 B 文件系统。)您理想的文件系统将是类似的:访问(即打开)文件需要先检查该文件是否已在内存文件系统如果是,则使用该副本;否则将文件从磁盘根文件系统复制到内存文件系统然后使用内存文件系统复制。

也许你可以配置你的系统来启动、创建和挂载内存文件系统,将 rootfs 复制到内存文件系统, 进而chroot内存文件系统。这会将整个根文件系统放入内存中,而不仅仅是您梦想的文件系统的修改过的文件。

答案2

Ubuntu 和大多数 Debian 衍生发行版使用“initramfs”,其中包含启动时所需的驱动程序和实用程序,之后才能挂载根卷。内核加载后,引导加载程序会立即加载它(这也是由引导加载程序完成的)。

通常在将实际根卷安装到 initramfs 上后,该卷就会被删除。我相信,如果您编辑相应的/etc/init.d/脚本,就可以阻止这种情况发生。

为了使其正常工作,您需要自己的自定义 initramfs,其中包含运行 Linux 所需的所有文件。效果应该是在启动过程结束时,您完全依靠 initramfs 运行。一些实时 CD/ISO 确实做同样的事情。

比如说,将一个只有最小命令行的 Ubuntu 安装复制到一个新的自定义 initramfs 应该不会太难。我不知道有什么工具可以自动“initramfs-ify”您当前的系统,但这确实看起来像是其他人以前做过的事情。如果我发现任何东西,我会更新这个答案。

相关内容