[TOC]

0x00 前言简述

在CentOS6系列版本系统在安装完成后会自动生成一个install.log文件,然后在CentOS7系列版本中就变化为anaconda-ks.cfg文件,它可以作为类似于Windows自动化安装的应答文件,只不过此处是用于Linux系统自动化安装的应答文件即无人值守自动化安装配置文件;

Q:vmlinuz 与 initrd.img 介绍分别有何作用说明?

答:(1) vmlinuz 指的是可引导和可压缩的内核,作用:进程管理、内存管理、文件管理、驱动管理、网络管理
(2) initrd.img 是一个启动映象,放的是和启动相关的驱动模块。通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块。
其中最重要的就是根文件系统驱动模块,有了它才能挂载根文件系统,继而运行用户空间的第一个应用程序init或者systemd完成系统后续的启动;


0x01 实际案例

实践环境描述:

1
2
3
4
5
6
7
8
[[email protected] ~]$ cat /etc/system-release
CentOS Linux release 7.8.2003 (Core)
[[email protected] ~]$ uname -r
3.10.0-1127.el7.x86_64

# 自定义基础镜像(本身自带rpm都比较少的)
CentOS-7-x86_64-Minimal-2003.iso
1.01 GB (1,085,276,160 字节)


1.基础准备与介绍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# (1) 创建并以loop挂载ISO镜像
mkdir /media/iso && mount -o loop CentOS-7-x86_64-Minimal-2003.iso /media/iso
# mount: /dev/loop0 写保护,将以只读方式挂载

# (2) 进行入镜像挂载的目录并查看里面文件
cd /media/iso && tree -L 1
.
├── CentOS_BuildTag # 系统版本构建标签 20200420-1800
├── EFI # UEFI 启动模式下必须文件,Legacy模式下是非必须文件
├── EULA # 最终用户许可协议
├── GPL # 通用公用许可证/执照(General Public License)
├── images # 启动映像文件
├── isolinux # 存放光盘启动时的安装界面信息
├── LiveOS # 存储了映像文件
├── Packages # 系统自带rpm包软件
├── repodata # 系统rpm包metadate源数据
├── RPM-GPG-KEY-CentOS-7 # rpm的GPG校验公钥
├── RPM-GPG-KEY-CentOS-Testing-7 # 同上
└── TRANS.TBL # 提供比ISO9660标准约定的基本文件名更加灵活的文件名, 用简约符号代表目录、文件、链接;
discinfo #文件是安装价质的识别信息
.treeinfo #文件是系统版本,创建时间及文件目录树结构信息
ks.cfg #文件是无人值守自动化安装配置文件


# (3) 下载镜像制作的相关软件
mv /etc/yum.repos.d/CentOS-Base.repo{,.bak}
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache
yum -y install anaconda repodata createrepo mkisofs rsync


2.一键安装自定义镜像

Step 1.建立ISO生成目录和同步镜像到/mnt/iso目录之中

1
2
3
$ mkdir /mnt/iso 
#同步/media/iso下的文件到/mnt/iso路径下,除了Packages和repodata文件夹
$ /usr/bin/rsync -a --exclude=Packages/ --exclude=repodata/ /media/iso/ /mnt/iso

Step 2.复制指定rpm包(剔除多余的rpm包)

1
2
3
4
5
6
7
8
# 将当前安装后的系统安装rpm包名称进行列出
$ rpm -qa > rpm.txt && mkdir /mnt/iso/{Packages,repodata}
SRCDIR=/media/iso/Packages
DSTDIR=/mnt/iso/Packages
while read LINE
do
cp ${SRCDIR}/${LINE}.rpm ${DSTDIR}/ || echo "Error: ${LINE}"
done < rpm.txt

Step 3.进入/media/iso/repodata 目录将”*-x86_64-comps.xml”文件拷贝到/mnt/iso/repodata路径下,并重命名成comps.xml。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 可能目录中不知一个*-x86_64-comps.xml请根据需求进行选择;
# cp /media/iso/repodata/83b61f9495b5f728989499479e928e09851199a8846ea37ce008a3eb79ad84a0-c7-minimal-x86_64-comps.xml /mnt/iso/repodata/comps.xml
cp /media/iso/repodata/cca56f3cffa18f1e52302dbfcf2f0250a94c8a37acd8347ed6317cb52c8369dc-c7-x86_64-comps.xml /mnt/iso/repodata/comps.xml

