我有一个运行 Linux 的远程服务器。我想远程安装操作系统映像,以防它被损坏(在我试验操作系统时这已经发生了两次)。
到目前为止,我所拥有的唯一方法是物理转到机器位置并使用 USB 磁盘安装操作系统和 BIOS 看到它,因此它可以从它启动。
有什么方法可以通过连接到机器ssh
,附加这个图像,让它像在 Windows 上的虚拟驱动器上一样(例如守护程序工具),所以它会持续重启并允许我远程安装操作系统?
我正在 Google 上查看解决方案,但我发现一些提到 PXE 启动的内容....这听起来很复杂,因为您需要一个服务器等,而且它不像安装映像并完成它那么简单。
除此之外,我没有发现任何有用的东西,所以我很缺乏选择......有谁知道如何做到这一点?
这是我认为可能合理的假设情况:
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
Run Code Online (Sandbox Code Playgroud)接下来我要制作一张镜像盘。
对于实际设备,可以忽略fallocate
和losetup
内容,实际设备名称更有可能对应/dev/sda[12]
于/dev/loop0p[12]
fallocate -l4G img
Run Code Online (Sandbox Code Playgroud)现在,我将使用该gdisk
实用程序对该磁盘进行分区并将其分配给循环设备。
/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
Run Code Online (Sandbox Code Playgroud)我们还需要 esp 上的文件系统。一定是FAT。
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)现在我们将使用mount
esp 并从 Arch 安装磁盘中获取所需的文件,以获得我们自己的实时可启动救援磁盘。
这个丑陋的黑客目前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*
改用。
esp/EFI/archiso/x86_64/airootfs.sfs
。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
。
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
的,当然,要回到默认根目录。