是否可以远程安装可以自行启动和安装的映像?

rat*_*lan 5 linux

我有一个运行 Linux 的远程服务器。我想远程安装操作系统映像,以防它被损坏(在我试验操作系统时这已经发生了两次)。

到目前为止,我所拥有的唯一方法是物理转到机器位置并使用 USB 磁盘安装操作系统和 BIOS 看到它,因此它可以从它启动。

有什么方法可以通过连接到机器ssh,附加这个图像,让它像在 Windows 上的虚拟驱动器上一样(例如守护程序工具),所以它会持续重启并允许我远程安装操作系统?

我正在 Google 上查看解决方案,但我发现一些提到 PXE 启动的内容....这听起来很复杂,因为您需要一个服务器等,而且它不像安装映像并完成它那么简单。

除此之外,我没有发现任何有用的东西,所以我很缺乏选择......有谁知道如何做到这一点?

mik*_*erv 3

这是我认为可能合理的假设情况:

  1. 目标机器是EFI。
  2. grub要么从未安装在目标上,要么已从系统中完全擦除。
    • 它只能进行干扰,否则不会提供任何有价值的东西。

因此,在上述情况下,我们可能会做的是为我们保留在/espEFI 系统分区上的小型安装/救援映像配置启动选项。

如果我们当前的安装出现任何问题,那么只要我们至少可以通过某种方式访问​​ EFI 系统分区,那么我们就可以连接我们的固件并将机器设置为在下次重新启动时启动到我们的恢复映像。在这种情况下,我们所要做的就是更改一两个文本文件,祈祷并运行reboot now

