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

use*_*686 6 linux ramdisk multi-boot fstab ubuntu

问题

我有一个 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)
Run Code Online (Sandbox Code Playgroud)

它工作正常...

但是,所有更改在关闭后仍然存在

我还希望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
Run Code Online (Sandbox Code Playgroud)

我的 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
}
Run Code Online (Sandbox Code Playgroud)

已经尝试将我的 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
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它没有/正确安装(我已经尝试了none, tmpfs, aufs, ordering, flags 等我能想到的所有组合),并在启动时给我一个错误。

那么......我将如何设置它?

saw*_*ust 7

如果没有自定义文件系统,您所要求的可能无法完成,但是有ramfs(不是ramdisk也不是tmpfs)接近。 Ramfs有时用作(嵌入式)Linux 启动时的初始文件系统,即initramfs。由于此根文件系统在内存中,因此对其所做的任何更改都不会传播回闪存中的源,并且会在关机或下次重新启动时丢失。initramfs的内容来自附加到内核二进制文件的initramfs.cpio存档文件。

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

也许您可以将系统配置为引导、创建和挂载ramfs,将 rootfs 复制到ramfs,然后将chroot复制到ramfs。这会将整个根文件系统放在内存中,而不仅仅是您梦想中的文件系统的修改文件。