定制CentOS-7.3全自动安装ISO

  • 原创
  • Madman
  • /
  • 2018-04-21 09:22
  • /
  • 0
  • 3536 次阅读

定制CentOS-7.3全自动安装ISO-min.png

Synopsis: Anaconda/Kickstart安装方式支持通过本地CD-ROM、本地磁盘、或者通过NFS、FTP、HTTP来进行自动化安装CentOS系统,由于有些场景需要使用U盘或光盘,快速安装定制后的CentOS,所以出现了本文的需求,裁剪官方CentOS-7.3安装ISO中的RPM软件包,只保留部分需要的安装包,然后封装Kickstart文件到新的ISO中,并将新的ISO文件刻录到U盘中,制作U盘启动盘,实现U盘自动安装系统

Linux系统自动部署系列:


1. 分析ISO内部文件

1.1 .discinfo

此文件是在执行/usr/lib/anaconda-runtime/buildinstall时生成,包含安装盘的识别信息,如果缺少此文件,将导致使用定制后的ISO安装系统时,在初始化过程中提示找不到光盘!

[root@CentOS cdrom]# cat .discinfo 
1480943823.812754
7.3
x86_64

1.2 .treeinfo

记录不同的安装方式下,安装程序所在的目录结构

[root@CentOS cdrom]# cat .treeinfo 
[general]
name = CentOS Linux-7
family = CentOS Linux
timestamp = 1480944027.47
variant = 
version = 7
packagedir = 
arch = x86_64

[stage2]
mainimage = LiveOS/squashfs.img

[images-x86_64]
kernel = images/pxeboot/vmlinuz
initrd = images/pxeboot/initrd.img
boot.iso = images/boot.iso

[images-xen]
kernel = images/pxeboot/vmlinuz
initrd = images/pxeboot/initrd.img

1.3 images/

启动文件和驱动盘映像文件目录,最重要的是第二阶段的引导映像

[root@CentOS cdrom]# ls -al images/
total 6291
drwxr-xr-x. 3 root root    2048 Dec  5  2016 .
drwxr-xr-x. 8 root root    2048 Dec  5  2016 ..
-rw-r--r--. 1 root root 6434816 Dec  5  2016 efiboot.img
drwxr-xr-x. 2 root root    2048 Dec  5  2016 pxeboot
-r--r--r--. 1 root root     442 Dec  5  2016 TRANS.TBL

1.4 Packages/

二进制RPM安装包目录

1.5 repodata/

RPM安装包的描述文件,如依赖关系,包含文件,校验码信息

[root@CentOS cdrom]# ls -al repodata/
total 13695
drwxrwxr-x. 2 root root    4096 Dec  5  2016 .
drwxr-xr-x. 8 root root    2048 Dec  5  2016 ..
-rw-rw-r--. 1 root root 1495137 Dec  5  2016 5635df73647e7bb1ac9a289c27f3a84db1db2e33d3644bf506b85562c2a3d392-primary.xml.gz
-rw-rw-r--. 1 root root 3103702 Dec  5  2016 6ec2bb89ebc4b716fe62ea930164b179f2cd90e1bdf1a504cdd7832153392b1e-filelists.sqlite.bz2
-rw-rw-r--. 1 root root 3069068 Dec  5  2016 889dab2d016c523397f24315cacb947484b06607924cc7e4716017842515df52-filelists.xml.gz
-rw-rw-r--. 1 root root  971157 Dec  5  2016 8d04a279fb66b24cab67e8ebc33ef0ddb4fd7d37f9d9608585598a1b80138f53-other.xml.gz
-rw-rw-r--. 1 root root 3122198 Dec  5  2016 b1b2cb9f67759ef5d143a211c2399d800fa58cf3ab12c205188e3c13d1b3d41d-primary.sqlite.bz2
-rw-rw-r--. 1 root root  159099 Dec  5  2016 c55e5b7bbe933fa8dac2cffca4596c265812b74ed12ef3968d487dd6eb22ad93-c7-x86_64-comps.xml.gz
-rw-rw-r--. 1 root root  748686 Dec  5  2016 d918936f5019be3fb66e9981a28cb2a41477a2963d741d454f79377a22214f43-c7-x86_64-comps.xml
-rw-rw-r--. 1 root root 1339096 Dec  5  2016 e4e51f819c9dfc35ad68a2745f1e39020d003741cbb1346d93f776d13e44351c-other.sqlite.bz2
-rw-rw-r--. 1 root root    3732 Dec  5  2016 repomd.xml
-r--r--r--. 1 root root    2575 Dec  5  2016 TRANS.TBL

