我有一个运行 Linux 的远程服务器。我想远程安装操作系统映像,以防它损坏(在我试验操作系统时,这种情况已经发生过两次)。
到目前为止,我拥有的唯一方法是物理地转到计算机位置并使用 USB 磁盘来安装操作系统,BIOS 会看到它,因此它可以从中启动。
有没有什么方法可以基本上通过连接到计算机ssh
,附加此映像并让它像在 Windows 上的虚拟驱动器上一样(例如守护进程工具),这样它将持续到重新启动并允许我远程安装操作系统?
我正在 Google 上寻找解决方案,但我发现了一些提到 PXE 启动的内容......这听起来很复杂,因为你需要服务器等,而且它并不像安装映像并完成它那么简单。
除此之外,我发现没有任何有用的东西,所以我的选择非常少......有谁知道如何实现这一点?
答案1
这是我认为可能合理的假设情况:
- 目标机器是EFI。
grub
要么从未安装在目标上,要么已从系统中完全擦除。- 它只能进行干扰,否则不会提供任何有价值的东西。
/esp
因此,在上述情况下,我们可能会做的是为我们保留在EFI 系统分区上的小型安装/救援映像配置启动选项。
如果我们当前的安装出现任何问题,那么只要我们至少可以通过某种方式访问 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
- 我
接下来我要制作一张镜像盘。
- 我在这里使用带有循环设备的文件,但如果您想从固件启动到此文件,您可能需要使用实际的磁盘。
对于实际设备,可以忽略
fallocate
和losetup
内容,实际设备名称更有可能对应/dev/sda[12]
于/dev/loop0p[12]
fallocate -l4G img
现在,我将使用该
gdisk
实用程序对该磁盘进行分区并将其分配给循环设备。- 这是您想要以交互方式提供给程序的选项的脚本化快捷方式。它将创建一个 GUID 分区表和一个类型为EFI系统它跨越目标磁盘的第一个可用 750Mib 和另一个跨越磁盘其余部分的 Linux 默认分区。
- 如果您使用的是真实磁盘,这些分区将分别为
/dev/sda1
和 ,而不是。通常需要为 Linux 根目录添加多个分区,这被认为是./dev/sda2
/dev/sda
./img
/dev/sda2
- 如果您使用的是真实磁盘,这些分区将分别为
printf
无论是否有脚本,该gdisk
程序都很容易使用 - 因此您最好以交互方式进行操作。运行时不应安装目标磁盘,并且您可能需要 root 权限才能w
写入更改。- 作为一般规则,您可以在该程序中做几乎任何您想做的事情,在您
w
编写之前不会产生任何影响 - 所以请确保您执行时。 我将把 my
$TGT
放入 shell 变量中。除了这里的定义之外,您可能需要根据需要进行定制,我在哪里使用它,您也可以。printf %s\\n o y n 1 '' +750M ef00 \ n 2 '' '' '' '' w y | gdisk ./img >/dev/null TGT=$(sudo losetup --show -Pf img)p
- 这是您想要以交互方式提供给程序的选项的脚本化快捷方式。它将创建一个 GUID 分区表和一个类型为EFI系统它跨越目标磁盘的第一个可用 750Mib 和另一个跨越磁盘其余部分的 Linux 默认分区。
我们还需要 esp 上的文件系统。一定是FAT。
- 我给我的 fs 标签
VESP
。你应该随心所欲地称呼你的。 - 我们稍后将使用该标签
/etc/fstab
和另一个配置文件 - 所以一定要这样做某物。 - 在我看来,你应该始终贴上标签全部磁盘。
如果您现在安装了操作系统,
${TGT}2
您当然还需要一个文件系统。sudo mkfs.vfat -nVESP "$TGT"1
- 我给我的 fs 标签
我们将创建一些
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
安装
rEFInd
...rEFInd
是一个启动管理器 - 主要提供并填充启动菜单。rEFInd
会将其配置文件放在 esp 上,并且可以随时以您喜欢的方式编辑这些文件。sudo ref/install.sh --usedefault "$TGT"1 && sudo umount ref && rm -rf ref*
现在我们将
mount
使用 esp 并从 Arch 安装磁盘中获取所需的文件,以获得我们自己的实时可启动救援磁盘。- 大多数实时磁盘都会实施一种丑陋的 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
您基本上刚刚从头开始安装了一个具有持久性的预启动救援环境写时复制保存存档(例如,您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
kernel 参数指示 Arch Linux liveinit
系统在循环挂载之前将其 rootfs 映像复制到 tmpfs 中 - 这使您在该环境中工作时实际上可以访问 esp。大多数现场安装系统都提供类似排列的结构。
- 我使用它是
EFI 的亮点在于它能够处理文件系统。在现代计算机上,绝对没有必要打包一些原始二进制文件并将其插入磁盘分区之间。令我惊讶的是,人们仍然这样做,相反,他们可以使用排列在常规日常目录树中的简单文本文件来管理和配置他们的引导环境。上面我将内核和 initramfs 放在中央树结构中它们自己的命名文件夹中。 EFI(rEFInd
为了方便起见,将从本例中获取提示)将在启动时调用它路径名因为它坐骑尤其是
现在剩下要做的就是确保您了解如何选择在需要时实际启动的系统。了解 - 您现在就可以启动它。您可以在虚拟机中执行此操作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
每次安装时,您只需要执行一次类似的操作 - 假设您一开始就没有这样设置 - 这更容易,因为内核和 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
还有救援文件...
<<\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
- 所以现在你可以移动它们。
- 例如,要使救援环境在您执行以下操作后肯定会启动
reboot now
...
sudo cp /esp/EFI/BOOT/refind.conf.res \ /esp/EFI/BOOT/refind.conf
- 并替代
.def
为了.res
当然,上面使用的是返回默认根目录。
答案2
为了清楚起见,让我重申一下你的问题:
您想要安装 Linux 发行版,但希望避免物理访问服务器。您不能使用如下替代方案:
- Dell 的 iDRAC 或其他供应商的同等产品。这些解决方案提供带外服务器管理,即使服务器未运行任何操作系统,它们也能正常工作,并且它们提供的功能之一是您可以连接虚拟安装介质,例如虚拟 USB 记忆棒。
- 但为了使用它,您必须拥有一台具有此类功能的服务器。
- 网络启动,使用 PXE。 PXE 是当今大多数服务器都具备的一项功能,它允许服务器使用 DHCP 和 TFTP 通过网络启动。
- 但是您必须能够配置 DHCP 服务器和 TFTP 服务器才能使用 PXE,但这在您的环境中可能无法实现(例如,附近没有服务器提供这些服务)。
您在问题中提出的想法是使用服务器的现有操作系统通过网络安装安装映像,并以某种方式从中进行安装。
乍一看,这当然不可能。为了安装,您必须重新启动,特别是如果您想在现有操作系统之上安装,因为这会覆盖当前操作系统,如果您没有重新启动,那么您将尝试覆盖操作系统。仍在使用中。然而,如果您重新启动,那么现有操作系统当然会关闭,包括网络安装的安装映像。
我能想到的方法很少。这里有 2 位候选人。它们都是非常先进的过程,我不建议您尝试它们,除非您了解它们在做什么以及如何工作。另外,首先练习使用本地可访问的服务器。
用于
kexec
直接从现有操作系统启动另一个操作系统。kexec
是我所知道的唯一可以让您为替换当前操作系统的新操作系统提供启动映像的工具。kexec
仅当当前操作系统是 Linux 并且目标操作系统也是 Linux 时才能(有效)使用。kexec
要求你给它一个内核和一个要加载的 initrd。您不能给它任何其他东西,例如根文件系统映像。幸运的是,大多数 Linux 安装程序都使用独立的内核和 initrd 对,因此您可以使用它。例如,您可以从以下位置获取 Debian 安装程序所需的内核和 initrd网络启动下载页面。从 中提取它们netboot.tar.gz
。 (是的,您应该能够使用与网络引导相同的内核和 initrd。)我还没有测试过这个想法,我认为它是一个专家程序,所以你可能需要做一些工作才能实现它,这超出了这个答案的范围。
从当前操作系统内部安装新操作系统。然后切换到新的。您可以安装到单独的分区,或者如果使用 LVM(在本例中推荐)到不同的 LV。这当然需要你有足够的空间来临时存储这两个操作系统。
debootstrap
您将需要使用诸如安装新操作系统之类的工具来代替常规操作系统安装程序。使用它debootstrap
比使用常规安装程序的用户友好性要低得多,因为您必须自己执行通常由安装程序处理的几个步骤(例如,安装内核和引导加载程序,编辑基本系统配置文件)。这也使得这成为一个专家程序。
在所有情况下,您都希望能够通过远程控制台访问服务器。例如,可以通过 IPMI 来实现这一点。