定制 CentOS7 ISO 的最佳实践

随着业务形态,业务种类的不断拓展,使用公版 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 的写法:

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容