1.6 isolinux/

[root@CentOS cdrom]# ls -al isolinux/
total 47996
drwxr-xr-x. 2 root root     2048 Dec  5  2016 .
drwxr-xr-x. 8 root root     2048 Dec  5  2016 ..
-r--r--r--. 1 root root     2048 Dec  5  2016 boot.cat
-rw-r--r--. 1 root root       84 Dec  5  2016 boot.msg
-rw-r--r--. 1 root root      293 Dec  5  2016 grub.conf
-rw-r--r--. 1 root root 43372552 Dec  5  2016 initrd.img
-rw-r--r--. 1 root root    24576 Dec  5  2016 isolinux.bin
-rw-r--r--. 1 root root     3068 Dec  5  2016 isolinux.cfg
-rw-r--r--. 1 root root   190896 Nov  6  2016 memtest
-rw-r--r--. 1 root root      186 Oct  1  2015 splash.png
-r--r--r--. 1 root root     2215 Dec  5  2016 TRANS.TBL
-rw-r--r--. 1 root root   152976 Nov  6  2016 vesamenu.c32
-rwxr-xr-x. 1 root root  5392080 Nov 23  2016 vmlinuz

(1) vmlinuz

vmlinuz是vmlinux 经过gzip和objcopy制作出来的压缩文件,vmlinuz是一种统称,有两种具体的表现形式zImage 和bzImage。zImage和bzImage的区别在于本身的大小,以及加载到内存时的地址不同,zImage在0~640KB,而bzImage则在1M以上的位置。

[root@CentOS isolinux]# file vmlinuz 
vmlinuz: Linux kernel x86 boot executable bzImage, version 3.10.0-514.el7.x86_64 (builder@kbuilder.dev.centos.org) #1 SMP , RO-rootFS, swap_dev 0x5, Normal VGA

(2) initrd.img

In computing, initrd (initial ramdisk) is a scheme for loading a temporary root file system into memory, which may be used as part of the Linux startup process. initrd and initramfs refer to two different methods of achieving this. Both are commonly used to make preparations before the real root file system can be mounted.

(3) isolinux.bin

非模拟模式下的启动引导程序,当使用mkisofs命令时,-b参数需要指向它

(4) isolinux.cfg

启动菜单(Boot Menu)配置文件

2. 先进行一次图形化定制安装

首先,一般我们需要通过虚拟机,挂载原版ISO文件,用图形化手动安装一遍CentOS-7.3。假设我们将来要部署的服务器,需要选择Basic Web Server并勾选了Java PlatformPython,通过图形化安装一遍后,我们就可以实现定制后的ISO文件内只包含这些RPM包,整个镜像文件大小将只有几百兆。

3. 拷贝文件

当我们通过图形化安装完系统后,以下步骤均在刚安装好的CentOS系统内进行

3.1 挂载原版ISO

# mkdir /mnt/cdrom
# mount -o loop,ro -t iso9660 CentOS-7-x86_64-DVD-1511.iso /mnt/cdrom
或者:
# mount /dev/cdrom /mnt/cdrom

3.2 拷贝原版ISO内除Packages和repodata目录外的文件

# mkdir /tmp/iso
# rsync -a --exclude=Packages/ --exclude=repodata/ /mnt/cdrom/ /tmp/iso/

注意:

如果没有拷贝.discinfo文件,将导致使用定制后的ISO安装系统时,在初始化过程中提示找不到光盘!

3.3 拷贝已安装的RPM包

# mkdir -p /tmp/iso/Packages
# vim /root/copy-rpms.sh

内容如下:
#!/bin/bash
rpm -qa  > package-list.txt
old_rpms='/mnt/cdrom/Packages'
new_rpms='/tmp/iso/Packages'
while read line; do
    cp ${old_rpms}/${line}*.rpm ${new_rpms} || echo "${line} not exist..."
done < package-list.txt
rm -f package-list.txt

# bash /root/copy-rpms.sh

4. 提供Kickstart文件

# vim /tmp/iso/isolinux/ks.cfg

内容如下:
# Kickstart file automatically generated by anaconda.
# version=DEVEL

#-------------------------------------------------------------------------------
# Command section --- must include the required options.
#-------------------------------------------------------------------------------

# Text mode or graphical mode?
text
firstboot --disable

# Install or upgrade?
install

# Use CDROM installation media
cdrom

