[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 实际案例 实践环境描述:
[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 [root@localhost ~]$ cat /etc/system-release CentOS Linux release 7.8.2003 (Core) [root@localhost ~]$ uname -r 3.10.0-1127.el7.x86_64 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 mkdir /media/iso && mount -o loop CentOS-7-x86_64-Minimal-2003.iso /media/iso cd /media/iso && tree -L 1. ├── CentOS_BuildTag ├── EFI ├── EULA ├── GPL ├── images ├── isolinux ├── LiveOS ├── Packages ├── repodata ├── RPM-GPG-KEY-CentOS-7 ├── RPM-GPG-KEY-CentOS-Testing-7 └── TRANS.TBL discinfo .treeinfo ks.cfg 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 $ /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 -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 cp /media/iso/repodata/cca56f3cffa18f1e52302dbfcf2f0250a94c8a37acd8347ed6317cb52c8369dc-c7-x86_64-comps.xml /mnt/iso/repodata/comps.xml cd /mnt/iso/ && createrepo -g repodata/comps.xml ./[root@localhost iso]$ls repodata/
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 cat > /mnt/iso/ks.cfg <<'END' auth --enableshadow --passalgo=sha512 cdrom graphical firstboot --enable ignoredisk --only-use=sda keyboard --vckeymap=cn --xlayouts='cn' lang zh_CN.UTF-8 network --bootproto=dhcp --device=eth0 --ipv6=auto --activate network --hostname=localhost.localdomain rootpw --iscrypted $6 $BJIQmFkQ $TnJMVbBoWvE4fBkJ30iJlQwDLxV3wLaZ8pVqrh7N5m0mTWD .vNdRw/uEs8Wu7IB.sfvzBYZUweM6Rd0M43bm61 services --enabled="chronyd" timezone Asia/Shanghai --isUtc bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda autopart --type =lvm 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 $ /usr/bin/implantisomd5 /mnt/iso/CentOS-minimal-7-custom.iso
3.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 $tree EFI/EFI/ ├── BOOT │ ├── BOOTIA32.EFI │ ├── BOOTX64.EFI │ ├── fonts │ │ ├── TRANS.TBL │ │ └── unicode.pf2 │ ├── grub.cfg │ ├── grubia32.efi │ ├── grubx64.efi │ ├── mmia32.efi │ ├── mmx64.efi │ └── TRANS.TBL └── TRANS.TBL $ vi ./EFI/BOOT/grub.cfg 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=keepinsmod gzio insmod part_gpt insmod ext2 set timeout=60search --no-floppy --set =root -l 'CentOS 7 x86_64' 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 } 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 $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 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分区)
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 -eltorito-alt-boot -bimages/efiboot.img -no-emul-boot 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 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 分区;