使用Grub+Memdisk,随意引导ISO镜像安装系统 – 极光星空

使用Grub+Memdisk,随意引导ISO镜像安装系统 – 极光星空

极光星空(iLemonrain) 原创作品!
欢迎转载文章,转载请注明出处!

之前在用 Vicer大佬的一键重装脚本 ,感觉重装服务器系统真的好方便,至少不用再破费额外买数据盘然后把ISO镜像DD进去了……
不过用了一段时间,发现了点事情:

  • 无法安装CentOS 7系统
  • 只能装 CentOS/Ubuntu/Debian ,其他系统无法重装
  • 无法引导自己需要的ISO镜像

    总之就是世界上没有太完美的事物嘛,所以自己丰衣足食找个补充方案。

    在前几天研究 netboot.xyz 的ISO启动网络安装的方案后,我一直在想,如果使用者的服务器不提供iPXE/gPXE的话(比如一闪而过,根本不给按Ctrl+B的机会),那么是不是就真的无解了呢?
    然后我在服务器上翻了一遍又一遍,发现了在角落里瑟瑟发抖的Grub,就决定是你了,皮卡丘!(雾)

在正式开始教程前,你必须要注意的事项! ↓↓↓

  • 请准备好VNC!安装过程中全程使用VNC完成!
  • 教程不适用于 OpenVZ / LXC 虚拟化!
  • 请确保你的服务器内存足够大!因为安装镜像需要加载到内存中运行,所以建议预留出来双倍于镜像大小的空间(或者 (系统运行所需的内存+镜像大小)×1.2 )!以防止启动或安装过程中因为内存不足诱发的Out Of Memory/Kernel Panic!
  • 建议将镜像下载到磁盘中,避免启动时下载镜像!如果网络缓慢或稳定的话,可能会极大延长启动时间!
  • 目前此教程仅适用于使用 Grub+BIOS+MBR 引导的系统!(也就是如果在你的 /boot 文件夹中发现了EFI字样的文件夹,十有八九是Grub+UEFI+GPT)

Step 1:检测系统环境

首先,我们来检测下进行ISO安装的基础环境:

我们先来确定下是否存在Grub引导器:

ls /boot/grub/grub.cfg

如果返回结果为:

ls /boot/grub/grub.cfg
则说明存在Grub引导,如果返回结果为:
ls: cannot access /boot/grub/grub.cfg: No such file or directory
则说明系统并不是使用Grub作为引导,可以考虑关掉教程了(当然部分系统可能使用grub2做引导,请根据实际情况进行修改)

确认系统是使用Grub引导后,我们来确认下分区布局:
执行命令:

df -h

会返回类似这样的结果:

Filesystem Size Used Avail Use% Mounted on
/dev/vda1 25G 1.8G 22G 8% /
udev 10M 0 10M 0% /dev
tmpfs 201M 4.4M 196M 3% /run
tmpfs 501M 0 501M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 501M 0 501M 0% /sys/fs/cgroup

如果只有一个 “/”,则说明 /boot (引导目录) 和 / (根目录) 都在同一分区中;

如果返回的类似这样的结果:

Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 799M 19M 781M 3% /run
/dev/md0 137G 18G 113G 14% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda1 232M 36M 180M 17% /boot
tmpfs 799M 0 799M 0% /run/user/0

也就是说,”/” 和 “/boot” 同时存在,这时候我们就要谨慎对待处理结果(稍后会讲到)。

确认完成以下信息后,我们开始准备进行下一步的操作。

Step 2:下载系统镜像

从各大镜像站中,下载你需要的ISO镜像:

比如使用curl命令:

或者使用wget命令(取决于你的使用习惯):

在这一步下载系统镜像是为了避免在Grub启动过程中下载镜像,会让安装过程变得更难于处理。完成后继续下一步。

Step 3:准备Memdisk

既然是用网络安装,那肯定是不能用现有的磁盘存放安装镜像了……

