自制镜像-以openEuler22.03为例
参考:https://www.wumingx.com/linux/centos-iso.html
全自动安装openEuler,在生产环境下可以有效减少安装的时间,以及可以集成一些软件到镜像上,做一个定制化的处理,所以有必要进行定制化。这样就可以实现2个功能:
- 制作完成的ISO在安装过程中可以选择自定义的软件包
- 制作完成的ISO全自动安装,不需要在安装过程中进行任何选择操作
基础准备与介绍
先下载原始的镜像, https://www.openeuler.org/zh/download/
由于需要做openEuler-22.03-LTS的镜像,直接打开 https://repo.openeuler.org/openEuler-22.03-LTS/ISO/x86_64/ 下载DVD的镜像,注意,尽量选择这个镜像,minimal版本的包太少了,有些还会缺少。
下载好ISO,在虚机机上面安装,安装过程省略,自行百度。此次实验仅使用最小化来安装。
此次是使用的是KVM进行虚拟化的,具体可以参考:实战CentOS7安装且使用KVM虚拟机
安装工具
安装制作发行版的工具
yum -y install anaconda repodata createrepo mkisofs rsync
挂载光盘及复制
将原始ISO镜像复制到虚拟机里面,然后进行挂载。
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文件夹
挂载光盘之后,各分区的作用:
.
├── 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包
下载自定义软件包以及依赖包
修改isolinux/isolinux.cfg文件
这里指定ks文件引导:
- 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的”一致性网络设备命名法”.
制作ISO镜像
注意参数中的-V,和上面的isolinux.cfg文件有关。
cd /ISO
genisoimage -joliet-long -V openEuler-22.03-LTS-x86_64 -o OpenEuler2203.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 OpenEuler2203/
Hybird模式
isohybrid -v OpenEuler2203.iso
制作镜像MD5值
implantisomd5 OpenEuler2203.iso
安装系统
virsh destroy openEuler
virsh undefine openEuler
rm -f openEuler.qcow2
qemu-img create -f qcow2 openEuler.qcow2 40G
qemu-img info openEuler.qcow2
virt-install --name openEuler --virt-type kvm --ram 8192 --vcpus=4 --cdrom=OpenEuler2203.iso --disk path=openEuler.qcow2,size=40,format=qcow2 --graphics vnc,listen=0.0.0.0,port=5980,password=xxxxx --noautoconsole
只要不出错,一般十来分钟就可以安装完成,但如果出错了,需要使用以下方法来做排查:
由于是text模式,则进入安装界面,会有一个类似图形安装界面的排版,里面可以选择。所有选择均为x的时候,表示正常无误;有!的话,则为错误。错误时需要查看日志,其中Alt+F1快捷键可以进入main界面,Alt+F2快捷键可以进入Shell界面等等。在Shell界面中,可以从/tmp/packaging.log中找到rpm包日志,可以从/tmp/anaconda.log中找到安装过程中的报错日志;可以从/run/install/repo路径下找到外部文件夹;
当选项均为x时,即表示正常无误,可以不进行操作,其自动进入下一步安装过程,直至安装成功,然后自动重启,显示登录界面。
确认镜像没问题后,打包压缩
zip OpenEuler2203.zip OpenEuler2203.iso
md5sum OpenEuler2203.zip > OpenEuler2203.zip.md5
查看需要的依赖包
- 查询软件包依赖哪些软件
rpm -qR tcping.rpm # 安装 R参数的意思就是requires就是依赖哪些软件包
rpm -qpR tcping.rpm # 未安装
或
yum deplist centos-release
- 查询软件包被哪个软件包依赖
rpm -e --test tcping.rpm # 通过--test进行测试删除,查看是否有依赖关系,如果有会阻止删除
错误:依赖检测失败: rpcbind 被 (已安裝) quota-1:4.01-17.el7.x86_64 需要
- 报错后,根据安装日志查看
进入shell模式查看对应的日志,将日志提示中的依赖包及对应版本放入对应目录中。

