基于centos7.6制作自定义的ISO镜像

以CentOS 7.6为例

全自动安装CentOS,在生产环境下可以有效减少安装的时间,以及可以集成一些软件到镜像上,做一个定制化的处理,所以有必要进行定制化。这样就可以实现2个功能:

  • 制作完成的ISO在安装过程中可以选择自定义的软件包
  • 制作完成的ISO全自动安装,不需要在安装过程中进行任何选择操作

基础准备与介绍

先下载原始的镜像, http://vault.centos.org/ 由于我是需要做centos 7.6的镜像,直接打开 https://vault.centos.org/7.6.1810/isos/x86_64/ 下载DVD的镜像,注意,尽量选择这个镜像,minimal版本的包太少了,有些还会缺少。

下载好ISO,在虚机机上面安装,安装过程省略,自行百度。此次实验仅使用最小化来安装。

我此次是使用的是KVM进行虚拟化的,具体可以参考:实战CentOS7安装且使用KVM虚拟机

挂载光盘及复制

将原始ISO镜像复制到虚拟机里面,然后进行挂载。

安装工具

安装制作发行版的工具

1
yum -y install anaconda repodata createrepo mkisofs rsync

挂载光盘,同步文件

1
2
3
4
mkdir /mnt/cdrom
mount -o loop CentOS-7-x86_64-DVD-1810.iso /mnt/cdrom/ ##挂载iso到/mnt/cdrom文件下
/usr/bin/rsync -a --exclude=Packages/ --exclude=repodata/ /mnt/cdrom/ /ISO/ ##同步/mnt/cdrom/下的文件到ISO/路径下,除了Packages和repodata文件夹
mkdir -p /ISO/{Packages,repodata} ##在ISO/文件夹下新建Packages和repodata文件夹

挂载光盘之后,各分区的作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.
├── CentOS_BuildTag # 系统版本构建标签
├── EFI # UEFI 启动模式下必须文件,Legacy模式下是非必须文件
├── EULA # 最终用户许可协议
├── GPL # 通用公用许可证/执照(General Public License)
├── images # 启动映像文件
├── isolinux # 存放光盘启动时的安装界面信息
├── LiveOS # 存储了映像文件
├── Packages # 系统自带rpm包软件
├── repodata # 系统rpm包metadate源数据
├── RPM-GPG-KEY-CentOS-7 # rpm的GPG校验公钥
├── RPM-GPG-KEY-CentOS-Testing-7 # 同上
└── TRANS.TBL # 提供比ISO9660标准约定的基本文件名更加灵活的文件名, 用简约符号代表目录、文件、链接;
discinfo #文件是安装价质的识别信息
.treeinfo #文件是系统版本,创建时间及文件目录树结构信息
ks.cfg #文件是无人值守自动化安装配置文件

复制rpm包

使用脚本拷贝相关软件包到/ISO/Packages目录下,centos6安装之后是可以从/root/install.log读取安装了哪些安装包,但在Centos7的/root下面并没有install.log文件。于是我们可以通过下面脚本用rpm -qa的方式得到所需安装的软件包。

1
2
3
4
5
6
7
8
9
#!/bin/bash
rpm -qa >package.txt
DVD='/mnt/cdrom/Packages'
NEW_DVD='/ISO/Packages'
while read LINE
do
cp ${DVD}/${LINE}*.rpm /${NEW_DVD} || echo "$LINE don't cp......."
done < package.txt
rm -f package.txt

或者使用 awk '{print $0}' package.txt |xargs -i cp /mnt/cdrom/Packages/{}.rpm /ISO/Packages/ 来复制即可。

下载自定义软件包以及依赖包

配置yum下载指定软件包列表(rpms_list.txt)以及所有依赖包