# Network information
# network --onboot yes --device eth0 --bootproto dhcp --noipv6
# network --hostname=localhost.localdomain

# System authorization information
auth --enableshadow --passalgo=sha512

# Root password
rootpw --iscrypted $6$tbGvXZz7E2ZHKiFw$krdZKp7WUY4iNierOFh4ZbV1FhroTuomNr71.0Ns52xARVrfr39DnU64sHqZv/K2iWUvMw0cI6DO64VgQWYRg0

# System services,禁用chronyd,防止与ntpd冲突
services --disabled="chronyd"

# System timezone
timezone Asia/Shanghai

# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'

# System language
lang en_US.UTF-8

# Firewall configuration
firewall --disabled

# SELinux configuration
selinux --disabled

# Installation logging level
logging --level=info

# Reboot after installation
reboot

#-------------------------------------------------------------------------------
# The %pre sections
#-------------------------------------------------------------------------------
%include /tmp/part-include
%pre
#!/bin/sh

#-------------------------------------------------------------------------------
# 非超微4U4Node机型时,设置系统盘标示符: 如果只有一个磁盘,则不论磁盘大小多大;
# 如果有多个磁盘,则按自定义的规则选择系统安装盘
#-------------------------------------------------------------------------------
function get_osdisk() {
    disk_count=$(fdisk -l | grep "Disk /dev/${osdisk_prefix}" | wc -l)
    if [ ${disk_count} -eq 1 ]; then
        osdisk=$(fdisk -l | grep "Disk /dev/${osdisk_prefix}" | cut -d: -f1 | cut -d/ -f3)
    else
        osdisk=$(fdisk -l | grep "Disk /dev/${osdisk_prefix}" | awk '{if ($3 >=50 && $3 < 2000) print $0}' | cut -d: -f1 | cut -d/ -f3)
    fi
}

#-------------------------------------------------------------------------------
# 设置swap大小,如果内存mem<=2G,则swap设置为与物理内存大小一样;
# 如果内存2G<mem<=16G,swap=8G; 如果内存mem>16G,则swap=16G
# 注意:/proc/meminfo中单位是kb,而kickstart中指定swap大小时单位是mb
#-------------------------------------------------------------------------------
function get_swap() {
    act_mem=$(cat /proc/meminfo | grep MemTotal | awk '{print $2}')
    if [ ${act_mem} -le $((2*1024*1024)) ]; then
        swap_size=$((2*1024))
    elif [ ${act_mem} -gt $((2*1024*1024)) ] && [ ${act_mem} -le $((16*1024*1024)) ]; then
        swap_size=$((8*1024))
    else
        swap_size=$((16*1024))
    fi
}

#-------------------------------------------------------------------------------
# 如果是超微4U4Node机型,使用了主板自带的BIOS RAID set
# 假设创建RAID 1的名称为Volume0,则它的磁盘标示符为Volume0_0,是/dev/md126的软连接
# 如果不是超微4U4Node机型,且有SATA或SCSI磁盘,则不论是否还有IDE磁盘,都使用sdx;
# 如果仅有IDE磁盘,则使用hdx
#-------------------------------------------------------------------------------
if $(grep -q 'md.*$' /proc/partitions); then
    osdisk="Volume0_0"
    get_swap    # 调用函数
elif $(grep -q 'sd.*$' /proc/partitions); then
    osdisk_prefix='sd'
    get_osdisk  # 调用函数
    get_swap    # 调用函数
elif $(grep -q 'hd.*$' /proc/partitions); then
    osdisk_prefix='hd'
    get_osdisk  # 调用函数
    get_swap    # 调用函数
else
    print "Lost disks, please install disks first!"
    exit 1
fi

#-------------------------------------------------------------------------------
# 生成/tmp/part-include临时文件
#-------------------------------------------------------------------------------
cat >> /tmp/part-include << EOF
# System bootloader configuration
bootloader --location=mbr --boot-drive=${osdisk}
# Partition clearing information
clearpart --all --initlabel
# Clear the Master Boot Record
zerombr
# Disk partitioning information
part biosboot --fstype="biosboot" --ondisk=${osdisk} --size=1  # 当磁盘大于2T时,以BIOS方式安装CentOS到GPT分区表的磁盘,需要创建1MB的biosboot分区
part /boot --fstype="xfs" --ondisk=${osdisk} --size=500
part /boot/efi --fstype="xfs" --ondisk=${osdisk} --size=500
part pv.01 --fstype="lvmpv" --ondisk=${osdisk} --size=1 --grow
volgroup centos --pesize=4096 pv.01
logvol swap  --fstype="swap" --size=${swap_size} --name=swap --vgname=centos
logvol /  --fstype="xfs" --grow --maxsize=102400 --size=1024 --name=root --vgname=centos
EOF