cat /tmp/anaconda-tb-* | grep Error | grep "No " | more
06:47:59,628 CRT dnf: Error opening /run/install/sources/mount-0000-hdd-device/Packages/autogen-5.18.16-2.oe2203.x86_64.rpm: No such file or directory
- 软件放到ks中了,但是发现实际没有安装上去,日志又没有报错,可以将包拷进去安装看看还有什么依赖
将包拷入到镜像下的目录,这边新建了一个extras目录,编辑ks.cfg文件
%post --nochroot
# Mount CDROM
mkdir -p /mnt/cdrom
mount -r -t iso9660 /dev/cdrom /mnt/cdrom
mkdir -p /mnt/sysimage/tmp/build/
cp /mnt/cdrom/extras/* /mnt/sysimage/tmp/build/
umount /mnt/cdrom
%end
%post --log=/tmp/ks-post.log
# Soft Install
cd /tmp/build
mv *.rpm /usr/local/src
rpm -ivh /usr/local/src/tcping-1.0-1.x86_64.rpm
rpm -ivh /usr/local/src/oniguruma-6.9.6-1.oe2203.x86_64.rpm
rpm -ivh /usr/local/src/jq-1.6-2.oe2203.x86_64.rpm
rpm -ivh /usr/local/src/openeuler-lsb-5.0-1.oe2203.x86_64.rpm
rpm -ivh /usr/local/src/tcl-8.6.10-4.oe2203.x86_64.rpm
rpm -ivh /usr/local/src/bcc-tools-0.23.0-1.oe2203.x86_64.rpm
mv python2_oe2203.tgz /usr/local/src
tar -zxvf /usr/local/src/python2_oe2203.tgz -C /usr/local/src/
rpm -ivh /usr/local/src/python2_oe2203/*.rpm
%end
报错
device-mapper: ioctl: 4.43.0-ioctl (2020-10-01) initialised: dem-devel@redhat.com
查看日志,发现提示
--》暂时没有找到解决办法,通过ssh不会出现该提示。
查看内核是否有版本更新
- yum查看
# yum update kernel
Last metadata expiration check: 3:25:13 ago on Wed 12 Oct 2022 12:09:33 PM CST.
Dependencies resolved.
============================================================================================================================================================================================================================================
Package Architecture Version Repository Size
============================================================================================================================================================================================================================================
Installing group/module packages:
kernel x86_64 5.10.0-60.58.0.86.oe2203 update 55 M
Transaction Summary
============================================================================================================================================================================================================================================
Install 1 Package
Total download size: 55 M
Installed size: 81 M
Is this ok [y/N]: n
当前内核版本
# uname -a
Linux localhost.localdomain 5.10.0-60.18.0.50.oe2203.x86_64 #1 SMP Wed Mar 30 03:12:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
- 仓库查看
直接访问查看
http://repo.openeuler.org/openEuler-22.03-LTS/update/
升级小版本内核
直接用高版本内核,会报依赖之前的内核包,需要将2个版本的包都放到Packages里
- ks.cfg里面软件包填高版本,并不会直接安装上去,是否还有其他办法
%packages --ignoremissing
kernel-5.10.0-60.58.0.86.oe2203.x86_64
kernel-devel-5.10.0-60.58.0.86.oe2203.x86_64
kernel-headers-5.10.0-60.58.0.86.oe2203.x86_64
kernel-tools-5.10.0-60.58.0.86.oe2203.x86_64
%end
- 在ks.cfg文件里面待安装完系统后再安装新的内核
%post --log=/tmp/ks-post.log
cd /tmp/build
rpm -ivh kernel-5.10.0-60.58.0.86.oe2203.x86_64.rpm
%end
网络镜像制作
目录说明
OpenEuler2203 # 网络镜像主目录
├─ ks # ks文件
├─ os # 打包好的镜像文件
├── base
├── comps.xml
├── EFI
├── extras
├── images
├── isolinux
├── ks.cfg
├── LiveOS
├── Packages
├── repodata
└── TRANS.TBL
- 将制作好的镜像挂载好,都拷贝到os目录
cd OpenEuler2203
rsync -a /mnt/cdrom4/ os/
- 进入ks目录,修改ks文件
这个ks.cfg跟iso中ks.cfg的区别
涉及cp、mv之类的软件包都需要改为网络获取
测试安装
在要安装的设备上执行网络镜像安装脚本
# cat reinstall_system.sh
#!/bin/bash
network_dir='OpenEuler2203' #修改成你要安装的网络镜像的目录
wget http://test.iso.com/$network_dir/os/isolinux/vmlinuz -O /boot/vmlinuz2203
wget http://test.iso.com/$network_dir/os/isolinux/initrd.img -O /boot/initrd2203.img
# 静态配置 ip=ip::gateway:netmask:hostname:interface:none
phy_nic="eth0" #修改成能上网的网卡
mac=52:54:00:c7:0d:66 #上网的网卡的mac
ipaddr=192.168.2.88 #上网的网卡的ip
gateway=192.168.2.1 #上网的网卡网关
netmask=255.255.255.0 #上网的网卡掩码
hostname=wuweitest #你要设置的主机名
cfg=""
if [[ `grep openEuler /etc/system-release | wc -l` -gt 0 ]];then
cfg="-c /boot/grub2/grub.cfg"
fi
echo $ipaddr |egrep -q "192\.168\.[0-9]{1,3}\.[0-9]{1,3}|10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.1[6-9]\.[0-9]{1,3}\.[0-9]{1,3}|172\.2[0-9]\.[0-9]{1,3}[0-9]{1,3}\.|172\.31\.[0-9]{1,3}\.[0-9]{1,3}" && vnc="inst.vnc inst.vncpassword=xxx inst.vncconnect=$ipaddr:5901" || vnc=""
consoleParam=`/sbin/grubby --info=ALL 2>/dev/null | grep -oP 'console=tty[01]\s+console=ttyS[01],\d+' | uniq`
consoleParam="console=tty0 console=ttyS1,115200"
/sbin/grubby $cfg --add-kernel /boot/vmlinuz2203 --initrd /boot/initrd2203.img --args "inst.ks=http://test.iso.com/$network_dir/ks/ks2203.cfg ip=$ipaddr::$gateway:$netmask:$hostname:$phy_nic:none inst.ks.sendmac ifname=$phy_nic:$mac nameserver=114.114.114.114 nameserver=114.114.115.115 $consoleParam $vnc ixgbe.allow_unsupported_sfp=1 inst.sshd" --make-default --title "Install openEuler-22.03-LTS-x86_64 from WS"
代码说明:sh reinstall_system.sh 运行脚本,执行完后会把网络启动方式写入/boot/grub2/grub.cfg文件,然后reboot,机器就会去网络镜像服务器下载需要的rpm包,等下载完毕就会开始安装系统。如果想看安装过程得等rpm包都下完开始安装系统的时候,你就可以用vnc 远程查看安装过程。