那么,我们需要一个小工具来帮助我们:Syslinux

Ubuntu/Debian 安装Syslinux:

apt-get install syslinux -y

CentOS 安装Syslinux:

yum install syslinux -y

安装完成后,复制memdisk文件到引导目录:

cp -f /usr/share/syslinux/memdisk /boot/memdisk

在这一步完成后,开始处理Grub引导项目。

Step 4:处理Grub引导项目

我们进入Grub配置文件所在目录:

cd /etc/grub.d/  ls

会看到一些和Grub启动相关的文件:

00_header 05_debian_theme 10_linux 20_linux_xen 30_os-prober 30_uefi-firmware 40_custom 41_custom README

接下来,编辑 41_custom 这个文件,并使用以下内容覆盖原文件:

#!/bin/sh  cat <<EOF  menuentry 'OS Web Install' {      insmod part_msdos          insmod part_gpt          insmod ext2      set root=(hd0,msdos1)      echo 'Loading memdisk ...'      linux16 /boot/memdisk raw iso      echo 'Loading ISO ...'      initrd16 /boot/isoboot.iso      echo 'Booting ISO ...'  }  EOF

在这里,如果你还记得刚才分析分区布局时候的结果,现在就该派上用场了:

  • 如果你的服务器是单块硬盘,而且只有一个分区,那么root的值为 (hd0,msdos1)
  • 如果你的服务器的单块硬盘,存在不止一个分区,请看 /boot 分区在哪个盘上,比如在 /dev/vda5 上,那就是 (hd0,msdos5)
  • 其他更复杂的情况,请重启服务器,到达Grub界面时按下 C 键,进入Grub命令行,并按照以下步骤操作:

grub> ls
(hd0) (hd0,msdos1) (hd0,msdos5)
grub> ls (hd0,msdos1)/
error: unknown filesystem. # 说明这个分区不是正确的启动分区,继续尝试
grub> ls (hd0,msdos5)/
lost+found/ etc/ (各种文件夹) # 说明这个分区是正确的启动分区

之后输入 reboot 回到系统中,继续编辑文件并填写正确的分区信息。

编辑完成后,继续修改 /etc/default/grub 配置文件:

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian
GRUB_CMDLINE_LINUX_DEFAULT=”quiet”
GRUB_CMDLINE_LINUX=””

将其中的 GRUB_TIMEOUT 的数值改的稍大些(比如30),之后保存文件退出。

执行命令,更新Grub配置文件信息:

update-grub

之后查看修改好的Grub配置文件,确认是否正确写入:

cat /boot/grub/grub.cfg

如果在文件末尾发现了你写的Grub配置信息,比如这样:

BEGIN /etc/grub.d/41_custom

menuentry ‘OS Web Install’ {
insmod part_msdos

  insmod part_gpt    insmod ext2

set root=(hd0,msdos1)
echo ‘Loading memdisk …’
linux16 /boot/memdisk raw iso
echo ‘Loading ISO …’
initrd16 /boot/isoboot.iso
echo ‘Booting ISO …’
}
### END /etc/grub.d/41_custom ###

则说明已经处理好引导,可以开始愉快的重装了~

Step 5: 重启开始安装系统

接下来,重启系统后会来到安装界面:
grub-memdisk-boot-iso-1.png
我们选择最下面的 OS Web Install 选择,就可以愉快的开始ISO安装啦~
grub-memdisk-boot-iso-2.png

(ps: 如果无法启动安装的话,可以试试 netboot.xyz 的启动镜像: https://boot.netboot.xyz/ipxe/netboot.xyz.iso )

求打赏求投喂 OwO

你的捐赠将会用来维护服务器正常运行以及日常的生活费所需。

如有需要,请通过以下方式打赏我,谢谢你们的支持!

支付宝二维码: http://t.cn/EA3pZNt
微信二维码: http://t.cn/EA3p639
Telegram: @ilemonrain https://t.me/ilemonrain