CentOS7光盘定制化

CentOS7-1511光盘定制化制作:

 

部分专业词汇释义:

包组:一个功能块往往由多个rpm安装包才能完成安装,此时所有此功能必备的安装包称之为一个包组。

isolinux.bin:是光盘引导程序,服务器读取光盘的第一步。

isolinux.cfgisolinux.cfg是isolinux.bin的配置文件,当光盘启动后(即运行isolinux.bin),会自动去找isolinux.cfg文件。

vmlinuz:是linux系统的内核映像,在isolinux.cfg中配置读取。

initrd.imginitrd.img是ramfs内存系统镜像 (先cpio,再gzip压缩),都是编译内核生成的;isolinux.bin根据安装选项找到对应的配置,装载完内核就装载 内存镜像系统,其中包含启动配置文件ks.cfg;

squashfs.imgsquashfs.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 固定参数不用管

最后的参数是光盘的文件路径

你可能感兴趣的:(CentOS7光盘定制化)