参考链接
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-releaseyum -y install --downloadonly --downloaddir="/root/iso/Packages" htop
当有新包加入,或者更新 *comps.xml 文件,均需要重新生成 repodata 文件夹
cd /root/isocreaterepo -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
打包镜像
cd /root/isomkisofs -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
完成
附:安装过程中可能遇到的错误
- 缺少依赖

如图所示,安装检测的时候,出现了 software selection(error checking software selection)
注:感叹号为有问题的地方,打叉为没问题的
根据最下方的提示,我们使用 alt+tab 切换一下终端
切换到第二个 shell 终端,然后输入 tail -f /tmp/packaging.log 查看一下安装的时候出了什么问题

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