欢迎访问我的博客,你的支持,是我最大的动力!

利用kickstart制作自定义无人值守U盘版安装镜像

Linux 马从东 4710℃ 评论
目录:
[显示]

近期,根据业务需要,我们需要为每个分支机构部署一台服务器,并要在服务器上部署一些业务系统,如MySQL、Nginx等。传统的方法是安装完操作系统,然后依次部署各项服务,显然,这么做的效率是非常低的,并且操作很繁锁,也容易出现操作上的误差。那么有没有一种简单高效且可靠的系统部署方法呢,于是我们想到了使用kickstart。利用kickstart制作无人值守的全自动安装ISO镜像,然后通过U盘进行安装。

使用kickstart制作可以自动安装的光盘是比较容易的,但是,由于现在光盘的使用越来越少,部分服务器上也不再提供光驱,于是,我们打算使用U盘来安装,但这个过程中,由于真实光盘和U盘的差异性,在适配U盘安装的过程中,遇到了很多坑,也学到了很多我东西,这里整理成你看到的这篇文章。

总体流程

总体的步骤还是比较清晰的,可以简单归纳为这几个部署:

复制标准安装ISO -> 集成rpm -> 编写ks.cfg文件 -> 加入自定义业务部署脚本 -> ISO封装 -> 写入U盘

任务目标

因为我们真实的任务中部署了非常多的服务,脚本也很长,不便于说明,所以这里假设一个目标,作以说明。

为了方便后文描述,这里假设我们需要制作一款自动部署镜像,安装完成后,会自动安装percona-xtrabackup(repo集成方式)和安装supervisor软件(tar包方式,无外网连接),系统启动后,通过初始化脚本,设置系统IP(静态)并设置主机名

构建repo软件仓库

这里使用CentOS-7-x86_64-Minimal-1804.iso作为基础镜像,之所以选择Minimal是因为镜像非常小,只有906M,并且没有无用的内容,可以保证最终生成的镜像大小也合适,需要的功能,根据需要添加即可。

挂载光盘镜像,并复制光盘内容到/tmp/iso目录下

