自定义linux ISO镜像

2,374 阅读4分钟

写在前面: 现在系统部署的方式有很多,cm、docker或是kubernetes等都给应用提供了便捷的部署运维功能。但是有木有想过,应用部署是方便了,这些工具本身的部署却复杂了很多。假如我们在已有的环境将应用部署好,再将该系统打包成ISO镜像文件,然后去其他环境部署的时候只需要安装ISO镜像,应用程序在安装镜像的同时也通过我们自定义的脚本配置或运行起来,这样是不是更加方便。

当然不可否认的是,对于运维的规章制度要求很高的公司是不会采纳这种部署方式,但是不影响咱们掌握它。

安装制作工具

yum -y install anaconda createrepo mkisofs rsync syslinux

挂载镜像,同步文件

  1. 创建挂在目录 sudo mkdir -p /mnt/cdrom

  2. 挂载镜像文件 这里以CentOS 7.4为例,将镜像挂载在/mnt/cdrom

sudo mount -o loop /home/admin/dingx/iso/CentOS-7-x86_64-DVD-1708.iso /mnt/cdrom/

  1. 同步文件 新建/ISO目录,用于存放ISO中的rpm包。将原ISO的rpm包同步至该目录下。

sudo rsync -a /mnt/cdrom/ /ISO/

**注意:**rsync命令中可以使用--exclude=Packages/ --exclude=repodata/命令避免将Packages和repodata文件夹下的内容同步过来,以便自定义rpm包。如需自定义rpm包,还需要自定义comps.xml,具体方法见o-my-chenjian.com/2017/11/20/…

  1. 准备自定义文件目录,后续ks文件中需要用到 sudo mkdir -p /ISO/program

制作ks.cfg文件

  1. 图形化界面 由于应用部署环境基本不会有图形化界面,所以这里只做简单介绍。

在有图形化界面的系统中执行yum install system-config-kickstart -y,用该工具来制作ks.cfg。

  1. ks.cfg详解 首先,想要看一下ks.cfg的基本结构的话,可以查看系统中的/root/anaconda-ks.cfg文件。该文件的配置对应的就是系统刚安装后的状态。

具体解释如下:

#platform=x86, AMD64, 或 Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password 密码:123456
rootpw --iscrypted $1$wlDM6qE0$XQg/yBK2dKBh7v/vp.Yk6/
# System language
lang en_US
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use CDROM installation media
cdrom
# Use text mode install
text
# Run the Setup Agent on first boot
firstboot --disable
ignoredisk --only-use=sda
# SELinux configuration
selinux --disabled

# Network information
network  --bootproto=dhcp --device=eth0 --onboot=yes --ipv6=auto --activate
network  --device=ens33 --hostname=localhost.localdomain
# Reboot after installation
# 注意这里是在%post脚本运行过后重启
reboot
# System timezone
timezone Asia/Shanghai
# System bootloader configuration
bootloader --location=mbr --driveorder=sda --append=""
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
autopart --type=lvm

# 这里设置预安装包
# 如果要重现当前系统的安装环境,可以查看/root/下的anaconda-ks.cfg,直接复制其%packages的内容至我们的ks.cfg即可。
%packages
@^infrastructure-server-environment
@base
@compat-libraries
@core
@development
@ha
@hardware-monitoring
@performance
@security-tools
chrony
kexec-tools
%end

# 已安装的真实操作系统被挂载到内存虚拟操作系统中的/mnt/sysimage目录
# 上文放在/ISO/program/中的文件可以从/run/install/repo/program/中取到
%post --nochroot
cp -r /run/install/repo/program/xxx /mnt/sysimage/usr/local/
%end
# 在操作系统安装后运行的脚本
%post
cd /usr/local/xxx
# 把文件TRANS.TBL删除
find . -name "TRANS.TBL" -type f -print -exec rm -rf {} \;
./install.sh >& install.log
%end

以上列出了常用的参数,需要关注的是需要在安装的时候先把应用程序文件拷贝到/mnt/sysimage/usr/local/目录,待系统安装完后,应用程序就可以在/usr/local/中找到。然后就是在%post - %end中自定义脚本,可以设定程序配置,一次启动程序等。

  1. 验证ks.cfg 通过命令ksvalidator ks.cfg来验证语法正确与否,若无任何输出则表示正确

  2. 将ks.cfg放在/ISO/cdrom/isolinux目录下

修改isolinux.cfg文件

修改内容如下:

label linux
  menu label ^Install CentOS 7
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7 inst.ks=cdrom:/isolinux/ks.cfg net.ifnames=0 biosdevname=0 quiet

注意:

  • LABEL后的参数与后续生成iso的命令genisoimage中-V的参数一致;
  • inst.ks=cdrom:/isolinux/ks.cfg这里的ks文件名同上文/ISO/isolinux中的ks文件名;
  • net.ifnames=0 biosdevname=0表示禁用centos7的”一致性网络设备命名法”;
  • 删除其他label中的”menu default”,并且在label linux中添加,否则会出现挂载错误。

制作镜像

啊哈,执行以下命令就能生成自定义ISO啦~

sudo genisoimage -joliet-long -V CentOS7 -o CentOS-7-XXX.iso -b cdrom/isolinux/isolinux.bin -c cdrom/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -cache-inodes -T /ISO

命令中的几个参数一看就明白怎么配了,不过多介绍。

局限性

配置到现在,只能支持通过cdrom的方式自动安装,如果要将ISO烧进U盘来安装,还需要修改EFI目录下的grub.cfg来设置启动硬盘。这种方式不通用,还需要进一步研究。