参考链接
https://xujiyou.work/Linux/KVM/%E8%87%AA%E5%AE%9A%E4%B9%89CentOS%E9%95%9C%E5%83%8F.html
https://www.cnblogs.com/suran/p/15921157.html
https://www.zhangxiaoheng.cn/2018/12/22/%E9%80%9A%E8%BF%87kickstart%E5%AE%9A%E5%88%B6Centos7%E7%B3%BB%E7%BB%9F/
https://fedoraproject.org/wiki/Anaconda/Kickstart/zh-cn
https://gitbook.curiouser.top/origin/pxe-kickstart%E6%96%87%E4%BB%B6%E5%8F%82%E6%95%B0%E8%AF%A6%E8%A7%A3.html

推荐使用刚安装完系统的干净的环境来制作镜像,这样在下载需要的软件的时候依赖比较好解决,不然在我制作镜像中不管使用 yum --installroot --releasever=7 或者是 yumdownloader 依然会产生依赖问题

安装制作镜像需要的软件

yum install -y createrepo mkisofs isomd5sum pykickstart syslinux

 

创建文件夹,将/root/iso做为定制镜像制作目录; 将/root/mount作为挂载镜像的目录

mkdir /root/{iso,mount}

 

下载镜像

wget https://mirrors.163.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2207-02.iso
也可以通过 ls -l /dev/cdrom 来查看是否已挂载光盘,如果已挂载就不需要再下载镜像了

 

挂载镜像

mount CentOS-7-x86_64-Minimal-2207-02.iso /root/mount
如果光盘已挂载,也可以 mount /dev/cdrom /root/mount

 

由于挂载后的那个镜像目录是只读的,所以我们将镜像目录的内容复制到定制镜像的制作目录

cp -r /root/mount/. /root/iso

 

使用yum下载我们需要软件的所有依赖包,而不在本机安装,这里我添加了 tmux vim wget 等等

yum -y install --downloadonly --downloaddir="/root/iso/Packages" epel-release tmux vim wget mlocate net-tools.x86_64 git python3 tree java-1.8.0-openjdk java-1.8.0-openjdk-devel

然后再安装 epel-release,不然假如我要添加 epel-release 里面才有的软件,比如 htop 到镜像包的话就无法下载了

yum -y install epel-release
yum -y install --downloadonly --downloaddir="/root/iso/Packages" htop

 

当有新包加入,或者更新 *comps.xml 文件,均需要重新生成 repodata 文件夹

cd /root/iso
createrepo -g repodata/*-c7-minimal-x86_64-comps.xml .

 

创建 ks.cfg 文件,这个文件定义了所有在安装过程中需要写入的内容

vi /root/iso/ks.cfg
# 密码选项 使用屏蔽口令 加密方式为sha512
auth --enableshadow --passalgo=sha512

# 使用CD-ROM安装介质
cdrom
# 文本界面 设置graphical则为图形化界面
text
# 安装系统而不是更新系统
install
# 决定是否在第一次启动系统后,运行设置代理程序,去设置语言、鼠标、键盘、根密码、安全级别、时区以及网络配置选项。一般我们都需要开启这个
firstboot --enable
# 忽略其他磁盘 仅使用sda
ignoredisk --only-use=sda
# 键盘布局
keyboard --vckeymap=us --xlayouts='us'
# 设置语言
lang en_US.UTF-8
# 允许时间同步服务启动,并设置时区
services --enabled="chronyd"
# 设置时区
timezone Asia/Shanghai --isUtc

# 网络配置 这里是动态获取 启动时启用网卡
network --bootproto=dhcp --device=eth0 --onboot=on --ipv6=auto --activate
# 设置主机名
network --hostname=loaclhost.localdomain

# 设置root用户帐号 和/etc/shadow中密码字段内容一样,直接从别的系统中取下来即可 这里密码是123456
rootpw --iscrypted $6$SZ69HCyt$llZhDzWNhTGhvVwpRFlLLn3.2w22bZK6iF.A8QuC.4wlq3RDK3zHqhN24GAwtHzWAgXfaajVI.FwLHxKK7UKX1

# 系统引导配置 写入sda的mbr
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
# autopart --type=lvm 自动分区 若磁盘够大 /boot分区和/home分区将会分配较大空间 不推荐
# 清空原有分区 初始化磁盘 仅针对sda
clearpart --all --initlabel --drives=sda

# 分区设置, 以M为单位
# not lvm: default / and /var partion's size 307200 == 300GB , you need to adjust the size again;
# for GPT disk label condition, you have to create a 1Mib biosboot type partion;
part biosboot --fstype=biosboot --size=1
# 创建一个 512M 大小的分区挂载 /boot 类型为 xfs
part /boot --asprimary --fstype="xfs" --mkfsoptions='-n ftype=1' --size=512
# 创建一个 512M 大小的 SWAP 分区 
part swap --fstype="swap" --size=512
# 将剩余空间创建 / 分区
part / --asprimary --fstype="xfs" --mkfsoptions='-n ftype=1' --grow --size=10000

# 指定要安装的软件包
# 默认
%packages
@^minimal
@core
epel-release
tmux
vim
wget
htop
mlocate
net-tools.x86_64
git
python3
tree
java-1.8.0-openjdk
java-1.8.0-openjdk-devel
%end

%addon com_redhat_kdump --enable --reserve-mb='auto'
%end

%anaconda
# 密码策略
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

%post
echo '配置DNS'
echo 'nameserver 114.114.114.114' > /etc/resolv.conf
%end

## 重装完系统自动重启
reboot

校验一下 ks.cfg 文件语法有没有问题,没有输出错误信息即为正确

ksvalidator /root/iso/ks.cfg

 

修改安装启动信息

vi /root/iso/isolinux/isolinux.cfg
# 将等待时间从30秒改为5秒
timeout 300
# 改为
timeout 50
# 在label linux 后面添加自定义的新的label
label CustomCentOS7
    menu label Install CustomCentos7
    kernel vmlinuz
    menu default
    append initrd=initrd.img inst.ks=cdrom:/ks.cfg inst.ks=hd:LABEL=CustomCentOS7:/ks.cfg inst.stage2=hd:LABEL=CustomCentOS7 quiet

image-20221205140404722

 

打包镜像

cd /root/iso
mkisofs -o /root/customCentOS7.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -joliet-long -R -J -v -V "CustomCentOS7" -T /root/iso/
注意 -V 参数 和 上边的 inst.ks=hd:LABEL 要一致
isohybrid /root/customCentOS7.iso # 使用mkisofs或genisoimage生成的ISO 9660镜像,以允许混合启动为CD-ROM或硬盘

 

打包完成后,我们将在 /root 目录下看到打包出来的镜像 customCentOS7.iso

往 ISO 内加入 md5 校验码


implantisomd5 /root/customCentOS7.iso --force
checkisomd5 /root/customCentOS7.iso

 

完成


附:安装过程中可能遇到的错误

  1. 缺少依赖

image-20221205092518469

如图所示,安装检测的时候,出现了 software selection(error checking software selection)

注:感叹号为有问题的地方,打叉为没问题的

根据最下方的提示,我们使用 alt+tab 切换一下终端
切换到第二个 shell 终端,然后输入 tail -f /tmp/packaging.log 查看一下安装的时候出了什么问题

image-20221205093740008

可以看到是在添加 python3 包的时候缺少了红框内的依赖,所以我们要将依赖加入到 iso/Package 文件夹里面,然后重新 createrepo 并打包

×