[TOC]
### 总体流程
> 复制官方ISO -> 集成rpm -> 编写ks.cfg文件 -> 加入自定义业务部署脚本 -> ISO封装 -> 写入U盘
### 使用到的工具
`yum -y install anaconda createrepo mkisofs rsync syslinux`
## 具体操作
### 挂载标准镜像
这里使用CentOS-7-x86_64-Minimal-1511.iso作为基础镜像,选择Minimal是因为镜像比较小,可以保证最终生成的镜像大小不至于很大,需要的功能,根据需要添加即可。
挂载光盘镜像,并复制光盘内容到/tmp/iso目录下
#创建挂载目录
`mkdir /mnt/cdrom`
#挂载光盘到/mnt目录
`mount -o loop /dev/sr0 /mnt/cdrom`
#创建工作目录
`mkdir -p /tmp/iso`
#复制光盘内容到iso目录
`cp -r /mnt/cdrom/* /tmp/iso/`
#设置光盘作为yum本地源,方便分析哪些包在光盘中没有,需要添加
```
cd /etc/yum.repo
mkdir bak
mv *.repo bak
mv bak/CentOS-Media.repo .
vi CentOS-Media.repo
[c7-local]
name=CentOS-7-CD
baseurl=file:///tmp/iso/
gpgcheck=0
enabled=1
gpgkey=file:///tmp/iso/RPM-GPG-KEY-CentOS-7
yum clean all
yum makecache
```
### 编写ks.cfg
如果希望使用图形化工具生成ks.cfg可以安装system-config-kickstart,这边将直接编辑ks.cfg
```
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password 默认是www.upsoft01.com
rootpw --iscrypted $1$4FH.jrCj$NIpqwnkXalm.HqmrN4bMQ/
# System language
lang en_US
# Firewall configuration
firewall --enabled --ssh
# System authorization information
auth --useshadow --passalgo=sha512
# Use CDROM installation media安装源
cdrom
# 指定要安装的软件包
# 在%packages与%end中间加入需要自定义安装的包组
# 默认
%packages
@^minimal
@core
#kexec-tools
# 额外添加
#net-tools
#openssl
#pciutils
#percona-xtrabackup-24
%end
# Use graphical install图形化界面,txt即为命令行模式
graphical
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
# Network information启动默认eth0的DHCP
network --bootproto=dhcp --device=eth0 --onboot=yes --activate
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
# 分区设置
# 要使用全部空间 使用--size=1 --grow
# 分区要使用所有剩余空间大小 --percent=100
part /boot --fstype="xfs" --ondisk=sda --size=400
part pv.364 --fstype="lvmpv" --ondisk=sda --size=1 --grow
volgroup centos_school --pesize=4096 pv.364
logvol swap --fstype="swap" --size=4096 --name=swap --vgname=centos_school
logvol /home --fstype="xfs" --percent=100 --name=date --vgname=centos_school
logvol / --fstype="xfs" --size=10240 --name=root --vgname=centos_school
#%pre
# 安装前执行的脚本 注意 此时磁盘尚未格式化 所以能执行的工作有限
# 常用于读取磁盘信息 生成分区脚本 然后供之后格式化使用
#%end
# 安装后脚本
# %post --nochroot
# 安装后脚本有两种模式 一种是在安装环境运行 此时系统挂载于/mnt/sysimage 光盘挂载于/mnt/install/repo
# 可以从光盘复制文件到系统
# %post --log=/root/ks-post.log
# 但是如果安装源不被识别为/dev/sr0 则不能通过挂载的方式把光盘中的文件复制到系统
# 将外部文件拷贝到系统内,需在/ISO目录下创建plus文件夹,
# 将外部文件(例如二进制文件dota_driver)放进plus目录下。
# 在安装系统期间,该文件的绝对路径为/run/install/repo/plus/,而系统的文件路径挂载在/mnt/sysimage,
# 所以目的地址为/mnt/sysimage/usr/bin。
%post --nochroot
# 复制安装光盘plus目录下所有内容到系统/mnt目录下
mkdir -p /mnt/sysimage/mnt/plus
cp -fr /mnt/install/repo/plus/* /mnt/sysimage/mnt/plus/
# 复制安装光盘plus/init.sh文件到系统/root目录下 作为初始化执行脚本
cp /mnt/install/repo/plus/init.sh /mnt/sysimage/root/
echo "successd read" > /mnt/sysimage/install.log
%end
```
自己编写的ks.conf文件很有可能存在语法错误,可以通过这个命令来检查
`ksvalidator ks.cfg`
如果没有任何输出则表示文件没有语法错误
ks.cfg文件转换成linux格式,放到/tmp/iso/isolinux下
### 修改isolinux.cfg
```
default vesamenu.c32
timeout 150
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 Manual
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
label linux2
menu label ^Install CentOS 7 Auto
menu default
kernel vmlinuz
append initrd=initrd.img inst.ks=hd:LABEL=CentOS\x207\x20x86_64:/isolinux/ks.cfg inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
label check
menu label Test this ^media & install CentOS 7
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check 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=CentOS\x207\x20x86_64 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=CentOS\x207\x20x86_64 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
```
isolinux.cfg文件存在isolinux文件夹下
* timeout 150 表示倒计时15秒将从默认选项开始执行安装
* 这里的默认选项是 Install CentOS 7 Auto
menu default为默认选项的标识
* 新增一段,添加一个选项
```
label linux2
menu label ^Install CentOS 7 Auto
menu default
kernel vmlinuz
append initrd=initrd.img inst.ks=hd:LABEL=CentOS\x207\x20x86_64:/isolinux/ks.cfg inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
```
其中指定了ks.cfg的路径inst.ks=hd:LABEL=CentOS\x207\x20x86_64:/isolinux/ks.cfg
### 自定义业务脚本
* ks.cfg中%post和%end段内定制了安装完成系统后执行的命令
```
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/
```
其中的init.sh就是自定义业务的脚本
```
#!/bin/sh
echo "###########################################################"
echo "++++++++++++++Setup System++Deplay Bigant++++++++++++++++++"
echo "###########################################################"
#主动启动网卡并设置开机自启动
interface=$(ls /sys/class/net| grep -v "lo" | head -1)
ipaddr=$(ip route show | grep -v default | awk '{print $9}')
ifup $interface
sed -i "s/^ONBOOT=no/ONBOOT=yes/g" /etc/sysconfig/network-scripts/ifcfg-${interface}
#添加防火墙规则
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
#修改系统资源限制
sed -i '51a* soft noproc 40960' /etc/security/limits.conf
sed -i '51a* hard noproc 40960' /etc/security/limits.conf
sed -i '51a* soft nofile 40960' /etc/security/limits.conf
sed -i '51a* hard nofile 40960' /etc/security/limits.conf
#安装bigant
cd /mnt/plus
tar zxvf *.tar.gz
cd oneinstack
./install.sh -a && /etc/init.d/bigant_root && echo -e "\e[1;31mPlace reboot system and deplay with Browser! \n Open http://${ipaddr}:8000\e[0m"
```
### 打包ISO
1. 制作iso文件
`mkisofs -o /tmp/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/`
* 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/,光盘源文件目录
2. 转换为ISOhybrid (该命令由syslinux提供)
`isohybrid /tmp/CentOS7-v1.0.iso`
3. 嵌入md5校验码 (该命令由isomd5sum提供)
`implantisomd5 /tmp/CentOS7-v1.0.iso`
4. 检验md5
`checkisomd5 /tmp/CentOS7-v1.0.iso`