#挂载光盘到/mnt目录
mount /dev/sr0 /mnt
#创建工作目录
mkdir -p /tmp/iso
#复制光盘内容到iso目录
cp -r /mnt/* /tmp/iso/
cd /tmp/iso
#设置光盘作为yum本地源,方便分析哪些包在光盘中没有,需要添加
#安装yum源优先级插件,让光盘的源优先级更高
yum install yum-plugin-priorities
##priority=1 即优先级最高
cat >/etc/yum.repos.d/CentOS-Media.repo<<EOF
[c7-local]
name=CentOS-7-CD
baseurl=file:///tmp/iso/
gpgcheck=1
enabled=1
priority=1
gpgkey=file:///tmp/iso/RPM-GPG-KEY-CentOS-7
EOF
yum clean all  #清除缓存
yum makecache #建立新缓存

percona-xtrabackup是Percona的一款非常出名且性能优秀的MySQL数据库在线备份工具,当然,CentOS的光盘中是没这个包的,我们希望把它集成到光盘里,并默认安装,首选,我们需要分析这个包的依赖关系

#下载该包
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
yum install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
#如上图,可以看到,光盘中仅有rsync,所以我们需要先将其他包下载下来,并复制到/tmp/iso/Packages中
yum install yum-utils #yumdownloader命令在该包中,用于下载rpm包
cd /tmp/iso/Packages   #直接下到这个目录
yumdownloader libev perl perl-Carp perl-Compress-Raw-Bzip2 perl-Compress-Raw-Zlib perl-DBD-MySQL perl-DBI perl-Data-Dumper perl-Digest perl-Digest-MD5 perl-Encode perl-Exporter perl-File-Path perl-File-Temp perl-Filter perl-Getopt-Long perl-HTTP-Tiny perl-IO-Compress perl-Net-Daemon perl-PathTools perl-PlRPC perl-Pod-Escapes perl-Pod-Perldoc perl-Pod-Simple perl-Pod-Usage perl-Scalar-List-Utils perl-Socket perl-Storable perl-Text-ParseWords perl-Time-HiRes perl-Time-Local perl-constant perl-libs perl-macros perl-parent perl-podlators perl-threads perl-threads-shared
#安装光盘制作工具集
yum install createrepo mkisofs isomd5sum syslinux
#重新生成repo数据库
cd /tmp/iso
createrepo -g repodata/83b61f9495b5f728989499479e928e09851199a8846ea37ce008a3eb79ad84a0-c7-minimal-x86_64-comps.xml .
#测试修改本地源位置到/tmp/iso
yum clean all
yum install percona-xtrabackup-24  #可以发现,已经可以通过yum安装xtrabackup

至此,已在光盘repo中集成了percona-xtrabackup-24,只需要ks.cfg中软件安装部分%packages添加percona-xtrabackup-24,即可实现自动安装该软件

编写ks.cfg文件

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

如果系统安装了图形化界面,可以安装kickstart的图形化程序,当然,也可以不安装,这个工具可以用来生面ks.cfg文件,安装方法是yum install system-config-kickstart

这里直接附上我注释的ks.cfg文件。第一个示例文件可以全自动安装系统,并附带执行复制光盘文件到系统的任务,但是不足之处是,如果系统磁盘不为/dev/sda则会卡在分区位置,不能继续运行

下面这个是使用图形化界面,需要人工分区,其实就是启用图形界面,然后注释掉所有与磁盘相关的部分,这里命名为ks_m.cfg

这里有一点需要注意,在网络配置部分,我使用的网卡是ens33,所以只有在网卡名称为ens33时,才会生效,可以考虑获取网卡名称,从而自动判断,比如通过命令interface=$(ls /sys/class/net| grep -v "lo" | head -1) 然后使用变量$interface获取,不过这个未经测试,有兴趣的可以试试,我是放到安装后的初始化脚本中作判断的

编写完ks.cfg和ks_cfg两个文件后,将其放于/tmp/iso/isolinux目录下,供安装启动菜单调用

编写isolinux.cfg文件

isolinux.cfg是光盘启动后选择菜单的配置文件,位于/tmp/iso/isolinux下,可以在文件中添加修改启动项

先附上完整配置文件内容

timeout 600 #超时时间为60秒
menu title Customer System based CentOS 7 #设置标题栏
##默认从本地磁盘启动 不要将默认菜单设置为自动安装项目 最好设置默认菜单为从本地磁盘启动
label local1
menu label ^x.Boot from local drive
menu default
localboot 0xffff
##自动部署的菜单项配置
label linux
menu label ^a.Install Customer Server Automatic
kernel vmlinuz
#ks=cdrom:/isolinux/ks.cfg
append initrd=initrd.img inst.ks=hd:LABEL=CentOS\x207\x20x86_64:/isolinux/ks.cfg inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet

在菜单项配置中,重点看inst.ks=hd:LABEL=CentOS\x207\x20x86_64:/isolinux/ks.cfg这一项,即指定ks.cfg文件的位置,之前使用ks=cdrom:/isolinux/ks.cfg的方式,在使用光盘的时候运行得非常好,但换用U盘后,会找不到ks.cfg文件,很明显么,路径指定的是cdrom,后面使用基于LABEL的方式,这样可以正确找到ks.cfg文件的位置,使用卷标,这样不管这个U盘被识别成什么,只要卷标不变,那么,就能获取到正确位置。那么卷标在什么地方设置呢,在使用mkisofs打包成光盘ISO文件时,通过 -V参数指定

 编写init.sh初始化脚本

ks.cfg文件中post脚本中定义了如下语句
mkdir -p /mnt/sysimage/mnt/plus
cp -fr /mnt/install/repo/plus/* /mnt/sysimage/mnt/plus
cp /mnt/install/repo/plus/init.sh /mnt/sysimage/root/

即将光盘中plus目录下所有文件复制到系统中/mnt/plus目录下,同时还复制了一个init.sh的脚本到/root目录下,这就是系统初始化脚本,用于在安装完系统后,登录系统,然后配置IP(因为系统网卡名可能不是ens33,且不是静态IP而是DHCP方式获取的,这我们不喜欢,换成静态方式),最后自动安装supervisor软件。

安装supervisor的最简单的方法是pip install supervisor,但是,我们假设服务器所在局域网不能联接到互联网,那么,这件事情就复杂一点了,因为不能使用pip,因为pip就没法安装,只能一个依赖包一个依赖包的安装,那就写到脚本里面。

supervisor可以通过python setup.py install命令从源码安装,但是先需要有python安装环境,即setuptools工具。

setuptools工具依赖于python-backports、python-ipaddress、python-backports-ssl_match_hostname,好在这些包都有现成的rpm,所以,安装python-setuptools命令如下:

rpm -ivh /mnt/plus/python-backports-1.0-8.el7.x86_64.rpm
rpm -ivh /mnt/plus/python-ipaddress-1.0.16-2.el7.noarch.rpm
rpm -ivh /mnt/plus/python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch.rpm
rpm -ivh /mnt/plus/python-setuptools-0.9.8-7.el7.noarch.rpm

supervisor依赖于meld3,meld3是一个tar包,supervisor也是tar包,解压后可以通过python setup.py install安装,如下

cp /mnt/plus/meld3-1.0.2.tar.gz /root
cd /root && tar zxf meld3-1.0.2.tar.gz
cd /root/meld3-1.0.2 && python setup.py install
rm -fr /root/meld3-1.0.2
rm -f /root/meld3-1.0.2.tar.gz

cp /mnt/plus/supervisor-3.3.4.tar.gz /root
cd /root && tar zxf supervisor-3.3.4.tar.gz
cd /root/supervisor-3.3.4 && python setup.py install
rm -fr /root/supervisor-3.3.4
rm -f /root/supervisor-3.3.4.tar.gz

此外,还需要supervisor.service文件、supervisord.conf、default.ini,(default.ini文件为空,用于添加需要加到supervisor上的服务)内容分别如下

所以,可以得取安装supervisor的脚本supervisor_install.sh

最后在init.sh中调用supervisor_install.sh即可完成supervisor的安装,那么init.sh还有一项功能没有实现,即配置网络,这也很容易,详细配置如下:

运行init.sh脚本,可以自动识别系统的网卡,并以DHCP方式启动网卡,如果能获取到IP地址,则会显示IP配置信息,可以参照动态获取的信息,再通过手动输入的方式,配置得到静态IP配置,同时,在这个脚本中,也会自动安装supervisor

生成ISO文件

完成上述工作后,则可以打包成ISO镜像文件了

cd /tmp/iso
# 打包ISO文件
mkisofs -o /tmp/My-Server-CentOS7-v1.0.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 "CentOS 7 x86_64" -T /tmp/iso/
# 转换为ISOhybrid (该命令由syslinux提供)
isohybrid ../My-Server-CentOS7-v1.0.iso
# 嵌入md5校验码 (该命令由isomd5sum提供)
implantisomd5 ../My-Server-CentOS7-v1.0.iso
# 校验一下 (该命令由isomd5sum提供)
checkisomd5 ../My-Server-CentOS7-v1.0.iso

mkisofs参数说明:
-o /tmp/My-Server-CentOS7-v1.0.iso,设置输出文件名,-output
-b isolinux/isolinux.bin,指定开机映像文件
-c isolinux/boot.cat,制作启动光盘时,mkisofs会将开机映像文件中的全-eltorito-catalog*文件的全部内容作成一个文件
-no-emul-boot,非模拟模式启动
-boot-load-size 4,
-boot-info-table,
-joliet-long,
-R,使用Rock Ridge Extensions,是用于linux环境下的光盘,文件名区分大小写同时记录文件长度,-rock
-J,使用Joliet格式的目录与文件名称,Jolient是windows下使用的光盘,-joliet
-v,执行时显示详细的信息,-verbose
-V "CentOS 7 x86_64",设置卷标Volume ID,-volid
-T,建立文件名的转换表,适用于不支持Rock Ridge Extensions的系统,-translation-table
/tmp/iso/,光盘源文件目录

制作U盘版启动盘

推荐使用软件rufus,该软件为绿色小软件,小巧,功能完善
Rufus安装U盘制作工具:rufus
版本:v3.1
官网:http://rufus.akeo.ie/
下载地址:http://rufus.akeo.ie/downloads/rufus-3.1.exe

注:如果光盘镜像为ISOHybrid镜像,有ISO镜像模式和DD镜像模式两种写入方式,其中ISO镜像模式写入的U盘还可以写入其他文件,和一般U盘无区别,但兼容性较差,推荐DD镜像模式,但该模式写入后,windows下将不识别,仅可用于系统安装

参考连接

1、redhat系统启动项参数官方文档
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/chap-anaconda-boot-options

2、kickstart安装系统中的文件复制问题
https://www.centos.org/forums/viewtopic.php?t=11119

3、isohybrid(syslinux)官方wiki
https://www.syslinux.org/wiki/index.php?title=Isohybrid

4、基于Kickstart自动化安装CentOS实践
https://wsgzao.github.io/post/kickstart/

5、CSDN博客:kickstart自动应答脚本生成及虚拟机自动安装
https://blog.csdn.net/Lockey23/article/details/76376907

转载请注明:轻风博客 » 利用kickstart制作自定义无人值守U盘版安装镜像

喜欢 (1)or分享 (0)