%end

#-------------------------------------------------------------------------------
# The %packages section
#-------------------------------------------------------------------------------
%packages
@^web-server-environment
@base
@core
@java-platform
@python-web
@web-server
kexec-tools
expect
screen

%end

# 启用kdump
%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

#-------------------------------------------------------------------------------
# The %post sections
#-------------------------------------------------------------------------------
%post
#!/bin/sh
# 设置Bash Color
echo 'PS1="\[\e[32;1m\][\u@\h \W]\\$ \[\e[0m\]"' >> /root/.bashrc
. /root/.bashrc

%end

特别注意:

kickstart文件的 %pre%post 前后不能有空格,否则会报错 Unable to open input kickstart file

1

说明:

  • 安装源要设置为cdrom
  • 取消了网络相关配置
  • 为兼容EFI增加了/boot/efi分区

5. 提供启动菜单Boot Menu

特别注意:

  • inst.ks=hd:LABEL=CentOS7:/isolinux/ks.cfg ,通过LABEL指定 kickstart 文件位置的方式,制作的ISO文件可以用于U盘启动(注意别少冒号)
  • inst.ks=cdrom:/isolinux/ks.cfg,这种指定 kickstart 文件位置的方式,制作的ISO文件只能用虚拟机挂载安装或者刻录成光盘安装,无法制作成U盘安装,因为U盘安装时,U盘不是光盘而被当作一个磁盘

2

卡在loop: module loaded,表示无法找到 kickstart 文件

5.1 MBR引导方式

# vim /tmp/iso/isolinux/isolinux.cfg

内容如下:
default vesamenu.c32
timeout 100

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 Linux 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 Install CentOS 7.3 BasicWebServer with Kickstart
  menu label ^Install CentOS 7.3 BasicWebServer with Kickstart
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7 inst.ks=hd:LABEL=CentOS7:/isolinux/ks.cfg

label Install CentOS 7.3 BasicWebServer with 4U4Node Kickstart
  menu label ^Install CentOS 7.3 BasicWebServer with 4U4Node Kickstart
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7 inst.ks=hd:LABEL=CentOS7:/isolinux/ks-4U4Node.cfg

label Install CentOS 7.3 Manual
  menu label ^Install CentOS 7.3 Manual
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7 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=CentOS7 rescue quiet

label local
  menu label Boot from ^local drive
  localboot 0xffff

menu end

背景图片splash.png已定制!

5.2 EFI引导方式(可选)

建议全拷贝原ISO文件,只是增加Kickstart文件,不缩减原ISO!

(1) 提供efi引导所需要的软件包

# rsync -a /mnt/cdrom/ /tmp/iso/

(2) 提供配置文件

# vim /tmp/iso/EFI/BOOT/grub.cfg

内容如下:
set default="0"

function load_video {
  insmod efi_gop
  insmod efi_uga
  insmod video_bochs
  insmod video_cirrus
  insmod all_video
}

load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2

set timeout=10
### END /etc/grub.d/00_header ###

search --no-floppy --set=root -l 'CentOS 7 x86_64'

### BEGIN /etc/grub.d/10_linux ###

menuentry 'Install CentOS 7.3 BasicWebServer with Kickstart' --class fedora --class gnu-linux --class gnu --class os {
  linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS7 inst.ks=hd:LABEL=CentOS7:/isolinux/ks.cfg
  initrdefi /images/pxeboot/initrd.img
}

menuentry 'Install CentOS 7.3 Manual' --class fedora --class gnu-linux --class gnu --class os {
  linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS7 quiet
  initrdefi /images/pxeboot/initrd.img
}

submenu 'Troubleshooting -->' {
  menuentry 'Install CentOS 7 in basic graphics mode' --class fedora --class gnu-linux --class gnu --class os {
    linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS7 xdriver=vesa nomodeset quiet
    initrdefi /images/pxeboot/initrd.img
  }
  menuentry 'Rescue a CentOS system' --class fedora --class gnu-linux --class gnu --class os {
    linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS7 rescue quiet
    initrdefi /images/pxeboot/initrd.img
  }
}

(3) 修改启动项

修改启动方式为UEFI

3

并且选择UEFI: xxx作为boot device来安装CentOS:

4

