Total Pageviews

Tuesday, 2 July 2019

使用Grub+Memdisk,随意引导ISO镜像,安装系统

之前在用 Vicer的一键重装脚本: https://moeclub.org/2018/04/03/603/?spm=43.4 ,感觉重装服务器系统真的好方便,至少不用再额外买数据盘,然后把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命令:
curl -o /boot/isoboot.iso https://mirrors.aliyun.com/ubuntu-releases/releases/16.04.5/ubuntu-16.04.5-server-amd64.iso
或者使用wget命令(取决于你的使用习惯):
wget -O /boot/isoboot.iso https://mirrors.aliyun.com/ubuntu-releases/releases/16.04.5/ubuntu-16.04.5-server-amd64.iso
在这一步下载系统镜像是为了避免在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 <'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: 重启开始安装系统

接下来,重启系统后会来到安装界面.
我们选择最下面的 OS Web Install 选择,就可以愉快的开始ISO安装啦~
(ps: 如果无法启动安装的话,可以试试 netboot.xyz 的启动镜像: https://boot.netboot.xyz/ipxe/netboot.xyz.iso )

No comments:

Post a Comment