背景
Red Hat Enterprise Linux(RHEL)是一个由Red Hat开发的商业市场导向的Linux发行版,Red Hat Enterprise Linux 常被简称为 RHEL. 据IDC统计,到2018年,服务器操作系统市场份额达到33.4%. 目前,在中国大陆市场,RHEL主要为跨国企业或者外资在使用,其他很多企业都始终把CentOS (Community Enterprise Operating System) Linux为红帽系主要操作系统,但红帽于2020年12月8号突然调整商业策略,将CentOS Linux切换为CentOS Stream ,这直接导致CentOS与RHEL上下游关系发生调换,同时由于CentOS Stream不会有固定大版本发布, 虽然后续有Rocky Linux等迅速创建,但是大家应该都知道这里面的影响在哪里,是不是新创建一个版本就能很快解决的,这里我也不再赘叙。
基于以上背景,本文将仅从技术角度讲述如何通过自定义镜像方法将RHEL7.9和RHEL8.2/8.3导入腾讯公有云平台,同时在此声明本篇文章将不涉及任何商业考虑,同时也非官方手册,仅作为自己研究和学习参考。
过程
准备
1.一台带有KVM(Kernel-based Virtual Machine)的Linux环境 (我使用的Mac安装VMware Fushion 再虚拟Fedora 33环境)或者任何可以x86虚拟机都行, 这个不重要,不嫌麻烦的话,理论上 可用任何虚拟机,最后转换格式就行,我怕麻烦,直接用了KVM
2.一个有效的腾讯云账号,激活了腾讯云对象存储并且已经创建了存储桶,不然你无法创建实例做测试。
3.一个有效的红帽ID和有效的订阅 - 最少应该包含RHEL Standard订阅,不管是NFR还是Self supported或者花真金白银买的订阅。
步骤
1.不管用什么办法,搞到一个虚拟环境最好带有KVM的,因为本文以KVM为例
2.创建虚拟机,使用下载好的RHEL镜像,存储为qcow2 单文件,RHEL7 分配5G,RHEL8 分配10G (少于10安装失败),不要跟自己过不去,搞太大,上传会浪费时间,存储会浪费money,当然虽然qcow2,vhd,vmdk,raw其实都可以得到支持,但我更喜欢qcow2。
3.安装使用minimal,不需要搞GUI(RHEL8默认会选择GUI,RHEL7默认就是minimal)
4.进入系统开始常规性检查,具体步骤见 https://cloud.tencent.com/document/product/213/17814 ,虽然有官方文档,但我还是要重复一次.
1)检查 OS 分区和启动方式
# parted -l /dev/sda | grep 'Partition Table'
- 若返回结果为 msdos,即表示为 MBR 分区,请执行下一步。
- 若返回结果为 gpt,即表示为 GPT 分区。目前服务迁移不支持 GPT 分区,请主动放弃
2)执行以下命令,检查操作系统是否以 EFI 方式启动
#ls /sys/firmware/efi
- 若存在文件,则表示当前操作系统以 EFI 方式启动,请 提交工单 反馈。
- 若不存在文件,请执行下一步。
3) 检查系统关键文件
主要为以下文件(默认情况下,RHEL7和RHEL8基本不会有什么问题),确保没有使用磁盘名(如/dev/sda1)挂载的
- /etc/grub2.cfg: kernel 参数里推荐使用 uuid 挂载 root,其它方式(如 root=/dev/sda)可能导致系统无法启动。
- /etc/fstab:请勿挂载其它硬盘,迁移后可能会由于磁盘缺失导致系统无法启动。
- /etc/shadow:权限正常,可以读写。
4)卸载软件
卸载会产生冲突的驱动和软件(包括 VMware tools,Xen tools,Virtualbox GuestAdditions 以及一些自带底层驱动的软件),如果使用KVM,基本可以忽略这些。
5)检查 virtio 驱动
Step 1: 检查内核是否支持:
#grep -i virtio /boot/config-$(uname -r)
- 如果返回结果中CONFIG_VIRTIO_BLK 参数和CONFIG_VIRTIO_NET 参数取值为 m,直接进入Step 2 -> RHEL 7和RHEL8将会出现这种情况
- 如果在返回结果中CONFIG_VIRTIO_BLK 参数和CONFIG_VIRTIO_NET 参数取值为 y,表示该操作系统包含了 Virtio 驱动,您可以直接导入自定义的镜像到腾讯云.
- 如果在返回结果中没有CONFIG_VIRTIO_BLK 参数和CONFIG_VIRTIO_NET 参数的信息,表示该操作系统不支持导入腾讯云.
Step 2:检查临时文件系统是否包含 Virtio 驱动:
#lsinitrd /boot/initramfs-$(uname -r).img | grep virtio
在RHEL7.9上,会符合条件,返回如下:
很不幸,在RHEL 8.2/8.3上,默认情况,你看不到跟RHEL7.9 一样的情况,需要手动添加,新建/etc/dracut.conf.d/virtio.conf,添加如下内容:
add_drivers ="virtio_scsi virtio_blk virtio_net virtio_console"
然后执行如下命令:
# dracut -f
以上命令会创建新的initramfs(不要被官网那些什么编译内核的步骤吓唬到,没那么恐怖)
6) 安装 cloud-init
在这里,我跟官方文档有一些不同意见,当然这仅代表我个人观点, 如果使用源码包或者所谓绿色软件方法安装, 我想最少会存在以下两个问题:
- 根据红帽的SLA,红帽是不会对任何源码安装的包提供支持,所以任何后续涉及到cloud-init的安全问题或者配置问题,就算你有正规的订阅,你不会得到任何支持,所以任何推荐使用源码包在RHEL上安装的办法都不符合红帽的最佳实践,笔者在海外工作数年,深知安全问题和技术支持问题对大企业的重要性,一个小小的包极有可能引发极大问题,所以对于安装的包的选择都是慎之又慎.
- 按照源码安装或者绿色安装办法,不管在RHEL7.9还是8.2/8.3上都会存在些许问题,红帽很多包,是通过backport的方法进行支持,为了追求整体系统稳定性,不会轻易升级库的版本(如果你使用过RHEL上的docker,你大概明白我在说什么),所以安装起来不会太过顺利,就算勉强安装上,一旦出现问题,会非常麻烦.
所以在这里,我的观点是使用RHEL标准仓库自带的cloud-init,而不是什么源码的办法,至于具体安装办法很简单,使用订阅,注册到红帽CDN,直接使用yum install -y cloud-init安装最新的cloud-init,安装完成后,创建以下用户
# useradd syslog
然后可以再使用官网提供的cloud.cfg去替换初始文件,并且运行一下命令,激活开机启动:
#systemctl enable cloud-init-local.service
#systemctl enable cloud-init.service
#systemctl enable cloud-config.service
#systemctl enable cloud-final.service
7)更改网络端口到eth0
Step 1: 打开/etc/default/grub, 在GRUB_CMDLINE_LINUX行尾添加:
net.ifnames=0 biosdevname=0
注意:黑石服务器2.0 可能需要更改以下配置:
GRUB_CMDLINE_LINUX=“console=ttyS0,115200 net.ifnames=0 biosdevname=0”
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
Step 2: 重新编译grub启动配置
# grub2-mkconfig -o /boot/grub2/grub.cfg
Step 3: 打开/etc/sysconfig/network-scripts/ifcfg-xxx,修改如下:
NAME="eth0"
DEVICE="eth0"
保存,同时修改/etc/sysconfig/network-scripts/ifcfg-xxx到/etc/sysconfig/network-scripts/ifcfg-eth0,到此,系统基本修改完毕,关机.
8)上传镜像到对象存储cos
上传之前,确保你已经激活cos和创建一个桶,直接找到/var/lib/libvirt/images/xxx.qcow2文件然后上传到桶内,上传完毕后,直接获取URL
9) 导入镜像
云服务器->镜像->导入镜像
注意:
- 镜像地域需与cos的存储区域保持一致
- 导入方式选择正常,系统会帮你检查镜像,除非你真的知道自己在做什么,那么可以选择强制,后面手动配置
- 系统平台,RHEL7可以选择CentOS 7, RHEL8 选择 CentOS 8
点击下一步后,稍等片刻,会提示是否导入成功,如导入失败,可以参看这里,进行对照
https://cloud.tencent.com/document/product/213/4945
10) 创建实例验证,导入完成后,可以直接创建实例验证
总结:整体来说,使用自定义镜像导入镜像到腾讯云较为简单,实现方法也很多种,本文仅仅提供一些基础的步骤,供大家在无聊之余,导入RHEL镜像到腾讯云平台进行尝试.