从硬盘上的 ISO 文件将 Linux 启动到 RAM 中,并重新安装 Linux

从硬盘上的 ISO 文件将 Linux 启动到 RAM 中,并重新安装 Linux

我有以下案例:

Ubuntu 14.04 安装应升级到版本 22.04。硬盘驱动器需要重新分区,并且旧的 14.04 安装应完全擦除。 Ubuntu 14.04 在硬盘上使用 LVM。

是否可以配置 GRUB 将 Ubuntu 22.04 的 .iso 文件加载到 RAM 中,然后从 RAM 引导 .iso 文件?我已经能够修改 GRUB 以从硬盘驱动器(具有 Ubuntu 22.04)启动 .iso 文件,但我无法对硬盘驱动器重新分区,因为它正在使用中(即使我在 GRUB 中使用了“toram”选项加载 Linux 的入口)。

如果我使用 Ubuntu 22.04 从 USB 记忆棒启动机器,则可以对硬盘驱动器进行重新分区。但我需要某种方法从硬盘开始安装,并在没有任何 USB 记忆棒的情况下进行全新安装。我有一些计算机位于远程位置,因此我需要能够在不前往现场的情况下重新安装这些计算机。

答案1

Grub 不这样做。 Grub 所做的只是加载内核/initrd 并传递参数。然后 Ubuntu 将自身加载到 RAM 中。 Grub 不会进一步参与该过程。

toram是 Ubuntu 的 kernel/initrd 实现的一个功能。其他实时图像可能对类似功能使用不同的名称,或者可能根本不实现它。

一般来说,此功能需要足够的内存才能工作。在内存有限的机器上,它可能会完全失败。映像必须完全适合 RAM,并且仍然有足够的可用 RAM 来实际执行任何安装工作。

您可以toram从命令行检查是否在内核参数中:

$ grep toram /proc/cmdline
… toram …

以下输出是使用 Ubuntu 22.04 桌面 amd64 生成的。

df启用后的输出toram(/dev/shm as /cdrom):

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           972M  1.5M  971M   1% /run
/dev/shm        3.8G  3.6G  182M  96% /cdrom
/cow            4.8G   58M  4.7G   2% /
tmpfs           4.8G     0  4.8G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           4.8G     0  4.8G   0% /tmp
tmpfs           972M  128K  972M   1% /run/user/999

df禁用时的输出toram(/dev/usbstick 为 /cdrom,未安装其他任何东西):

$ df -h
Filesystem    1K-blocks    Used Available Use% Mounted on
tmpfs            995092    1496    993596   1% /run
/dev/usbstick   3737140 3737140         0 100% /cdrom
/cow            4975444   58760   4916684   2% /
tmpfs           4975444       0   4975444   0% /dev/shm
tmpfs              5120       0      5120   0% /run/lock
tmpfs           4975444       0   4975444   0% /tmp
tmpfs            995088     120    994968   1% /run/user/999

free启用后的输出toram(3.6Gi 共享,4.9Gi 可用):

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           9.5Gi       736Mi       4.4Gi       3.6Gi       4.4Gi       4.9Gi
Swap:             0B          0B          0B

free禁用时的输出toram(81Mi 共享,8.5Gi 可用):

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           9.5Gi       727Mi       4.4Gi        81Mi       4.4Gi       8.5Gi
Swap:             0B          0B          0B

根据系统的不同,这看起来会有所不同,但大致就是它应该如何工作。服务器或网络启动映像的 RAM 要求可能不同。

答案2

我找到了解决方案这里并测试了这是否有效。

简而言之,程序如下:

  1. 将现有的 Ubuntu 22.04 ISO 安装文件提取到临时位置。
  2. 将文件提取casper/initrd到临时位置。
  3. 将以下行添加到casper/scripts/casper-bottom/05mountpoints文件中(就在文件最后一行之前):
if grep -q '^[^ ]* /isodevice ' /proc/mounts; then
    mkdir -p /root/isodevice
    mount -n -o move /isodevice /root/isodevice.
fi

(我实际上跳过了 if 语句,只添加了 mkdir 和 mount 命令)

  1. 重新打包initrd文件并替换原来的文件。
  2. 重新打包 ISO 文件。
  3. 将修改后的 ISO 文件复制到硬盘,然后 grub 可以找到它。
  4. 重新启动计算机并使用toramgrub 中的选项引导 ISO 文件。
  5. 打开终端窗口并键入以下命令:
sudo losetup -d /dev/loop0
sudo umount /isodevice
  1. 现在,您应该能够对硬盘驱动器重新分区,并在同一硬盘驱动器上安装 Ubuntu 22.04 而不是 Ubuntu 14.04(无需执行所有正常升级步骤 16.04 -> 18.04 -> 20.04,但效果不太好)。

如果没有这些步骤,Ubuntu 22.04 就无法对硬盘驱动器(从哪里启动)重新分区,GParted 会抱怨有一个文件系统正在使用中。

相关内容