1. 背景说明
1.1. 为什么
为什么要在阿里云轻量应用服务器上安装红帽系统 - Red Hat Enterprise Linux(RHEL) 8.10 ? 那当然是因为爱啊!没错,就是爱折腾-...-!
说正经的,起初确实是想在服务器上安装红帽系统,因为在本地计算机上学习 linux 就是用的 RHEL 8.10,也想在服务器搭建一个一样的环境,结果阿里云没有提供。。。那么装一个 CentOS Linux 8 吧,但今年六月底好像社区停止维护彻底变成 RHEL 的上游版本了,于是又想着装一个 Rocky Linux 8.10 来替代,结果发现阿里云轻量应用服务器提供的系统镜像最高只到8.6版本,由此我脑中就浮现出了一个问题:如何在云服务器安装一个厂商未提供系统镜像的系统? 虽说网上有各种“VPS一键dd重装脚本”,但作为一个有“洁癖”的人,只想使用官方的镜像安装一个“纯净”的系统,那么本着折腾的精神。。。搞错了。。。是抱着学习的精神来研究解决这一问题,于是就有了这一篇文章的折腾记录。
本文是选择了安装 RHEL 8.10 来演示,没有什么特殊含义,单纯就是一种尝试,给大家打个样,最终实际学习环境还是选择安装了Rocky Linux 8.10 系统。
1.2. 曲折的尝试
先简单说一下云服务器重装系统的原理:实际上很多 Linux 发行版都提供了支持网络安装的内核映像文件(Rocky Linux 8.10 提供的网络启动文件 vmlinuz、initrd.img),这类文件大小极小,基本只有几十M,甚至10M左右,可以配置好 GRUB 后从这两启动文件引导系统,之后即可开始安装过程,而在安装过程中所需的数据都是从网络上即时下载到内存,然后安装到硬盘,这样一来不仅不需要提前下载完整系统镜像(小则几百兆,大则几个G)就可以完成系统的部署,同时还可以指定安装过程中的自动应答文件,由人工选择变成自动执行,完成自动化安装,网上的“VPS一键dd重装脚本”对于Linux类系统的安装基本都是依靠这一原理实现。
那么安装红帽系统能不能也这样做呢?理论上是支持的,因为红帽厂商提供了网络启动系统镜像(下载页面),可以从里面提取出相关启动文件(在 images/pxeboot
目录下),配置好 GRUB 后也可从网络启动安装,但前提是需要下载官方提供的完整的安装DVD ISO来搭建一个网络软件仓库,以便在安装过程中访问 BaseOS
和 AppStream
软件仓库下载安装系统所需的数据。这对于普通玩家来说无疑是困难的,没有合适的网络资源来搭建网络仓库(需要云服务器能访问到),所以基本可以直接放弃网络安装红帽系统。
既然网络安装红帽系统有难度,那么我直接网络安装 Rocky Linux 8.10
试下呗!实测下来,还没有进入到图形安装界面就卡住了,直接死机了,屏幕(实际是阿里云的远程救援连接)信息输出内存空间不够了。。。这里简单提一下我的实验机器的配置:单核2G内存40G硬盘。后来查阅资料得知,网络安装红帽8系统内存要求最低为3G,参考红帽系统硬件要求说明,这两系统同源,应该有一定参考性,那么这样硬件不行那就没办法了呀!
既然网络安装红帽系统不行,那么开机直接从磁盘加载整个完整的安装DVD ISO来安装系统可行吗?我为什么会有这种想法呢?因为在windows下可以这么干类似的事情,下载好官方的系统镜像后,解压出来,直接双击 setup.exe
就可以开始重装系统。基于这样的经验我就产生了类似的念头,既然 GRUB 可以自由选择启动文件,那能不能直接选择从红帽完整的安装DVD ISO启动呢?搜索一番后,发现还真的可以,主要过程记录如下:
# 编辑自定义启动菜单
vi /etc/grub.d/40_custom
# 添加如下启动菜单(注意删掉行首的井号注释符) (hd0,5)表示第1块磁盘的第5个分区,/dev/vda5表示的同一个分区,是镜像存放的位置
#menuentry 'Install RHEL8.10 Linux' --class gnu-linux --class gnu --class os {
# loopback loop (hd0,5)/rhel-8.10-x86_64-dvd.iso
# set root=(loop)
# linux (loop)/isolinux/vmlinuz inst.stage2=hd:/dev/vda5 quiet
# initrd (loop)/isolinux/initrd.img
#}
# 修改默认启动项
sed -ri 's/^GRUB_DEFAULT.*/GRUB_DEFAULT="Install RHEL8.10 Linux"/g' /etc/default/grub
# 更新grub
# Debian系的系统
update-grub
# 红帽系的系统
grub2-mkconfig -o /boot/grub2/grub.cfg
# 重启后可自动进入红帽系统安装过程
reboot
不过这样真的可以安装了吗?实测是可以的,但是不能高兴的太早,有个前提是需要单独划分出一个物理分区来存放这个系统安装镜像,注意是物理分区,否则在安装过程中会出现一个问题:老系统使用的是 LVM 管理磁盘空间,逻辑卷又基本上使用的是整个磁盘,镜像文件所在的分区在使用中又不能被删除,没有办法重新释放磁盘空间,那就无法安装新系统了。即使没有使用 LVM 来管理磁盘,阿里云默认提供的镜像一般也是将系统安装到一个分区下,重新做物理分区也不太可能,进行到这一步基本也是宣告没戏了。
难道只能到这里了吗?不,可能是老天觉得我太帅了,问题出现了转机。。。一天在搜索VPS一键重装系统脚本的时候,发现了一个帖子Linux一键重装支持Debian 12,Ubuntu 22.04,史上最强,这里面提到了一个方法:使用 Alpine Linux 作为中间系统来安装目标系统。作者对使用中间系统的说明在这个帖子:实现Ubuntu22.04+安装原理及我对原生网络安装及dd安装的看法1,感兴趣的看官可以自行研究下。重点就是 Alpine Linux 这个系统安装后是运行在内存里的,类似于 windows pe 环境,对磁盘可做任何操作,重新分区当然也行,然后可将当前内存里的操作系统同步到磁盘上以供后续正常启动使用,这一下就让问题有了解决方案。
1.3. 最终的胜利
基于上述脚本,我有了如下实验思路
- 基于现有系统配置 GRUB 从网络安装 Alpine Linux
- 当 Alpine Linux 启动运行在内存时,对磁盘重新分区,单独预留一个
data
分区来存放红帽系统完整的安装DVD ISO - 将内存中的 Alpine Linux 同步到磁盘系统分区
- 重启后上传红帽系统完整的安装DVD ISO到
data
分区 - 基于 Alpine Linux 系统配置 GRUB 从完整的安装DVD ISO安装 RHEL 8.10
2. 实验开始了
2.1. 实验环境
服务器配置:单核2G内存40G硬盘,实验前恢复到阿里云官方的 Rocky Linux 8.6
系统,基于该系统进行后续实验。
磁盘布局:
2.2. 安装中间系统 Alpine Linux
下载网络启动文件到 /boot
目录下
wget -O /boot/vmlinuz-virt https://mirrors.ustc.edu.cn/alpine/v3.20/releases/x86_64/netboot/vmlinuz-virt
wget -O /boot/initramfs-virt https://mirrors.ustc.edu.cn/alpine/v3.20/releases/x86_64/netboot/initramfs-virt
添加自定义启动菜单
vi /etc/grub.d/40_custom
文件尾添加如下菜单
menuentry 'Install Custom Linux' --class alpinelinux --class gnu-linux --class gnu --class os {
set root=(hd0,3)
linux /boot/vmlinuz-virt alpine_repo=https://mirrors.ustc.edu.cn/alpine/v3.20/main/ modloop=https://mirrors.ustc.edu.cn/alpine/v3.20/releases/x86_64/netboot/modloop-virt ip=dhcp
initrd /boot/initramfs-virt
}
注:参数(hd0,3)代表启动文件所在的位置。硬盘从0开始计数,分区从1开始计数。hd0表示第一块硬盘,即 /dev/vda ;3表示第3个分区,即 /dev/vda3 。
修改默认启动项
sed -ri 's/^GRUB_TIMEOUT.*/GRUB_TIMEOUT=8/g' /etc/default/grub
sed -ri 's/^GRUB_DEFAULT.*/GRUB_DEFAULT="Install Custom Linux"/g' /etc/default/grub
测试启动方式
test -d /sys/firmware/efi && echo UEFI || echo BIOS
更新 GRUB
,如若显示 BIOS
执行:
grub2-mkconfig -o /boot/grub2/grub.cfg
更新 GRUB
,如若显示 UEFI
执行:
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
重启后即自动进入 Alpine Linux
安装过程
reboot
后续需要到阿里云远程救援连接操作,系统会自动进入 Install Custom Linux
菜单(注意:这里实测下来发现有时候还是会自动进入老系统,这时候再重新启动一下就可以自动进入Alpine Linux
安装了)
Alpine Linux
启动后,直接使用 root
用户登录,无需输入密码,直接回车即可:
这里提一下,当前系统是运行在内存中的,类似于
windows pe
环境,基于此我们才可以对磁盘重新分区。在分区之后,我们还可以将内存中的系统也安装到磁盘上,这一步是必须做的,否则重新分区了,磁盘上没有任何系统可以启动,后续就没法操作了,同时也安装了一个备用系统可供正常使用,避免发生意外进不去系统。正是因为 Alpine Linux
支持所有这些操作,所以我们才能进行这次实验。
安装软件包
apk add openssh e2fsprogs e2fsprogs-extra util-linux parted
阿里云的救援连接毕竟使用起来输入不方便,简单配置一下
ssh
,便于远程登录使用
sed -ri 's/^#?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
sed -ri 's/^#?PermitEmptyPasswords.*/PermitEmptyPasswords yes/g' /etc/ssh/sshd_config
rc-update add sshd
rc-service sshd start
此时可以断开阿里云的救援链接了,转为使用本地的
ssh
工具登录远程服务器了,接着进行其他配置,以下步骤中应该只用配置网络相关的即可,这里都配置了只是为了记录一下新系统的使用
# 配置键盘布局
setup-keymap us us
# 配置主机名
setup-hostname localhost
# 生效新主机名
rc-service hostname restart
# 配置网络
setup-interfaces -a
# 设置开机启动网络
rc-update add networking boot
# 重启网络
rc-service networking restart
# 配置时区
setup-timezone Asia/Shanghai
# 配置软件仓库 可直接输入15 选择的是 mirrors.ustc.edu.cn
setup-apkrepos
# 配置NTP服务器
setup-ntp
接下来是关键步骤了,开始重新分区,需要单独划分出一个分区来存放红帽系统镜像,我这里是将最后一个分区预留出来,大概14G的空间,这里分区布局是基于40G的空间,各位看官可根据自己实际情况做合理调整
# 创建命令别名,减少输入
alias p="parted -sa optimal /dev/vda"
# 创建gpt分区表
p mklabel gpt
# 设置pmbr_boot标志
p disk_set pmbr_boot
# 创建bios_grub分区,gpt分区表下使用bios启动需要这个分区
p mkpart primary 1MiB 2MiB
# 创建boot分区
p mkpart primary 2MiB 514MiB
# 创建swap分区
p mkpart primary 514MiB 5GiB
# 创建root分区
p mkpart primary 5GiB 26GiB
# 创建data分区,存放红帽系统镜像
p mkpart primary 26GiB 100%
# 设置分区标志
p set 1 bios_grub
# 设置分区标志
p set 2 boot
# 设置分区标志
p set 3 swap
# 创建boot分区文件系统
mkfs.ext2 /dev/vda2
# 创建swap分区文件系统
mkswap /dev/vda3
# 创建root分区文件系统
mkfs.ext4 /dev/vda4
# 创建data分区文件系统
mkfs.ext4 /dev/vda5
创建挂载目录,将内存里的系统安装到 Alpine Linux
到硬盘:
mkdir /mnt/rootfs
mount /dev/vda4 /mnt/rootfs
mkdir /mnt/rootfs/boot
mount /dev/vda2 /mnt/rootfs/boot
export BOOTFS=ext2 ROOTFS=ext4 BOOTLOADER=grub
setup-disk -m sys /mnt/rootfs
grub-install /dev/vda --root-directory=/mnt/rootfs/boot
重启后即可正常启动
Alpine Linux
reboot
2.3. 安装目标系统 RHEL 8.10
Alpine Linux
安装好了之后,分区也布局好了,接下来就可以安装红帽系统了。
创建挂载目录来存放红帽系统镜像
mkdir /data
mount /dev/vda5 /data
通过各种方式将红帽系统镜像存放到
/data
目录下。我这里通过sftp直接上传,虽说慢一点但操作简单无需额外配置。
添加自定义启动菜单
vi /etc/grub.d/40_custom
文件尾添加如下菜单
menuentry 'Install Custom Linux' --class gnu-linux --class gnu --class os {
loopback loop (hd0,5)/rhel-8.10-x86_64-dvd.iso
set root=(loop)
linux (loop)/isolinux/vmlinuz inst.stage2=hd:/dev/vda5 quiet
initrd (loop)/isolinux/initrd.img
}
注:参数(hd0,5)代表镜像文件所在的位置。硬盘从0开始计数,分区从1开始计数。hd0表示第一块硬盘,即 /dev/vda ;5表示第5个分区,即 /dev/vda5 。
修改默认启动项
sed -ri 's/^GRUB_TIMEOUT.*/GRUB_TIMEOUT=8/g' /etc/default/grub
sed -ri 's/^GRUB_DEFAULT.*/GRUB_DEFAULT="Install Custom Linux"/g' /etc/default/grub
更新 GRUB
update-grub
重启后即自动进入 Red Hat Enterprise Linux 8.10
安装过程,后续需要连接到阿里云的救援链接操作
reboot
安装红帽系统,详细步骤略,这里主要记录以下磁盘的操作
选择自定义配置
删除老系统的root分区
删除老系统的bios_grub分区
创建新系统的bios_grub分区
创建新系统的boot分区
创建新系统的swap分区
创建新系统的root分区
分区布局,注意这里root分区使用LVM管理比较合适,因为后续安装完成不想要保留系统镜像了可以删除并将之前分配的data分区通过LVM合并到root分区,或做其他部署,使用起来更加灵活方便
汇总界面
至此即可点击开始安装继续了!
评论 (0)