这是最低配置的 Arch Linux (因为这是我使用的)系统的一组基本命令,它仍然可以按照我的描述进行操作。

  • 首先,我们将创建一个工作目录并下载一些文件。

    • aria2c这里用的。我推荐它,但使用任何有效的东西。
    • rEFInd使用解压工具7za,但在所有情况下您都使用相同的工具首选项。
    • 如果您在我发布后的几个小时/几天内没有阅读本文,那么下面使用的链接很可能不是最新的。

      mkdir /tmp/work && cd /tmp/work || exit
      aria2c  'magnet:?xt=urn:btih:331c7fac2e13c251d77521d2dc61976b6fc4a033&dn=archlinux-2015.06.01-dual.iso&tr=udp://tracker.archlinux.org:6969&tr=http://tracker.archlinux.org:6969/announce' \
              'http://iweb.dl.sourceforge.net/project/refind/0.8.7/refind-cd-0.8.7.zip'
      7za x ref*.zip; rm ref*zip
      
      Run Code Online (Sandbox Code Playgroud)
  • 接下来我要制作一张镜像盘。

    • 我在这里使用带有循环设备的文件,但如果您想从固件启动到此文件,您可能需要使用实际的磁盘。
    • 对于实际设备,可以忽略fallocatelosetup内容,实际设备名称更有可能对应/dev/sda[12]/dev/loop0p[12]

      fallocate -l4G img
      
      Run Code Online (Sandbox Code Playgroud)
  • 现在,我将使用该gdisk实用程序对该磁盘进行分区并将其分配给循环设备。

    • 这是您想要以交互方式提供给程序的选项的脚本化快捷方式。它将创建一个 GUID 分区表和一个EFI 系统类型的分区,该分区跨越目标磁盘的第一个可用 750Mib,以及另一个跨越磁盘其余部分的 Linux 默认分区。
      • 如果您使用的是真实磁盘,这些分区将分别为/dev/sda1和,而不是。通常需要为 Linux 根目录添加多个分区,这被认为是./dev/sda2/dev/sda./img/dev/sda2
    • printf无论是否有脚本,该gdisk程序都很容易使用 - 因此您最好以交互方式进行操作。运行时不应安装目标磁盘,并且您可能需要 root 权限才能w写入更改。
    • 作为一般规则,您可以在该程序中做几乎任何您想做的事情,在您w编写之前不会产生任何影响 - 所以请确保您执行时。
    • 我将把 my 放入$TGTshell 变量中。除了这里的定义之外,您可能需要根据需要进行定制,我在哪里使用它,您也可以。

      printf %s\\n o y n 1 '' +750M ef00 \
                       n 2 '' '' '' '' w y |
      gdisk ./img     >/dev/null
      TGT=$(sudo losetup --show -Pf img)p
      
      Run Code Online (Sandbox Code Playgroud)
  • 我们还需要 esp 上的文件系统。一定是FAT。

    • 我给我的标签是fs VESP。你应该随心所欲地称呼你的。
    • 我们稍后将使用该标签/etc/fstab和另一个配置文件 - 所以一定要让它有所作为。
    • 在我看来,您应该始终标记所有磁盘。
    • 如果您现在安装了操作系统,${TGT}2您当然还需要一个文件系统。

      sudo mkfs.vfat -nVESP "$TGT"1
      
      Run Code Online (Sandbox Code Playgroud)
  • 我们将创建一些mount目录并开始提取相关文件。

    set     ref     ref*iso         \
            arch    arch*iso        \
            efi     arch/EFI/archiso/efiboot.img
    while   [ "$#" -gt 0 ]
    do      mkdir "$1" || exit
            sudo mount "$2" "$1"
            shift 2
    done;   mkdir esp
    
    Run Code Online (Sandbox Code Playgroud)
  • 安装rEFInd...

    • rEFInd是一个启动管理器 - 主要提供并填充启动菜单。
    • rEFInd会将其配置文件放在 esp 上,并且可以随时以您喜欢的方式编辑这些文件。

      sudo ref/install.sh --usedefault "$TGT"1 &&
      sudo umount ref  && rm -rf ref*
      
      Run Code Online (Sandbox Code Playgroud)
  • 现在我们将使用mountesp 并从 Arch 安装磁盘中获取所需的文件,以获得我们自己的实时可启动救援磁盘。

    • 大多数 live 磁盘都会实施一种丑陋的 hack,使扁平的、未分区的 iso 文件系统看起来像 UEFI 系统可接受的引导设备,同时仍然保持与 BIOS 系统的向后兼容性。
    • Arch Linux 也不例外。
    • 这个丑陋的黑客目前efiboot.img安装在./efi. 我们可以在其中找到内核和 initramfs 映像文件。磁盘上的其他文件(在 中./arch/arch/boot不适用于EFI 系统。

      sudo sh -ec    <<CONF '
           mount    "$1" esp
           cp -ar    efi/EFI/archiso esp/EFI
           cp -ar    arch/arch/*x86* esp/EFI/archiso
           mkdir     esp/EFI/archiso/cow
           xargs   > esp/EFI/archiso/refind_linux.conf
           umount    efi arch
           rm -rf    efi arch*' -- "$TGT"1
      \"arch_iso\" \"archisobasedir=EFI/archiso    \
                     archisolabel=VESP             \
                     copytoram                     \
                     cow_label=VESP                \
                     cow_directory=/EFI/archiso/cow\
                     cow_persistence=P             \
                     cow_spacesize=384M            \
                     initrd=EFI/archiso/archiso.img\"
      CONF
      
      Run Code Online (Sandbox Code Playgroud)

您实际上刚刚从头开始安装了一个预启动救援环境,其中包含持久的写时复制保存文件(因此您可以,例如systemctl enable sshd_socket现在,该设置将在实时系统的下次启动中保留)。Arch Linux 实时安装介质现在驻留在系统的启动分区上,可以随时从启动菜单中调用。当然,您还安装了启动菜单管理器。

  • 关于上述内容,您应该注意到以下几点:
    • 我使用它是*x86*因为我有一台 64 位机器,并且该 glob 可以满足我的需要。对于 32 位安装(但为什么?)*686*改用。
      • 顺便说一句,我需要的总共只有7个文件,大约300M。
      • live-system 的 rootfs 是压缩后的镜像esp/EFI/archiso/x86_64/airootfs.sfs
    • 我通过标签指定磁盘。没有任何提示或其他类似的废话 - 磁盘已命名,因此很容易找到。您需要替换为 esp 标签选择的任何内容,而不是VESP
    • 内核copytoram参数指示 Arch Linux liveinit系统在循环挂载之前将其 rootfs 映像复制到 tmpfs 中 - 这使您在该环境中工作时实际上可以访问 esp。大多数现场安装系统都提供类似排列的结构。

EFI 的亮点在于它处理文件系统的能力。在现代计算机上,绝对没有必要打包一些原始二进制文件并将其插入磁盘分区之间。令我惊讶的是,人们仍然这样做,相反,他们可以使用排列在常规日常目录树中的简单文本文件来管理和配置他们的引导环境。上面我将内核和 initramfs 放在中央树结构中它们自己的命名文件夹中。EFI(为了rEFInd方便起见,将从本例中获取提示)将在启动时通过路径名调用它,因为它会挂载esp。

现在剩下要做的就是确保您了解如何选择在需要时实际启动的系统。了解 - 您现在就可以启动它。qemu 您可以在带有 OVMF-pflash固件的虚拟机中执行此操作,也可以重新启动计算机并rEFInd检测内核并将其路径名传递给固件,固件将加载并执行 Arch Linux live 系统。当您在磁盘上安装一个或多个更永久的系统时(如果您选择重新启动到活动磁盘并执行安装,您现在就可以这样做),您将希望将其内核和 initramfs 保持在相同的结构中。这很容易安排。

  • 例如,如果您要在名为 的根分区上安装一个系统(由于缺乏想象力)root,您可能会希望将其设置为如下所示:

    • mount --bind其根/boot路径上的特定启动文件夹/etc/fstab
    • 您需要在/etc/fstab和 中创建两行来创建挂载点/esp来处理此问题。

      sudo sh -c          <<\FSTAB     '
           [ -d /esp ]    || mkdir /esp
           findmnt   /esp || mount -L ESP /esp
           mkdir -p  /esp/EFI/root
           cp        /boot/kernel binary   \
                     /boot/initramfs.img   \
                     /esp/EFI/root
           mount -B  /esp/EFI/root /boot
           cat   >>  /etc/fstab
           echo "$1">/boot/refind_linux.conf
      ' -- '"new_menu_item" "root=LABEL=root"'
      LABEL=ESP       /esp    vfat    defaults        0 2
      /esp/EFI/root   /boot   none    bind,defaults   0 0
      FSTAB
      
      Run Code Online (Sandbox Code Playgroud)

每次安装时,您只需要执行一次类似的操作 - 假设您一开始就没有这样设置 - 这更容易,因为内核和 initramfs 已经在它们所属的位置了。一旦你输入了这些行/etc/fstab和一个最小的配置文件,/boot/refind_linux.conf你就已经设置好了。您可以在同一系统上使用同一设备支持任意数量的安装/esp,并将所有可启动二进制文件集中在同一棵树中,就像这样。不同的系统做事的方式会略有不同——例如,Windows 需要更多的哄骗才能使其符合要求——但它们都会工作

  • 好吧,正如我之前所说,您需要知道的最后一件事是如何从文件系统中选择下一个引导安装。这是在文件中配置的/esp/EFI/BOOT/refind.conf

    • 您应该阅读此文件 - 它可能包含 99% 的注释,并且会告诉您可以用它做什么。
    • 当然,您实际上不必执行任何操作 - 默认情况下rEFInd将启动其扫描树中最近更新的内核。
    • 但我通常会设置以下选项:

      <<\DEF sudo tee \
             /esp/EFI/BOOT/refind.conf.def
      ### refind.conf.def
      ### when renamed to refind.conf this file
      ### will cause refind to select by default
      ### the menu item called "new_menu_item"
      ### in its /boot/refind_linux.conf
      default_selection new_menu_item
      ### this file will also set the menu timeout
      ### to only 5 seconds at every boot
      timeout 5
      ### END
      DEF
      
      Run Code Online (Sandbox Code Playgroud)
    • 还有救援文件...

      <<\RES sudo tee \
             /esp/EFI/BOOT/refind.conf.res
      ### refind.conf.res
      ### this one will default to selecting
      ### the entry named "arch_iso" with a
      ### 10 second timeout
      default_selection arch_iso
      timeout 10
      ### END
      RES
      
      Run Code Online (Sandbox Code Playgroud)
      • 所以现在你可以移动它们。
      • 例如,要使救援环境在您执行以下操作后肯定会启动reboot now...

      sudo cp /esp/EFI/BOOT/refind.conf.res \
              /esp/EFI/BOOT/refind.conf
      
      Run Code Online (Sandbox Code Playgroud)
      • 并替换上面.def使用.res的,当然,要回到默认根目录。