本文以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有关。

需要修改的地方是:

  1. 所有hd:LABEL后面的值都替换为一个后面会用到的字符串,如CentOS7
  2. 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)中去了,就不会弹出任何消息了

具体做法是:

  1. 不需要在3.9中修改/ISO/isolinux/ks.cfg了,直接使用默认组(core)
  2. 不需要3.10.2.1了,把3.10.2.1中运行shell脚本生成的标签中的内容增加到默认组(core)中就行了
  3. 不需要3.10.2.2了
  4. 这就是本文开头说的,第2次制作iso镜像(集成到core中)

参考链接

https://www.jianshu.com/p/2d81f88efa62

订制rpm包到Centos7镜像中的更多相关文章

  1. 在 Docker 的 CentOS7 镜像 中安装 mysql

    在 Docker 的 CentOS7 镜像 中安装 mysql 本来以为是个很简单的过程居然折腾了这么久,之前部署云服务器时也没有好好地记录,因此记录下. 特别提醒:本文的操作环境是在 Docker ...

  2. 将源码包制作成rpm包

    Linux系统中一般安装软件有两种方法,源码安装和yum安装或者rpm包安装,由于光盘中的rpm包都是几年前制作成的,所以软件版本都很低,同时yum安装对软件的可定制性很低,所以为了使用最新的软件,一 ...

  3. redhat 中安装rpm包时遇到异常 “error: Failed dependencies:xinetd is needed by .”

    redhat 中安装rpm包时遇到错误 “error: Failed dependencies:xinetd is needed by ....” redhat中安装rpm包时遇到“error: Fa ...

  4. FPM定制RPM包实践

    1.1 快速部署方案 ✔ 问题:当领导给你 100 台已经安装好系统的服务器,然后让优化,让你提出一个快速部署方案. 解答: 1.tar 打包 先编译安装 打包-->分发-->解包(比如 ...

  5. linux rpm包

    rpm包,软件包,程序包,以.rpm结尾的包 我们刚开始安装的Linux系统是最小化安装(minimol),只安装系统,不安装不必要的软件包 刚开始vim,ifconfig,tree等命令都没有,当然 ...

  6. 烂泥:Linux源码包制作RPM包之Apache

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装.apache的rpm包安装方式比源码安装方式比较快,这能 ...

  7. 3-1 rpm包命名规则

    1.RPM包的来源 <1>RPM包在系统光盘中 ---------------------------------------------------------------------- ...

  8. RPM包定制

    概述 问题:当领导给你 100 台已经安装好系统的服务器,然后让优化,让你提出一个快速部署方案.解答: 1.tar 打包 先编译安装 打包-->分发-->解包(比如 mysql 打包后直接 ...

  9. 自动化部署必备技能—定制化RPM包[转载]

    回顾下安装软件的三种方式: 1.编译安装软件,优点是可以定制化安装目录.按需开启功能等,缺点是需要查找并实验出适合的编译参数,诸如MySQL之类的软件编译耗时过长. 2.yum安装软件,优点是全自动化 ...

随机推荐

  1. sql xml中 in 的用法

    在xml中,动态传参去数据库查询,下面是in的示例. 比如有条sql SELECT * FROM corp_tax c WHERE c.id in (387419,387423) AND c.corp ...

  2. 基于HTTP协议的几种实时数据获取技术

    原文链接https://www.cnblogs.com/xrq730/p/9280404.html,作者博客园----五月的仓颉,转载请注明出处,谢谢 HTTP协议 HTTP协议大家都很熟悉了,开始本 ...

  3. Java数据结构和算法 - 链表

    Q: 为什么要引入链表的概念?它是解决什么问题的? A: 数组作为数据存储结构有一定的缺陷,在无序数组中,搜索是低效的:而在有序数组中,插入效率又很低:不管在哪一个数组中删除效率都很低:况且一个数组创 ...

  4. webrtc aecd算法解析一(原理分析)

    webrtc的回声抵消(aec.aecm)算法主要包括以下几个重要模块: 回声时延估计 NLMS(归一化最小均方自适应算法) NLP(非线性滤波) CNG(舒适噪声产生) 回声时延估计 这张图很多东西 ...

  5. Python基础(time模块,datetime模块)

    #Author : Kelvin #Date : 2019/1/6 15:10 import time #获取此时的时间戳(从此刻到1970年一月一号零点的秒数) res1=time.time() p ...

  6. 在linux(centos)系统安装nginx教程

    最近在切换服务器操作系统,简单记录一下 一.安装nginx需要如下环境  1.gcc  编译依赖gcc环境,如果没有gcc环境,需要安装gcc yum install gcc-c++  2.PCRE ...

  7. ZZCMS v8.2 前台Insert注入+任意文件删除

    前几天看了水泡泡老哥的zzcms的审计,在论坛上一搜发现这个cms有不少洞.听说很适合小白练手,所以来瞅一瞅.不知道我发现的这个洞是不是已经被爆过了,如果雷同,纯属巧合. 一.Insert注入,直接返 ...

  8. 《深入理解Java虚拟机》-----第4章 虚拟机性能监控与故障处理工具

    理论总是作为指导实践的工具,能把这些知识应用到实际工作中才是 我们的最终目的. 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异 ...

  9. ES 08 - 创建、查看、修改、删除、关闭Elasticsearch的index

    目录 1 创建index(配置mapping[映射]) 2 查看index 3 修改index 4 删除index 5 打开/关闭index 6 常见问题及解决方法 index相当于RDBMS(关系型 ...

  10. 外行人都能看懂的SpringCloud,错过了血亏!

    一.前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringCloud的一些基础的 ...