订制rpm包到Centos7镜像中
本文以CentOS 7.4 最小化镜像(CentOS-7-x86_64-Minimal-1708.iso)为模版
要达到的目的:
1、订制所需的rpm软件包集成到iso文件中
2、制作完成的ISO全自动安装,不需要在安装过程中进行任何选择操作
一、最小化镜像,请去centos官方镜像站下载
下载地址,请自行百度
二、使用VMware Workstation 14 Pro安装CentOS 7.4最小化系统
安装过程略
为什么要在vmware上搞?而不直接用物理机搞呢?
1. vmware可以做快照,你物理机能吗?建议装好系统,配好网络(通外网),配好yum 源和epel源后生成快照,因为要完成目的2,至少需要制作2次iso做测试
2. vmware的网络很好配置。你要是物理机,你得跑机房去配网络,你说说选哪个
3. vmware只需要1个支持虚拟化的台式机就行了。如果你公司有钱,并且你不嫌上面2条麻烦,可以用物理机
三、制作ISO过程操作记录
当第二步完成后,虚拟机的网络、yum源、epel源(因为有些rpm包是在epel中的)都配置好了
制作1个快照,后面会用到的。快照的好处不言而喻
3.1 查看光盘是否已挂载
ls -l /dev/cdrom |grep cd
3.2 将ISO所在的/dev/cdrom挂载到/media
mount /dev/cdrom /media
3.3 安装制作发行版的工具
yum -y install createrepo mkisofs isomd5sum rsync
3.4 同步光盘文件到制作ISO的目录
mkdir /ISO
#同步/media下的文件到/ISO路径下,除了Packages和repodata文件夹
/usr/bin/rsync -a --exclude=Packages/ --exclude=repodata/ /media/ /ISO/
# 在/ISO/文件夹下新建Packages和repodata文件夹
mkdir -p /ISO/{Packages,repodata}
3.5 拷贝当前系统已安装的软件包到/ISO/Packages目录下
最好还是拷贝全量的原Packages下的安装包,或者是yum安装过后再生成install.log否则依赖包会不完整
3.5.1 将目前已安装的rpm包重定向到install.log中
rpm -qa >> /root/install.log
3.5.2 拷贝已安装rpm
awk '{print $0}' /root/install.log |xargs -i cp /media/Packages/{}.rpm /ISO/Packages/
这里可能会输出找不到某些rpm包,主要是3.3中的那些包,暂时不用管
3.6 把需要集成的rpm包名写入text文件
这里我只用1个lrzsz包做集成实验,如果你有很多rpm包,一行写一个,不要有空行,不要重复
[root@localhost ISO]# cat /root/rpms_list.txt
lrzsz
3.7 使用yum下载指定软件包列表(rpms_list.txt中)的所有依赖包,而并不在本机安装
[root@localhost ISO]# mkdir -p /root/test/
[root@localhost ISO]# cat /root/a.sh
#!/bin/bash
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/
[root@localhost ISO]# sh /root/a.sh
3.8 修改isolinux.cfg文件
inst.ks为ks.cfg文件位置;
inst.stage2为安装介质位置,hd:LABEL为介质标签,例如CentOS7。这个和后续生成ISO镜像文件的命令genisoimage的参数-V有关。
需要修改的地方是:
- 把所有hd:LABEL后面的值都替换为一个后面会用到的字符串,如CentOS7
- 把label check标签下的append行,添加inst.ks=cdrom:/isolinux/ks.cfg
修改完之后的完整内容如下:
[root@localhost ISO]# cat isolinux/isolinux.cfg
default vesamenu.c32
timeout 600
display boot.msg
# Clear the screen when exiting the menu, instead of leaving the menu displayed.
# For vesamenu, this means the graphical background is still displayed without
# the menu itself for as long as the screen remains in graphics mode.
menu clear
menu background splash.png
menu title CentOS 7
menu vshift 8
menu rows 18
menu margin 8
#menu hidden
menu helpmsgrow 15
menu tabmsgrow 13
# Border Area
menu color border * #00000000 #00000000 none
# Selected item
menu color sel 0 #ffffffff #00000000 none
# Title bar
menu color title 0 #ff7ba3d0 #00000000 none
# Press [Tab] message
menu color tabmsg 0 #ff3a6496 #00000000 none
# Unselected menu item
menu color unsel 0 #84b8ffff #00000000 none
# Selected hotkey
menu color hotsel 0 #84b8ffff #00000000 none
# Unselected hotkey
menu color hotkey 0 #ffffffff #00000000 none
# Help text
menu color help 0 #ffffffff #00000000 none
# A scrollbar of some type? Not sure.
menu color scrollbar 0 #ffffffff #ff355594 none
# Timeout msg
menu color timeout 0 #ffffffff #00000000 none
menu color timeout_msg 0 #ffffffff #00000000 none
# Command prompt text
menu color cmdmark 0 #84b8ffff #00000000 none
menu color cmdline 0 #ffffffff #00000000 none
# 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 linux
menu label ^Install CentOS 7
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7 quiet
label check
menu label Test this ^media & install CentOS 7
menu default
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7 rd.live.check inst.ks=cdrom:/isolinux/ks.cfg quiet
#append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7 inst.ks=cdrom:/isolinux/ks.cfg quiet
menu separator # insert an empty line
# utilities submenu
menu begin ^Troubleshooting
menu title Troubleshooting
label vesa
menu indent count 5
menu label Install CentOS 7 in ^basic graphics mode
text help
Try this option out if you're having trouble installing
CentOS 7.
endtext
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7 xdriver=vesa nomodeset quiet
label rescue
menu indent count 5
menu label ^Rescue a CentOS 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=CentOS7 rescue quiet
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 local
menu label Boot from ^local drive
localboot 0xffff
menu separator # insert an empty line
menu separator # insert an empty line
label returntomain
menu label Return to ^main menu
menu exit
menu end
3.9 修改自动化安装配置文件
cp /root/anaconda-ks.cfg /ISO/isolinux/ks.cfg
vi /ISO/isolinux/ks.cfg
在%packages与%end中间加入需要自定义安装的包组(这里我用的自定义包组的groupid是ziding)
[root@localhost ISO]# cat /ISO/isolinux/ks.cfg
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Use graphical install
graphical
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=ens33 --onboot=off --ipv6=auto --no-activate
network --hostname=localhost.localdomain
# Root password
rootpw --iscrypted $6$u0SrYp5DcuOPeY4U$FU5xYBPGqHUOinjYp5juphsb/Z646d9gbmugTKth4qhweC1SvqeW5lsTNoj0qbKLJBur9rlWq07o9tOtc2nsL.
# System services
services --enabled="chronyd"
# System timezone
timezone America/New_York --isUtc
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --none --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --ondisk=sda --size=1024
part pv.198 --fstype="lvmpv" --ondisk=sda --size=19455
volgroup centos --pesize=4096 pv.198
logvol swap --fstype="swap" --size=1024 --name=swap --vgname=centos
logvol / --fstype="xfs" --size=18427 --name=root --vgname=centos
%packages
@^minimal
@core
chrony
kexec-tools
@ziding
%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
3.10 制作修改comps文件
3.10.1 进入/ISO目录,将“*-x86_64-comps.xml”文件拷贝到/ISO/repodata路径下,并重命名成comps.xml
cp /media/repodata/*-x86_64-comps.xml /ISO/repodata/comps.xml
3.10.2 编辑comps文件
3.10.2.1 添加定制rpm包
vi /ISO/repodata/comps.xml
添加自定义的组到该文件
<group>
<!-- <id>{自定义包组的groupid}</id> -->
<id>ziding</id>
<name>My Dependencies</name>
<default>true</default>
<uservisible>true</uservisible>
<packagelist>
<packagereq type="default">python-webob</packagereq>
......
......省略多行
......
......
</packagelist>
</group>
根据rpms_list.txt拼接packagereq
#!/bin/bash
for line in `cat rpms_list.txt`
do
echo " <packagereq type=\"default\">"$line"</packagereq>" >> /root/package.txt
done
3.10.2.2 在指定的环境中添加定制的groupid
<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>
3.11 由comps.xml生成repodata包
切换到ISO/路径下,注意当有新包加入,或者更新comps.xml文件,均需要重新生成repodata文件夹
createrepo -g repodata/comps.xml ./
3.12 制作ISO镜像,注意参数中的-V,和上面的isolinux.cfg文件有关
cd /ISO
genisoimage -joliet-long -V CentOS7 -o CentOS-7-4.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
3.13 制作镜像MD5值
implantisomd5 /ISO/CentOS-7-4.iso
3.14 接下来用新镜像安装系统
在界面中就会有自定义包组的选项,若配置自动安装则启动时全自动安装
当你在安装界面的software中,选了自定义的组名My Dependencies后
注意下方提示,很可能报错,提示里面的某些包的依赖关系没解决,根据提示去下载这些依赖包
把这些依赖包下载到/ISO/Packages下,
恢复到系统快照,重新把以上步骤来一遍
在恢复到系统快照之前,你可以去/ISO/Packages下把已有的rpm包打包下载下来(就可以省去3.5到3.7的步骤),如果你的网速够快,不在乎重复下载,那就直接恢复到快照吧
如有你没有打包所有rpm包的话,回到本文开头再来一遍,记得把后来下载的依赖包拷贝到/ISO/Packages下
如果打包了所有rpm包,把压缩文件上传到/ISO/Packages下解压,删除压缩文件,继续3.8(含)以后的步骤
直到新镜像安装系统时,没有error,没有提示有依赖关系需要解决。会提示“您的group id不存在,是否放弃安装该组内容”,选择“yes”
虽然选择了yes,但是后续安装过程你会发现我们的包依然会被装上
3.15 划重点
比如说你已经做到3.14步骤,并且在虚拟机装系统也没问题,虽然装系统会弹出“您的group id不存在,是否放弃安装该组内容”
这时候,你就大可放心的把这个自定义组(ziding)中的所有rpm包名,放到默认的最小化安装组(core)中去了,就不会弹出任何消息了
具体做法是:
- 不需要在3.9中修改/ISO/isolinux/ks.cfg了,直接使用默认组(core)
- 不需要3.10.2.1了,把3.10.2.1中运行shell脚本生成的
标签中的内容增加到默认组(core)中就行了 - 不需要3.10.2.2了
- 这就是本文开头说的,第2次制作iso镜像(集成到core中)