首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux系统自定义制作ISO安装镜像

Linux系统自定义制作ISO安装镜像

作者头像
全栈工程师修炼指南
发布2020-10-26 14:09:55
14.5K0
发布2020-10-26 14:09:55
举报

[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 实际案例

实践环境描述:

[[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) 创建并以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目录之中

$ 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包)

# 将当前安装后的系统安装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。

# 可能目录中不知一个*-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所在目录

$ 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安装后应答文件用于按照其内部设置进行自动化安装系统

# 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 文件位置和安装源位置
$ 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模式
$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分区)

#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 分区;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 前言简述
  • 0x01 实际案例
    • 1.基础准备与介绍
      • 2.一键安装自定义镜像
        • UEFI 镜像自安装制作
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档