1
2
3
4
5
6
7
8
9
10
#!/bin/sh   
for line in `cat /root/rpms_list.txt`;do
echo "download file>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>and it's denpendies"$line
yum install -y --downloadonly --downloaddir=/root/test/ $line
#或者先安装yum -y install yum-utils再yumdownloader $line
done
#yum查找.so或者某个依赖在哪个rpm包中
yum provides {.so名或者依赖名字}
#拷贝包到指定目录
cp /root/test/* /ISO/Packages/

这一步其实是可以写成脚本,不过需要做一下特殊的判断。

修改isolinux/isolinux.cfg文件

这里指定ks文件引导:

1
2
3
4
5
6
label linux
menu label ^Install CentOS 7.6 1810
menu default
kernel vmlinuz
#append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
append ks=cdrom:/ks.cfg initrd=initrd.img inst.stage2=hd:LABEL=CentOS76
  • ks为ks.cfg文件位置;
  • inst.stage2为安装介质位置,hd:LABEL为介质标签,例如CentOS7。这个和后续生成ISO镜像文件的命令genisoimage的参数-V有关。最好是把所有hd:LABEL后面的值都替换为一个后面会用到的字符串,如CentOS76
  • modprobe.blacklist=nouveau; 禁用nouveau驱动安装,用于NVIDIA驱动的安装准备工作;
  • net.ifnames=0 biosdevname=0; 用于禁用centos7的”一致性网络设备命名法”.

生成ks.cfg文件

1
cp /root/anaconda-ks.cfg /ISO/isolinux/ks.cfg

在%packages与%end中间加入需要自定义安装的包组。

1
2
3
4
5
6
7
8
9
10
%packages
@^web-server-environment
@base
@core
@java-platform
@python-web
@web-server
kexec-tools
@{自定义包组的groupid}
%end

制作修改comps文件

简介

先来解释下comps文件。

进入/mnt/cdrom/repodata 目录,将-x86_64-comps.xml文件拷贝到/ISO/repodata路径下,并重命名成comps.xml。由于centos6.5下的comps.xml文件名很长,这里“*”为省略符,实际操作时输入完整文件名。

comps文件以group来区分包,以environment来区分环境,例如centos的mini版本为minimal,其核心包为core。类似于其格式,可定制自己的rpm包,建立自己的group idname,包含自己的language及描述,最重要的是packagelist,类型default为默认的,mandatory为强制的。如下是默认的comps格式:

  • 先定义好一个group的分组,里面包括了package的信息,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE comps PUBLIC "-//CentOS//DTD Comps info//EN" "comps.dtd">
<comps>
<group>
<id>core</id>
<name>Core</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>
<packagereq type="mandatory">audit</packagereq>
<packagereq type="default">aic94xx-firmware</packagereq>
<packagereq type="optional">tboot</packagereq>
</packagelist>
</group>
<environment>
<id>minimal</id>
<name>Minimal Install</name>
<name xml:lang="zh_CN">最小安装</name>
<description>Basic functionality.</description>
<description xml:lang="zh_CN">基本功能。</description>
<display_order>5</display_order>
<grouplist>
<groupid>core</groupid>
<groupid>core</groupid>
</grouplist>
</environment>
</comps>

然后在ks.cfg文件里面定义好package就可以实现自动安装,使用 @ 表明安装一个group,

1
2
3
4
%packages
@^minimal
@core
kexec-tools

精思化操作

这个方法比较麻烦,但是对于ks.cfg的维护比较规范,即定义好group分组,再然后选择指定的分组进行安装,方法如下:

1) 进入/ISO目录,将“*-x86_64-comps.xml”文件拷贝到/ISO/repodata路径下,并重命名成comps.xml。

1
cp /media/repodata/*-x86_64-comps.xml  /ISO/repodata/comps.xml

2) 编辑comps文件

(1) 添加定制rpm包

1
2
3
4
5
6
7
8
9
10
<group>
<id>{自定义包组的groupid}</id>
<name>My Dependencies</name>
<default>true</default>
<uservisible>true</uservisible>
<packagelist>
<packagereq type="default">python-webob</packagereq>
......
</packagelist>
</group>

根据rpms_list.txt拼接packagereq

1
2
3
4
5
#!/bin/sh
for line in `cat rpms_list.txt`
do
echo " <packagereq type=\"default\">"$line"</packagereq>" >> /root/package.txt
done

(2) 在指定的环境中添加定制的groupid

1
2
3
4
5
6
7
8
9
10
11
12
<environment>
<id>web-server-environment</id>
<name>Basic Web Server</name>
<description>Server for serving static and dynamic internet content. </description>
<display_order>30</display_order>
<grouplist>
<groupid>base</groupid>
<groupid>core</groupid>
<groupid>web-server</groupid>
<groupid>{自定义包组的groupid}</groupid>
</grouplist>
</environment>

切换到ISO/路径下,由comps.xml生成repodata包。注意当有新包加入,或者更新comps.xml文件,均需要重新生成repodata文件夹

1
createrepo -g repodata/comps.xml ./

粗放式方法

从上面的方法可以看出,整理一个comps.xml相对比较麻烦,还有一个方法,是不修改这个文件,使用以下方法即可:

1
2
cp /media/repodata/*-x86_64-comps.xml  /ISO/repodata/comps.xml
createrepo -g repodata/comps.xml ./

但这样做的结果是需要在ks.cfg文件里面维护全部的包名,如下:

1
2
3
4
5
%packages --ignoremissing
abrt-2.1.11-52.el7.centos.x86_64
abrt-addon-ccpp-2.1.11-52.el7.centos.x86_64
abrt-addon-kerneloops-2.1.11-52.el7.centos.x86_64
...

制作ISO镜像

注意参数中的-V,和上面的isolinux.cfg文件有关。

1
2
cd /ISO
genisoimage -joliet-long -V CentOS7 -o CentOS-7-6.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -cache-inodes -T -eltorito-alt-boot -e images/efiboot.img -no-emul-boot /ISO

制作镜像MD5值

1
implantisomd5 /ISO/CentOS-7-2.iso

Hybird模式

采用“hybird模式”(混合模式),操作系统可以直接刻录成物理光盘,也可以直接做成可引导的U盘。

1
isohybrid -v /ISO/CentOS-7-2.iso

安装系统

只要不出错,一般十来分钟就可以安装完成,但如果出错了,需要使用以下方法来做排查:

由于是text模式,则进入安装界面,会有一个类似图形安装界面的排版,里面可以选择。所有选择均为x的时候,表示正常无误;有!的话,则为错误。错误时需要查看日志,其中Alt+F1快捷键可以进入main界面,Alt+F2快捷键可以进入Shell界面等等。在Shell界面中,可以从/tmp/packaging.log中找到rpm包日志,可以从/tmp/anaconda.log中找到安装过程中的报错日志;可以从/run/install/repo路径下找到外部文件夹;

当选项均为x时,即表示正常无误,可以不进行操作,其自动进入下一步安装过程,直至安装成功,然后自动重启,显示登录界面。

参考资料

https://zhuanlan.zhihu.com/p/140972579

定制个自己的CentOS7系统

https://blog.csdn.net/chyq112366/article/details/90107753

https://yangfannie.com/1930.html

https://cloud.tencent.com/developer/article/1729640

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/linux/centos-iso.html
  • 本文主题: 基于centos7.6制作自定义的ISO镜像
  • 版权声明: 本站所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%