随着业务形态,业务种类的不断拓展,使用公版 ISO 安装树 与 ISO 镜像存在较大的不便与弊端;
存在安装配置不统一,溯源难等特点;给后期的系统运维带来很高的复杂度
目的:
解决业务需要多种不同系统需求,版本管理困难,溯源难, 运维排障复杂度高等痛点问题
适应新型态下的多种类装机需求,灵活支持,便于迭代更新
自定义的软件包组设置,结合 kickstart 应答控制文件 结合 沙箱技术与 iPXE 技术可以使用大规模自动化装机部署
术语与缩写:
术语名称 术语解释
RHEL 全称为 Redhat Enterprise Linux ,为红帽子公司推出的免费开源的 Linux 商业发行版
CentOS CentOS 为基于 RHEL 上游释放的源码去掉 RHEL logo 与商业软件后重新编码的再发行版,CentOS 社区已被 RHEL 收编,目前 CentOS-7 版本于2020年结束主流支持
Fedora Fedora 目前已被 Redhat 收编,红帽子用来实验一些新技术在此发行版,稳定后移植到 RHEL
kickstart 红帽系发行版操作系统的自动化部署控制脚本与方法
ISO 一种文件格式与标准
BIOS 基本输入输出系统,为X86架构的计算机的底层的软件
EFI/UEFI 统一可扩展固件;为全新的一种计算机的底层软件,支持多种新处理器架构
RPM redhat package management 红帽子包管理系统
Anaconda anaconda 为红帽系发行版的 安装器(installer)程序
grub 当代 linux 发行版的主流的引导程序
xml 一种文件格式与标准
dd linux 下的一种操作裸磁盘块的工具
yum yellow dog package management 黄狗包管理系统,是红帽系自动管理RPM依赖关系,自动安装软件包的一种工具,python 编写
python 当代的流行的一种解释性的语言
GPL 一种开源协议
原 CentOS 社区官方基于 RHEL 构建二进制兼容版本的基本流程:
0d3ff18c-04d3-40ff-85aa-9aa7bb5b0c6b
根据实际需求出发,选择基本CentOS 社区版本进行二次定制开发
二次定制开发的流程大致如下:
分析公版 minimal 镜像 ISO 文件结构
抽取拷贝原公版 ISO 中的所有文件与目录结构到 二次定制开发路径,并需要留意修复抽取 ISO 后部分长文件名文件后缀名丢失的问题
根据需求收集需要的 RPM 软件包与依赖包放置在 Packages 目录下
根据需求收集需求的 RPM 名字,修改适配软件组的主控文件 XML 文件 repodata/cca56f3cffa18f1e52302dbfcf2f0250a94c8a37acd8347ed6317cb52c8369dc-c7-x86_64-comps.xml
根据上述修改后的 XML 与 Packages 中的包重新生成 repodatas 中的 ISO RPM包的 repo 数据库
定制修改 anaconda installer 安装器。并输出新的 boot.iso ,用于替换旧的 ISO 中的 vmlinux initrd.img 以及 suqashfs.img
添加需要的额外拷贝的工具或者文件包到 ISO 构建目录
修改原生的 BIOS 模式与 UEFI 模式下的 grub 引导配置文件
按需修改添加 ks 文件到 ISO 中 (可选步骤)
封装打包为 ISO 镜像,为了支持超大单个文件输出为 UDF 格式
嵌入 hybrid 启动 与 MD5 指纹到 ISO 中
测试安装 ISO
发布
定制需求
基于公版 centos 7.9 minimal 镜像二次定制开发
定制修改 anaconda installer 支持高级功能
软件组越小越好,需要支持基本的容器项目的正常运行
需要自动化安装无需人工干预
系统盘分区采用标准分区
根据主流的 CSI benchmark 安全红线要求,设置用户的密码强度要求,弱密码不准使用
首次登录必须更改密码
默认不开防火墙与 selinux 服务
默认系统为英语环境,美式键盘,上海时区
默认增大系统单个进程能打开的句柄数到 65536*2
默认启用 root用户的 ssh 访问
采用图形化安装界面
默认系统盘选盘逻辑要适应多盘位的使用场景,支持多种类型的磁盘,支持 vmware与 KVM 虚拟机部署
增加的个性化的定制化信息
支持放入超大的软件包超过 4GB
支持使用U盘刻录安装,支持带外 BMC 挂载 ISO 安装,刻录 cd/dvd 安装
支持 UEFI 与 BIOS 两种引导方式
默认系统需要禁用 CPU C-stat 省电,安装完后的系统中删除ks文件,防止泄密
默认需要开启 KDUMP 服务
默认需要关闭不必要的后台服务
系统默认网络采用 DHCP,无需设置主机名
系统默认预置两个用户,一个 root 用户,一个 isotest 用户; root 用户密码为 XXXXX; iso_test 用户默认密码为 isotest
系统默认密码文件采用影子形式加密存储
原版社区的 ISO 镜像(俗称公版ISO镜像)树的结构解析:
公版的 CentOS-2009-Minimal_x86_64.iso 镜像文件,将镜像挂载到 /media 目录可以看到 ISO 抽取后的文件目录结构如下:
d2630aca-be5b-4176-8011-f7ddbc53b922
目录说明:
EFI 存放EFI 模式的引导文件
images 存放efi 文件与PXE 启动的内核与临时跟文件系统文件 (stage1 image 目录)
isolinux 存放 BIOS 模式引导文件 (stage1 image 目录)
LiveOS 存放 Anaconda installer 的目录(stage2 image 目录)
Packages 存放 RPM 软件包的目录
repodata 存放 RPM 软件组元数据的目录
文件说明:
CentOS_BuildTag CentOS 构建标签
.discinfo 记录构建 ISO 时间戳,ISO架构信息,版本号
.treeinfo 记录构建 ISO 中重要文件的配置文件
RPM-GPG-KEY-CentOS-7 RPM 包的 GPG KEY
RPM-GPG-KEY-CentOS-Testing-7 RPM 包的 GPG KEY
.TBL 记录 ISO 生成时的文件名转换的文件
EULA 用户协议文档
GPL CentOS 的开源协议
BIOS 模式 ISO 启动流程:
BIOS 模式: server 启动 ---- > BIOS POST ----- > BIOS 选择选择从 CD/DVD 启动 ----- > ISO 读取启动扇区偏移 ---- > (isolinux/isolinux.bin)grub2 程序 ---- > 读取 isolinux/isolinux.cfg 启动菜单(stage1 阶段 ) ----- > 按照菜单的配置 stage2 阶段 加载 isolinux/vmlinuz 内核 + isolinux/initrd.img ----- > (切换加载 安装器 anaconda installer rootfs LiveOS/squashfs.img ) ----- > (加载基础的各类 systemd 服务) ------ > 启动默认的 default-target 实际指向 ----- > anaconda.service ----- > 启动 anaconda 图形安装界面 or anaconda text 安装界面 ----- > 手动选择安装 or kickstart 自动安装
UEFI 模式: server 启动 ---- > BIOS POST ----- > UEFI 选择选择从 CD/DVD 启动 ----- > ISO 读取 EFI BOOT 信息---- > grub2 程序(BOOTX64.EFI) ---- > 读取 EFI/BOOT/grub.cfg 启动菜单(stage1 阶段 ) ----- > 按照菜单的配置 stage2 阶段 加载 image/pxeboot/vmlinuz 内核 + image/pxeboot/initrd.img ----- > (切换加载 安装器 anaconda installer rootfs LiveOS/squashfs.img) ----- > (加载基础的各类 systemd 服务) ------ > 启动默认的 default-target 实际指向 ----- > anaconda.service ----- > 启动 anaconda 图形安装界面 or anaconda text 安装界面 ----- > 手动选择安装 or kickstart 自动安装
引导菜单定制开发:
背景:
引导菜单的设计分为两类,一种是传统的 BIOS 类型引导,一种是 UEFI/EFI 类型的引导;
其中BIOS类型的引导目前使用的是开源的 syslinux 组件中的 isolinux 部分组件实现的, 而 EFI/UEFI 模式则采用 grubx64.efi 或 BOOTX64.EFI 完成引导
实现方法逻辑两种类型引导的原版引导文件打开进行走读,掌握两种模式的引导菜单的语法,格式,参数等等;
主要修改点是修改引导时指定的安装菜单的标签名称,stage2 阶段映像的加载的媒介的标签,以及添加获取自动安装 ks 的内核传参,外加一些额外的内核参数 ; 定制的图形启动菜单背景图 LOGO 信息也可以写在里面,但是目前图形化的引导菜单支持目前 BIOS 模式支持比较好,UEFI 模式不做处理于支持
修改后的配置文件示意:
BIOS 模式启动菜单: 引导文件为 ISO目录中的 isolinux/isolinux.cfg 文件
prompt 1
ui vesamenu.c32
menu background splash.jpg
default kickstart
MENU TITLE RTX-9090 Linux BOOT MENU
timeout 50
# Do not display the actual menu unless the user presses a key. All that is displayed is a timeout message.
menu tabmsg Press Tab for full configuration options on menu items.
menu separator # insert an empty line
menu separator # insert an empty line
label kickstart
menu label ^INSTALL RTXOS X86_64 LAGACY
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=rtxOS:/ inst.ks=hd:LABEL=rtxOS:/ks.cfg vga=791 modprobe.blacklist=nouveau
menu separator # insert an empty line
label isocheck
menu label Test This Media && Install RTXOS
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=rtxOS:/ inst.ks=hd:LABEL=rtxOS:/ks.cfg rd.live.check quiet vga=791 modprobe.blacklist=nouveau
menu separator # insert an empty line
label memtest
menu label Run a ^Memory Test
text help
If your system is having issues, a problem with your
system's memory may be the cause. Use this utility to
see if the memory is working correctly.
endtext
kernel memtest
menu separator # insert an empty line
label rescue
menu indent count 5
menu label ^Rescue a RTXOS system
text help
If the system will not boot, this lets you access files
and edit config files to try to get it booting again.
endtext
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=rtxOS:/ rescue vga=791 modprobe.blacklist=nouveau
menu separator # insert an empty line
menu separator # insert an empty line
menu end
UEFI 模式下的启动菜单:
set default="1"
function load_video {
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
insmod all_video
}
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set timeout=5
### END /etc/grub.d/00_header ###
search --no-floppy --set=root -l 'rtxOS'
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Test This Media & Install RTXOS X86_64 UEFI' --class fedora --class gnu-linux --class gnu --class os {
linuxefi /images/pxeboot/vmlinuz rd.live.check inst.stage2=hd:LABEL=rtxOS:/ inst.ks=hd:LABEL=rtxOS:/ks.cfg vga=791 modprobe.blacklist=nouveau
initrdefi /images/pxeboot/initrd.img
}
menuentry 'INSTALL RTXOS X86_64 UEFI' --class fedora --class gnu-linux --class gnu --class os {
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=rtxOS:/ inst.ks=hd:LABEL=rtxOS:/ks.cfg vga=791 modprobe.blacklist=nouveau
initrdefi /images/pxeboot/initrd.img
}
menuentry 'Rescue A RTXOS System' --class fedora --class gnu-linux --class gnu --class os {
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=rtxOS:/ rescue vga=791 modprobe.blacklist=nouveau
initrdefi /images/pxeboot/initrd.img
}
定制 修改 XML 配置文件: 阅红帽子的官方资料后得知,XXXX-minimal-x86_64-comps.xml 即为定义软件组的XML控制文件,XML中存放着软件包的语言,描述,名字;环境组,软件组等等信息
eg: 简化后的 软件组环境组的基本结构如下:
b3d761d2-dd11-4068-9b4f-e67d1c8deed9
一个环境组中可以包含多个软件组
软件包组:包含需要安装的 RPM 包的名称列表
环境包组:包含需要安装的软件包组的名称
使用tab 缩进4个字符!!
定义软件组:(软件组包含需要的RPM包列表)
<group> 代表定义一个软件组
<id>XXXX</id> 软件组的检索字段
<name xml:lang="en_GB">custom_name</name> 软件组的英文基本名称,自行编写
<name xml:lang="zh_CN">定制的软件组名称</name> 软件组的中文基本名称,自行编写
<description>Smallest possible installation.</description> 软件组的英文的基本描述,自行编写
<description xml:lang="zh_CN">最小可能安装。</description> 软件组的支持中文的基本描述,自行编写
<default>false</default> 是否为默认,一般保持默认不用更改
<uservisible>false</uservisible> 是否用户可见,一般保持默认不用更改
<packagelist> RPM包列表,XML固定语法写法
<packagereq type="mandatory">XXXXX</packagereq> 需要的RPM包在这里定义,XXXXX为rpm包名称;其中 type 字段有三类,default(默认的) ,mandatory(强制的) ,optional(可选的)可选的包一般不会进行安装
</packagelist> XML 语法写法
</group> XML语法写法
定义环境组:(环境组包含了需要的软件组)
<enviroment> 定义一个环境组
<id>XXXX</id> 环境组检索字段
<name>XXXXXXXXXX</name> 环境组名称,自行编写
<name xml:lang="zh_CN">简体中文描述</name> 环境组名称的基本名称,自行编写
<description>Basic functionality.</description> 环境组的英文基本描述,自行编写
<description xml:lang="zh_CN">简体中文的描述</description> 环境组的支持中文的基本描述,自行编写
<display_order>5</display_order> 显示顺序,一般不用更改
<grouplist> 声明使用哪些软件组,自行编写
<groupid>XXXX</groupid> 需要的软件组的名称
</grouplist> XML语法固定写法
</enviroment> XML语法固定写法
软件组与环境组关系如下:
e9920f38-5b60-43e9-9928-a2c50a05a1cd
重建包依赖 repo 数据库:
上述修改后,使用 createrepo 工具 重新基于上面的 XML 重新生成 repodata 下面的 RPM 包的依赖关系数据库 保存到 ISO 构建的本地路径下
Anaconda Installer 的定制开发:
Anaconda 安装器简介 Anaconda 安装器是 RHEL,CentOS,Fedora 发行版的操作系统安装器,采用python语言编写; Anaconda是在ISO加载完内核 vmlinuz与临时的 initrd.img 完成初始化后,chroot 后切换到安装器所在的真实 rootfs 文件系统然后调用 /usr/sbin/anaconda 住入库启动; 安装器的文件系统是运行在内存中的,最小的内存需求为大于等于1536 MB,否则 GUI 的 Ananconda 安装器无法初始化,只能进入text (文本模式)安装模式;
土办法修改:
Anaconda 安装器是包在 ISO 文件的 LiveOS 目录下的 squashf.img中一组 python 程序,其中LiveOS 下的squashfs.img 是可以解压进行修改,重新打包;所以也可以用来做定制;
可以在 LIVE rootfs 中进行厂商信息修改,或者添加缺少命令工具的话可以利用 yum install XXXXX --installroot=XXXXX 补全部分缺少的命令工具;
最后修改完成后安装 解压 squashfs.img 的逆操作全部反过来操作就行
当然也可以用原厂开源的专用制作工具进行定制开发修改 关键命令行工具说明:
mock:创建干净构建环境 使用 mock build RPM
rpmbuild:RPM 包构建工具
createrepo:创建YUM仓库
lorax:红帽子系列发行版的 OS 官方镜像构建工具
pungi:Fedora/CentOS 镜像构建工具
mkisofs/genisoimage:ISO 镜像创建工具
Anaconda:红帽子系列发行版的 OS 安装程序器
X86_64 处理器架构对应的 7.x KE linux 定制版 lorax 修改点如下: 说明 lorax 主要修改的配置文件模板的路径为: /usr/share/lorax/
/usr/share/lorax/runtime-install.tmpl: 安装配置 anaconda liveos 的主配置文件
/usr/share/lorax/runtime-postinstall.tmpl: 安装完基础的 OS 后额外配置的入口配置文件
/usr/share/lorax/runtime-cleanup.tmpl: 安装完成后执行清理的配置文件
/usr/share/lorax/x86.tmpl: 最后阶段生成对应架构的 ISO 的模板文件
/usr/share/lorax/config_files/common: 存放模板配置文件的 目录
修改新增原有 anaconda 安装器缺少的功能:
不能执行 ipmitool 设置带外
缺少部分编辑器,压缩,解压,下载工具
缺少调试日志用的网络连接
ssh 功能被禁用
增加集成阵列卡的识别管理工具
增加自由品牌厂商的定制化安装信息, LOGO , 自定义安装类 (installclass),
自定义 systemd 服务 等等
自定义安装类说明:
配置安装类存放目录 /usr/lib64/python2.7/site-packages/pyanaconda/installclasses/
分析: 通过解压 公版的 suqashfs.img rootfs 根,解读下面的 /.buildstamp 中的配置定义推测
[Main]
Product=centos
Version=7
BugURL=xxxxxxx
IsFinal=True
UUID=202011251613
[Compose]
Lorax=19.7.19-xxx
厂商信息为 product=XXX 定义的,其中 XXX 为修改后的自定义的厂商信息; 修改此处要在 rootfs 的 /usr/lib64/python2.7/site-packages/pyanaconda/installclasses/ 里面添加修改对应的包含 product=XXX 字段的 install_class 的方法,否则安装器会出现奔溃报错 厂商自定义的安装类参考 centos.py 的写法: