CentOS7-1511光盘定制化制作:
部分专业词汇释义:
包组:一个功能块往往由多个rpm安装包才能完成安装,此时所有此功能必备的安装包称之为一个包组。
isolinux.bin:是光盘引导程序,服务器读取光盘的第一步。
isolinux.cfg:isolinux.cfg是isolinux.bin的配置文件,当光盘启动后(即运行isolinux.bin),会自动去找isolinux.cfg文件。
vmlinuz:是linux系统的内核映像,在isolinux.cfg中配置读取。
initrd.img:initrd.img是ramfs内存系统镜像 (先cpio,再gzip压缩),都是编译内核生成的;isolinux.bin根据安装选项找到对应的配置,装载完内核就装载 内存镜像系统,其中包含启动配置文件ks.cfg;
squashfs.img:squashfs.img是根文件系统,当内核启动后就装载squashfs.img并切换根文件系统并执行里面的anaconda程序。
参考文献:
http://www.smorgasbork.com/2014/07/16/building-a-custom-centos-7-kickstart-disc-part-1/
http://www.smorgasbork.com/2012/01/04/building-a-custom-centos-7-kickstart-disc-part-2/
http://www.smorgasbork.com/2012/01/04/building-a-custom-centos-7-kickstart-disc-part-3/
http://www.smorgasbork.com/2012/01/04/building-a-custom-centos-7-kickstart-disc-part-4/
http://blog.csdn.net/ericzhong83/article/details/6921105
http://blog.csdn.net/ericzhong83/article/details/7357536
http://blog.csdn.net/ericzhong83/article/details/7369539
http://blog.csdn.net/ericzhong83/article/details/7380120
http://blog.csdn.net/ericzhong83/article/details/7429192
总体来说安装盘定制化分为三步,1解压(挂载)原生盘,拷贝部分不需要改动的文件 2修改需要改动的文件,定制化裁剪rpm软件包 3压缩ISO
1:解压原生盘,拷贝部分不需要改动的文件:
例如原生光盘位置在 /home/makeISO/CentOS-7-x86_64-DVD-1511.iso
新建一个挂载的文件夹:/home/makeISO/mnt
挂载:mount /home/makeISO/CentOS-7-x86_64-DVD-1511.iso /home/makeISO/mnt
挂载成功后看到的mnt目录如下:
挂载成功后,准备建立与原生盘目录对应的映射文件夹系统,用来将挂载的原生盘拷贝出来(挂载文件为只读,拷贝出来才能修改)
新建文件夹:
/home/makeISO/buildding
/home/makeISO/buildding/all_rpms
/home/makeISO/buildding/isolinux
/home/makeISO/buildding/isolinux/images
/home/makeISO/buildding/isolinux/ks
/home/makeISO/buildding/isolinux/LiveOS
/home/makeISO/buildding/isolinux/EFI
/home/makeISO/buildding/isolinux/Packages
将部分原生盘的文件拷贝到映射文件夹系统上:
拷贝.discinfo
cp /home/makeISO/mnt/.discinfo /home/makeISO/buildding/isolinux/.discinfo
拷贝原生isolinux资源
cp /home/makeISO/mnt/isolinux/* /home/makeISO/buildding/isolinux/
拷贝原生images资源
cp -rf /home/makeISO/mnt/images/* /home/makeISO/buildding/isolinux/images/
拷贝原生LiveOS资源
cp -rf /home/makeISO/mnt/LiveOS/* /home/makeISO/buildding/isolinux/LiveOS/
拷贝efi启动文件资源
cp -rf /home/makeISO/mnt/EFI/* /home/makeISO/buildding/isolinux/EFI/
拷贝comps.xml
cp /home/makeISO/mnt/repodata/*comps.xml.gz /home/makeISO/buildding/comps.xml.gz
注意comps.xml是原生盘rpm包的配置文件,可以当做目录来用,解压,以备后面定制化rpm使用。
gunzip /home/makeISO/buildding/comps.xml.gz
拷贝RPM资源
cp /home/makeISO/mnt/Packages/*.rpm /home/makeISO/buildding/all_rpms
拷贝完部分文件后安装一些打盘必备的服务。
执行:yum -y install systemtap-sdt-devel
进入/home/makeISO/buildding/all_rpms目录下:
执行:rpm -Uvh --force perl-5*-*.el7.x86_64.rpm \
pocale-*.el7.noarch.rpm \
perl-Exporter-*.el7.noarch.rpm \
perl-ExtUtils-Install-*.el7.noarch.rpm \
perl-ExtUtils-MakeMaker-*.el7.noarch.rpm \
perl-ExtUtils-Manifest-*.el7.noarch.rpm \
perl-ExtUtils-ParseXS-*.el7.noarch.rpm \
perl-File-Listing-*.el7.noarch.rpm \
perl-File-Path-*.el7.noarch.rpm \
perl-File-Temp-*.el7.noarch.rpm \
perl-Filter-*.el7.x86_64.rpm \
perl-Getopt-Long-*.el7.noarch.rpm \
perl-HTML-Parser-*.el7.x86_64.rpm \
perl-HTML-Tagset-*.el7.noarch.rpm \
perl-HTTP-Cookies-*.el7.noarch.rpm \
perl-HTTP-Daemon-*.el7.noarch.rpm \
perl-HTTP-Date-*.el7.noarch.rpm \
perl-HTTP-Message-*.el7.noarch.rpm \
perl-HTTP-Negotiate-*.el7.noarch.rpm \
perl-HTTP-Tiny-*.el7.noarch.rpm \
perl-IO-Compress-*.el7.noarch.rpm \
perl-IO-HTML-*.el7.noarch.rpm \
perl-IO-Socket-IP-*.el7.noarch.rpm \
perl-IO-Socket-SSL-*.el7.noarch.rpm \
perl-libs-*.el7.x86_64.rpm \
perl-LWP-MediaTypes-*.el7.noarch.rpm \
perl-libwww-perl-*.el7.noarch.rpm \
perl-macros-*.el7.x86_64.rpm \
perl-Net-HTTP-*.el7.noarch.rpm \
perl-Net-LibIDN-*.el7.x86_64.rpm \
perl-Net-SSLeay-*.el7.x86_64.rpm \
perl-parent-*.el7.noarch.rpm \
perl-PathTools-*.el7.x86_64.rpm \
perl-Pod-Escapes-*.el7.noarch.rpm \
perl-Pod-Perldoc-*.el7.noarch.rpm \
perl-Pod-Simple-*.el7.noarch.rpm \
perl-Pod-Usage-*.el7.noarch.rpm \
perl-podlators-*.el7.noarch.rpm \
perl-Scalar-List-Utils-*.el7.x86_64.rpm \
perl-Socket-*.el7.x86_64.rpm \
perl-srpm-macros-*.el7.noarch.rpm \
perl-Storable-*.el7.x86_64.rpm \
perl-Test-Harness-*.el7.noarch.rpm \
perl-Text-ParseWords-*.el7.noarch.rpm \
perl-Thread-Queue-*.el7.noarch.rpm \
perl-threads-*.el7.x86_64.rpm \
perl-Time-Local-*.el7.noarch.rpm \
perl-TimeDate-*.el7.noarch.rpm \
perl-URI-*.el7.noarch.rpm \
perl-WWW-RobotRules-*.el7.noarch.rpm \
perl-LWP-MediaTypes-6.02-2.el7.noarch.rpm \
perl-XML-Filter-BufferText-*.el7.noarch.rpm \
perl-XML-NamespaceSupport-*.el7.noarch.rpm \
perl-XML-Parser-*.el7.x86_64.rpm \
perl-XML-SAX-*.el7.noarch.rpm \
perl-XML-Simple-*.el7.noarch.rpm \
gdbm-devel-*.x86_64.rpm \
glibc-devel-*.x86_64.rpm \
glibc-headers-*.x86_64.rpm \
kernel-headers-*.x86_64.rpm \
libdb-devel-*.x86_64.rpm \
systemtap-sdt-devel-*.x86_64.rpm \
mailcap-*.noarch.rpm \
createrepo-*.el7.noarch.rpm \
deltarpm-*.el7.x86_64.rpm \
python-deltarpm-*.el7.x86_64.rpm \
libxml2-python-2.9.1-5.el7_1.2.x86_64.rpm \
genisoimage-*.el7.x86_64.rpm \
libusal-*.el7.x86_64.rpm \
squashfs-tools-*.el7.x86_64.rpm
2修改需要改动的文件,定制化裁剪rpm软件包:
工具链接: https://pan.baidu.com/s/1smyELR3 密码: zfep
① 先说裁剪rpm包的问题,这里介绍两款非常精简的小工具(含源码):
1)Utils\gather_packages.pl 此工具可以根据第一步中解压出来的comps.xml完成对原生光盘中rpm包的解析分类,然后将我们需要的包组从源文件目录拷贝到
目标目录中。
调用参数:comps_file the full path to the comps.xml file comps.xml的绝对路径
rpm_src_path the full path to the directory of all RPMs from the distro
RPM包的源文件绝对路径,本例中指的是/home/makeISO/buildding/all_rpms
rpm_dst_path the full path to the directory where you want to save the RPMs for your kickstart
RPM包的目标文件绝对路径,本例中指的是/home/makeISO/buildding/isolinux/Packages
arch the target system architecture (e.g. x86_64)
软件包的系统结构版本,本例中统一使用x86_64
xtra_grps_and_pkgs a list of extra groups and packages, separated by spaces
需要的包组的id列表,传入时可以用空格分开,比如web-server mariadb等
由于我们的光盘定制比较固定化,所以已经将部分必要的包组ID写入工具内,
详情请参考Utils\gather_packages.pl 第27行
@desired_groups = ('core', 'base', 'web-server', 'mariadb', 'fonts', 'grub2','grub2-efi', 'kernel','createrepo','memcached','net-tools','wget','pciutils');
2)Utils\resolve_deps.pl 此工具可以检测目标文件夹目录中所有rpm包是否可以完成kickstart启动程序需求,如果不满足可以列出缺失的包名,
注意一旦缺失此工具只列出一层依赖缺失关系的包名,需要多次运行直到所有依赖缺失全部解决。
调用参数:rpm_src_path the full path to the directory of all RPMs from the distro
RPM包的源文件绝对路径,本例中指的是/home/makeISO/buildding/all_rpms
rpm_dst_path the full path to the directory where you want to copy the RPMs for your kickstart
RPM包的目标文件绝对路径,本例中指的是/home/makeISO/buildding/isolinux/Packages
arch the target system architecture (e.g. x86_64)
软件包的系统结构版本,本例中统一使用x86_64
了解这两种rpm包工具之后裁剪rpm的工作就变得简单起来,
首先拷贝我们需要的软件包组,调用工具指令:
gather_packages.pl /home/makeISO/buildding/comps.xml /home/makeISO/buildding/all_rpms /home/makeISO/buildding/isolinux/Packages x86_64
将我们自己需要用到的包全部拷贝到/home/makeISO/buildding/isolinux/Packages下,方便最后统一配置yum源
然后检测依赖关系,调用工具指令:
resolve_deps.pl /home/makeISO/buildding/all_rpms /home/makeISO/buildding/isolinux/Packages x86_64
注意:如果发现依赖缺失,请重复调用上面的工具,直到没有缺失为止。
② 改必要的文件和配置,达到定制化和自动部署的目的。(重难点)
之前所做的一切都只是准备工作或者精简工作,从这里开始我们真正的开始定制化linux系统启动盘。
1)生成自己的ks.cfg(kickstart)配置文件,此文件配置了安装系统时候的一些选项,高度可定制化,下面给出适合我们自己使用的例子:
ks.cfg具体内容:
# Install OS instead of upgrade同原生,无需改动
install
# Keyboard layouts 中国式键盘
keyboard --vckeymap=cn --xlayouts='cn'
# Root password root密码,这里经过sha512加密,其实密码就是admin
rootpw --iscrypted \$1\$i7FG2PRM\$wT/A.hDqa0j.W6ddthku90
# System timezone 时区设置
timezone Asia/Shanghai
# System language 语言和编码设置
lang zh_CN.UTF-8
# Firewall configuration 禁用防火墙
firewall --disabled
# System authorization information 密码验证方式
auth --useshadow --passalgo=sha512
# Use CDROM installation media 同原生
cdrom
# Use graphical install 同原生
graphical
# SELinux configuration 禁用selinux
selinux --disabled
# Do not configure the X Window System 同原生
skipx
# Reboot affter installation 同原生
reboot --eject
# System bootloader configuration 引导程序参数。系统盘启动方式和启动盘以及分区类型,这里使用mbr方式,专业人士可以自行修改grub.cfg定 # 制EFI启动。
bootloader --location=mbr --boot-drive=sda
autopart --type=lvm
# Clear the Master Boot Record 同原生
zerombr
# Partition clearing information 初始化启动盘及清理
clearpart --all --initlabel --drives=sda
# Post scripts 系统设置结束标志,也是自定义准备脚本的开始标志
%post --nochroot
#!/bin/bash
set -x
exec < /dev/tty3 > /dev/tty3
chvt 3
(
echo "准备工作开始"
echo "拷贝定制化资源..."
) 2>&1 | /usr/bin/tee /var/log/post_install.log
chvt 1
# %end是自定义脚本结束标志
%end
# %post是自定义脚本开始标志
%post --log=/root/post-log.log
#!/bin/bash
#set -x
exec < /dev/tty3 > /dev/tty3
chvt 3
(
echo "################################"
echo "# 自定义开机标题 #"
echo "################################"
) 2>&1 | /usr/bin/tee /var/log/post_install.log
chvt 1
# %end是自定义脚本结束标志
%end
# install packages here 自动安装的包组ID写在这里
%packages
@base
@core
@fonts
@mariadb
@web-server
createrepo
memcached
wget
net-tools
#MySQL-python
python-keystoneclient
python-paramiko
%end
2)生成启动菜单文件isolinux.cfg:
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 $productName$productVersion
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
#TITLENAME是安装界面的标题名字
menu label ^Install TITLENAME
menu default
kernel vmlinuz
#initrd=配置了initrd.img的读取,inst.stage2=hd:LABEL=配置的是打完光盘后,挂载到服务器上的磁盘名,
#inst.ks=file:/ks.cfg指定了ks文件的路径和名称,file:/指的是initrd.img的磁盘根路径
append initrd=initrd.img inst.stage2=hd:LABEL=TITLENAME inst.ks=file:/ks.cfg net.ifnames=0 biosdevname=0
menu separator # insert an empty line
menu end
3)重新打包生成initrd.img:
新建个文件夹用来放解压后的文件
mkdir -p /home/temp
cd /home/temp
将initrd.img解压到temp目录下
(xz -d 只是解压成流,然后将结果传给cpio创建成文件系统,参数-i指cpio进入解压模式,--make-directories在需要的地方创建目录,
--no-absolute-filenames在-i模式中, 即使它们在归档包中有绝对路径名。也在当前目录中创建所有相关文件, )
xz -d < /home/makeISO/buildding/isolinux/initrd.img | cpio -i --make-directories --no-absolute-filenames
将我们在第1步中生成的ks.cfg拷贝到当前目录下
cp -f ks.cfg .
替换完成后,将文件压缩回initrd.img,替换原有的initrd.img
find .会列出当前目录下所有文件,然后传递给cpio,-H newc 指定了归档包的类型,--create指定了cpio进入压缩模式,压缩后的归档包
传递给xz指令,--format=lzma指定了xz压缩算法,--compress指定了xz为压缩操作,--stdout >指定了输出路径
find . | cpio -H newc --create | xz --format=lzma --compress --stdout > /home/makeISO/buildding/isolinux/initrd.img
4)建立光盘需要的repo数据源
createrepo 为创建repo源的指令,comps.xml就是之前使用的rpm包配置文件 /home/makeISO/buildding/isolinux是rpm包所在路径
createrepo -g /home/makeISO/buildding/comps.xml /home/makeISO/buildding/isolinux
创建成功后会在当前目录下看到repodata文件夹。
3:压缩ISO:
压缩指令如下:
mkisofs -o "/home/光盘名字.iso" -b isolinux.bin -c boot.cat -no-emul-boot -V "光盘版本" -boot-load-size 4 -boot-info-table -eltorito-alt-boot
-e images/efiboot.img -R -J -v -T /home/makeISO/buildding/isolinux
mkisofs是打盘指令
-o 光盘的路径及名字
-b 启动引导程序,也就是isolinux.bin
-c <开机文件名称> 制作可开机光盘时,mkisofs会将开机映像文件中的全-eltorito-catalog<开机文件名称>全部内容作成一个文件
-no-emul-boot 非启动模式
-V 光盘卷册集ID
-boot-load-size 4 -boot-info-table -eltorito-alt-boot 都是固定参数,不用管
-e efi启动镜像路径
-R -J -v -T 固定参数不用管
最后的参数是光盘的文件路径