#PS:如果有新增或删除了Packages目录的RPM包,请重新生成comps.xml文件
#切换到/mnt/iso/路径下生成comps.xml文件
cd /mnt/iso/ && createrepo -g repodata/comps.xml ./
# Spawning worker 0 with 192 pkgs
# Spawning worker 1 with 191 pkgs
# Workers Finished
# Saving Primary metadata
# Saving file lists metadata
# Saving other metadata
# Generating sqlite DBs
# Sqlite DBs complete
[[email protected] iso]$ls repodata/
# 499fdea70ea25eda90e3d37ce84518c41673e09c129af2a0988138b008c0138c-other.sqlite.bz2 d4de4d1e2d2597c177bb095da8f1ad794d69f76e8ac7ab1ba6340fdd0969e936-comps.xml.gz
# 7b2375dfbe14db6dc4e172df41e8a51bf3d1a2fafe7cdb2d802bf30528e7657b-filelists.sqlite.bz2 e64bcd7401a518370ce79f75713b43df01252dbbecf6d888a0e6e1c37d423640-primary.sqlite.bz2
# 83b61f9495b5f728989499479e928e09851199a8846ea37ce008a3eb79ad84a0-comps.xml f0c55932043686281f78635817f4a98a43db3fe3ba14df2d8b64e2a52af708c9-other.xml.gz
# 89bc446b7889e2f5409c3d9ebe33043e1a5974b180d4e2362a5d517abe29cf9a-filelists.xml.gz repomd.xml
# d163815c6cd0144b15c7bce3cb06c255aaa4c205bfe2b278517ade135e4010ef-primary.xml.gz

Step 4.在指定构建镜像的目录中 isolinux/isolinux.cfg 文件修改指定成ks.cfg所在目录

1
2
3
4
5
6
7
$ grep -a3 -n "append" isolinux/isolinux.cfg
61-label linux
62- menu label ^Install CentOS 7
63- kernel vmlinuz
64: append initrd=initrd.img inst.ks=cdrom:/ks.cfg inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet

$ vi +64 /mnt/iso/isolinux/isolinux.cfg

Step 5.Linux安装后应答文件用于按照其内部设置进行自动化安装系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# minimal 最小安装 参考:/root/anaconda-ks.cfg

cat > /mnt/iso/ks.cfg <<'END'
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512

# Use CDROM installation media
cdrom

# Use graphical install
graphical

# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=cn --xlayouts='cn'
# System language
lang zh_CN.UTF-8

# Network information
network --bootproto=dhcp --device=eth0 --ipv6=auto --activate
network --hostname=localhost.localdomain

# Root password
# password = test123
rootpw --iscrypted $6$BJIQmFkQ$TnJMVbBoWvE4fBkJ30iJlQwDLxV3wLaZ8pVqrh7N5m0mTWD.vNdRw/uEs8Wu7IB.sfvzBYZUweM6Rd0M43bm61
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc
# System bootloader configuration
# 采用 mbr 分区表
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
# Partition clearing information
clearpart --none --initlabel

%packages
@^minimal
@core
chrony
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
END

Step 6.生成一个ISO镜像文件,便于刻录到光盘中进行安装并且生成ISO文件MD5值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ ls /mnt/iso
CentOS_BuildTag EFI EULA GPL images isolinux ks.cfg LiveOS Packages repodata RPM-GPG-KEY-CentOS-7 RPM-GPG-KEY-CentOS-Testing-7 TRANS.TBL
$ genisoimage -joliet-long -V CentOS7 -o CentOS-7-2.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -cache-inodes -T -eltorito-alt-boot -e images/efiboot.img -no-emul-boot /mnt/iso
# Total translation table size: 107955
# Total rockridge attributes bytes: 47780
# Total directory bytes: 81920
# Path table size(bytes): 140
# Done with: The File(s) Block(s) 496155
# Writing: Ending Padblock Start Block 496258
# Done with: Ending Padblock Block(s) 150
# Max brk space used 85000
# 496408 extents written (969 MB)

$ /usr/bin/implantisomd5 /mnt/iso/CentOS-minimal-7-custom.iso
# Inserting md5sum into iso image...
# md5 = 9e253ac2c07e857439713d29ad89473c
# Inserting fragment md5sums into iso image...
# fragmd5 = abd38349cd862634484b2b81ce84fd6b62c2af5c245f13192553e193b264
# frags = 20
# Setting supported flag to 0


UEFI 镜像自安装制作

描述:以下是制作UEFI启动安装的一些重要修改配置步骤;

Step 1.UEFI 安装模式下重要文件和目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# (1) EFI 目录
$tree EFI/
EFI/
├── BOOT
│   ├── BOOTIA32.EFI
│   ├── BOOTX64.EFI
│   ├── fonts
│   │   ├── TRANS.TBL
│   │   └── unicode.pf2
│   ├── grub.cfg # grub BootLoader引导程序修改
│   ├── grubia32.efi
│   ├── grubx64.efi
│   ├── mmia32.efi
│   ├── mmx64.efi
│   └── TRANS.TBL
└── TRANS.TBL

