0x00 前言简述
在CentOS6系列版本系统在安装完成后会自动生成一个install.log
文件,然后在CentOS7系列版本中就变化为anaconda-ks.cfg
文件,它可以作为类似于Windows自动化安装的应答文件,只不过此处是用于Linux系统自动化安装的应答文件即无人值守自动化安装配置文件
;
Q:vmlinuz 与 initrd.img 介绍分别有何作用说明?
答:(1) vmlinuz 指的是可引导和可压缩的内核,作用:
进程管理、内存管理、文件管理、驱动管理、网络管理
。(2) initrd.img 是一个启动映象,放的是和启动相关的驱动模块。通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块。 其中最重要的就是根文件系统驱动模块,有了它才能挂载根文件系统,继而运行用户空间的第一个
应用程序init或者systemd
完成系统后续的启动;
0x01 实际案例
实践环境描述:
[root@localhost ~]# cat /etc/system-release CentOS Linux release 7.6.1810 (Core) [root@localhost ~]# uname -r 3.10.0-957.el7.x86_64 # 自定义基础镜像(本身自带rpm都比较少的) CentOS-7-x86_64-Minimal-2003.iso 1.01 GB (1,085,276,160 字节)
1.基础准备与介绍
# (1) 创建并以loop挂载ISO镜像 mkdir /media/iso && mount -o loop CentOS-7-x86_64-Minimal-1810.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目录之中
[root@localhost ~]# mkdir /mnt/iso #同步/media/iso下的文件到/mnt/iso路径下,除了Packages和repodata文件夹 [root@localhost ~]# rsync -a --exclude=Packages/ --exclude=repodata/ /media/iso/ /mnt/iso
Step 2.复制指定rpm包(剔除多余的rpm包)
# 将当前安装后的系统安装rpm包名称进行列出 [root@localhost ~]# 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。
# 可能目录中不知一个*-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所在目录
[root@localhost ~]# 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 [root@localhost ~]# vi +64 /mnt/iso/isolinux/isolinux.cfg
Step 5.Linux安装后应答文件用于按照其内部设置进行自动化安装系统
# 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值
$ 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) 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 文件位置和安装源位置 [root@localhost ~]# 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目录
# (2) images目录: efiboot.img 文件是UEFI模式 [root@localhost ~]# tree ./images/ ./images/ ├── efiboot.img ├── pxeboot │ ├── initrd.img │ ├── TRANS.TBL │ └── vmlinuz └── TRANS.TBL
Step 3.Packages目录软件包支持
# (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分区)
[root@localhost ~]# anaconda-ks.cfg
Step 5.UEFI打包方式和legacy模式不一样
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的软连接# 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 分区;