6. 重新生成repodata(可选)

如果是全拷贝原ISO文件,则不需要此步骤! 如果是精简处理后或Packages内容有变化时都要重新生成repodata。

repodata目录中的comps.xml文件包含了安装时用户所见到的与rpm相关的所有内容,它会检查Packages下的rpm包的依赖关系,安装时如果缺少依赖包,它会提示您哪个rpm包需要哪些依赖库,同时它的角色就是相当于图形安装时选择软件包那个环节。

comps.xml主要由三部分组成,首先是组列表,它描述了在安装过程中需要的不同的组(或组件),包括组名、组的描述和包含的rpm包;其次是组的层次结构,它将组分成不同的类,并定义了组的一个顺序,从而可以决定哪些组需要先安装;最后为一系列RPM包以及它们之间的依赖关系。

# yum -y install createrepo
# mkdir /tmp/iso/repodata
# cp /mnt/cdrom/repodata/*-comps.xml /tmp/iso/repodata/comps.xml
# cd /tmp/iso
# createrepo -g /tmp/iso/repodata/comps.xml ./
Spawning worker 0 with 146 pkgs
Spawning worker 1 with 146 pkgs
Spawning worker 2 with 146 pkgs
Spawning worker 3 with 146 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

编辑了comps.xml,要重新生成新的,因为comps.xml的sha值会改变,这样就会导致跟repomd.xml中所记录的不同,否则安装的时候会报错An error occurred umounting the CD. Please make sure you’are not accessing /mnt/source from the shell on tty2 an the click OK retry

至此,comps.xml文件和其他相关联的文件已被重新生成到repodata目录下。

注意:

如果新增或删除了Packages目录的rpm包,请重新生成comps.xml文件

7. 生成新的ISO镜像

1. 安装 genisoimage 工具
# yum -y install genisoimage

2. 生成同时支持EFI启动(需指定-eltorito-alt-boot -e images/efiboot.img -no-emul-boot)的ISO镜像
# genisoimage -o /root/CentOS-7.3-AutoInstall.iso -R -J -T -V CentOS7 -v -cache-inodes -joliet-long -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e images/efiboot.img -no-emul-boot /tmp/iso/

genisoimage命令参数说明:

  • -o 指定映像文件的名称
  • -b 指定在制作可开机光盘时所需的开机映像文件
  • -c 制作可开机光盘时,会将开机映像文件中的no-eltorito-catalog全部内容作成一个文件
  • -no-emul-boot 非模拟模式启动
  • -boot-load-size 4 设置载入部分的数量
  • -boot-info-table 在启动的图像中现实信息
  • -joliet-long 使用joliet格式的目录与文件名称,长文件名支持
  • -R或-rock 使用Rock RidgeExtensions
  • -J或-joliet 使用Joliet格式的目录与文件名称
  • -v或-verbose 执行时显示详细的信息
  • -T或-translation-table 建立文件名的转换表,适用于不支持Rock Ridge Extensions的系统上
  • -V CentOS7 指定光盘的label,对应isolinux.cfg中的LABEL

8. 嵌入md5值

将md5值嵌入ISO中,是为了防止复制过程中数据损坏,使用implantisomd5checkisomd5两个工具,可以将md5值嵌入ISO中并直接效验

1. 安装implantisomd5工具
# yum -y install isomd5sum

2. 嵌入md5值
# implantisomd5 /root/CentOS-7.3-AutoInstall.iso
Inserting md5sum into iso image...
md5 = 8381c616979541fbd25a235b2584e313
Inserting fragment md5sums into iso image...
fragmd5 = bd59eae2e92a472337edf37406fb5aeba251b6fd11d15b254346f54d8ed7
frags = 20
Setting supported flag to 0

3. 本地检查一次
# checkisomd5 /root/CentOS-7.3-AutoInstall.iso
Press [Esc] to abort check.

The media check is complete, the result is: PASS.

It is OK to use this media.

9. 测试

制作完成后可以用VMware虚拟机加载ISO引导自动部署,或者用UltralISO工具[启动]->[写入硬盘映像]制作U盘启动盘测试。

9.1 BIOS

5

9.2 EFI

6

7

未经允许不得转载: LIFE & SHARE - 王颜公子 » 定制CentOS-7.3全自动安装ISO

分享

作者

作者头像

Madman

如果博文内容有误或其它任何问题,欢迎留言评论,我会尽快回复; 或者通过QQ、微信等联系我

0 条评论

暂时还没有评论.

发表评论前请先登录