# 在grub.cfg里修改引导文件指明 ks.cfg 文件位置和安装源位置
$ vi ./EFI/BOOT/grub.cfg
# 默认选择 Test this media & install CentOS 7
set default="1"
# 函数声明
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=60

### END /etc/grub.d/00_header ###
search --no-floppy --set=root -l 'CentOS 7 x86_64'
### BEGIN /etc/grub.d/10_linux ###
# BootLoader 显示菜单
# 静默安装: inst.ks=cdrom://ks_efi.cfg
menuentry 'Install CentOS 7' --class fedora --class gnu-linux --class gnu --class os {
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 inst.ks=cdrom:/ks_efi.cfg quiet
initrdefi /images/pxeboot/initrd.img
}
menuentry 'Test this media & install CentOS 7' --class fedora --class gnu-linux --class gnu --class os {
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet
initrdefi /images/pxeboot/initrd.img
}
# Bootloader 子菜单
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=CentOS\x207\x20x86_64 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=CentOS\x207\x20x86_64 rescue quiet
initrdefi /images/pxeboot/initrd.img
}
}


Step 2.images目录

1
2
3
4
5
6
7
8
9
# (2) images目录: efiboot.img 文件是UEFI模式
$tree ./images/
./images/
├── efiboot.img
├── pxeboot
│   ├── initrd.img
│   ├── TRANS.TBL
│   └── vmlinuz
└── TRANS.TBL


Step 3.Packages目录软件包支持

1
2
3
4
5
6
7
8
9
10
11
12
# (3) Packages目录:UEFI模式需要有如下包支持(必须的)
tree Packages/ | egrep "grub2-efi|grub2-tools|grub2-tools-extra|grub2-tools-minimal|grub2-common|shim|mokutil|efivar-libs|efibootmgr"
├── efibootmgr-17-2.el7.x86_64.rpm
├── efivar-libs-36-12.el7.x86_64.rpm
├── grub2-common-2.02-0.81.el7.centos.noarch.rpm
├── grub2-efi-ia32-2.02-0.81.el7.centos.x86_64.rpm
├── grub2-efi-x64-2.02-0.81.el7.centos.x86_64.rpm
├── grub2-tools-2.02-0.81.el7.centos.x86_64.rpm
├── grub2-tools-extra-2.02-0.81.el7.centos.x86_64.rpm
├── grub2-tools-minimal-2.02-0.81.el7.centos.x86_64.rpm
├── mokutil-15-2.el7.centos.x86_64.rpm
├── shim-x64-15-2.el7.centos.x86_64.rpm


Step 4.KS文件修改legacy和UEFI模式ks文件的区别是磁盘分区(UEFI模式多了一个/boot/efi分区)

1
#anaconda-ks.cfg


Step 5.UEFI打包方式和legacy模式不一样

1
2
3
genisoimage -v -cache-inodes -joliet-long -R -J -T \
-o CentOS-7_x86_64-UEFI.iso -b isolinux/isolinux.bin -c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -b images/efiboot.img -no-emul-boot -input-charset


Step 6.自此一个支持UEFI模式安装的ISO就制作完成了

注意事项:

  • (1) 制作对应版本的镜像建议使用对应版本的系统进行制作ISO,比如CentOS6.X不能制作CentOS7.x版本由于两者系统的genisoimage命令版本不一致; 其实最早时候Linux系统使用cdrtools工具来管理 iso 及光盘, mkisofs 是 cdrtools 里面的一个工具然后cdrtools开发者将其从GPL修改为CDDL许可开源社区又推出了一套基于 GPL 的工具cdrkit,kisofs 也被 genisoimage 去掉现在系统中的 mkisofs 实际是 genisoimage的软连接
    1
    2
    3
    4
    5
    6
    # EFI 启动参数
    -eltorito-alt-boot -bimages/efiboot.img -no-emul-boot
    # 6 版本
    mkisofs -o CentOS-6.5_x86_64.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T /mnt/iso
    # 7 版本
    genisoimage -o CentOS-minimal-7-custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T /mnt/iso
  • (2) 在CentOS6.5以下系统版本不支持EFI引导方式;
  • (3) 如果构建的自定义镜像在安装时提示找不到disc时候,是是因为iso目录内缺少隐藏文件.discinfo(copy 默认会忽略拷贝.开头的文件),解决方式即复制原有的.discinfo文件。
  • (4) 为了同时兼容mbr和efi方式,需同时创建 /boot 和 /boot/efi 分区;