专栏首页博客笔记Linux系统自定义制作ISO安装镜像

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

[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 分区;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CentOS6.9下制作Kickstart无人值守安装的自定义ISO镜像

    之前介绍过PXE+Kickstart实现无人值守自动化安装CentOS系统,现通过自定义制作ISO镜像的方式,制作出Kickstart无人值守一键安装的Cent...

    yuanfan2012
  • CentOS6.9下制作一键安装的ISO系统镜像

    rootpw --iscrypted $1$ymZM2uhc$2W.ZFogcbMq3qz5C7.Azd.

    yuanfan2012
  • 如何快速将 Linux 系统制作成 ISO 镜像文件?

    上次跟大家分享了一个《神器工具:新一代多系统启动 U 盘装机解决方案》这篇文章发出后,当天阅读量突破 2000,截止目前在看:66 个,留言:20 条,赞赏:7...

    杰哥的IT之旅
  • kvm虚拟化管理平台WebVirtMgr部署-完整记录(安装Windows虚拟机)-(4)

    一、背景说明  在之前的篇章中,提到在webvirtmgr里安装linux系统的vm,下面说下安装windows系统虚拟机的操作记录: 由于KVM管理虚拟机的硬...

    洗尽了浮华
  • 将ubuntu系统制作成iso镜像文件

            1.如果你是直接从cd压制iso文件的,执行 sudo umount /dev/cdrom dd if=/dev/cdrom of=file...

    静谧的小码农
  • VMware下安装CentOS

    此时我们是首次安装可以选择Test this media & install CentOS Linux 8.0.1905,或者选择Install CentOS ...

    后山de小猿
  • Vagrant Box 镜像准备:Packer 打包 Oracle Linux 7.9 系统

    使用 vagrant 的前提是要有 box 镜像盒子来初始化系统,网上有很多 box 可以下载,但是用自己的不是更香吗?自己动手,丰衣足食!

    Lucifer三思而后行
  • CentOS7全自动安装光盘制作详解

    系统安装的时候,按照ks.cfg文件的内容进行安装,我们把ks.cfg文件放到isolinux目录下:

    力哥聊运维与云计算
  • linux/OSX中“DD”命令制作ISO镜像操作系统安装U盘的方法

    Linux或者OS X系统中,使用“dd”命令可以直接在终端命令行模式下,制作ISO镜像的系统安装盘.

    砸漏
  • DIY一个linux安装启动盘

    其实我们身边好多人都是将linux装在虚拟机下做开发学习,但有时候还是不是很方便,想要安装一个纯linux系统,那么我们就要自己来制作安装盘,以前自己做过win...

    用户1605515
  • 电脑双系统--我想体验不一样的感觉

    目前互联网上主要有Windows、Uniux、Linux、Mac等不同功能特性的系统... ...废话不多说,教程马上开始。

    痴者工良
  • Vagrant Box 镜像准备:Packer 打包 Centos 6.10 系统

    使用 vagrant 的前提是要有 box 镜像盒子来初始化系统,网上有很多 box 可以下载,但是用自己的不是更香吗?自己动手,丰衣足食!

    Lucifer三思而后行
  • 小白博客 kali linux系统安装之物理机的详细安装步骤

    系统要求 Kali 系统对硬件有一些最基本的要求及建议。根据用户使用目的,你可以使有更高的配置。这篇文章中假设读者想要把 kali 安装为电脑上唯一的...

    奶糖味的代言
  • 使用Cubic备份或制作自定义通用型Ubuntu Live ISO镜像适用于 16.04 18.04 20.04 等

    如果需要备份或者制作自定义Ubuntu镜像,现在有非常简洁的方式啦!!!可以说适用于所有Ubuntu版本,但是我只测试了16.04 18.04 20.04。

    zhangrelay
  • 在DigitalOcean的服务器上用官方Kali镜像构建系统

    DigitalOcean是一家类似于AWS,Microsoft Azure,Google Cloud Platform等的云提供商。他们提供不同的Linux发行...

    FB客服
  • Vagrant Box 镜像准备:Packer 打包 Centos 7.9 系统

    使用 vagrant 的前提是要有 box 镜像盒子来初始化系统,网上有很多 box 可以下载,但是用自己的不是更香吗?自己动手,丰衣足食!

    Lucifer三思而后行
  • Vagrant Box 镜像准备:Packer 打包 Oracle Linux 6.10 系统

    使用 vagrant 的前提是要有 box 镜像盒子来初始化系统,网上有很多 box 可以下载,但是用自己的不是更香吗?自己动手,丰衣足食!

    Lucifer三思而后行
  • 神器工具:新一代多系统启动 U 盘装机解决方案

    在平时的工作中,比如我们需要重新安装一个 windows 操作系统,得通过第三方软件刻录镜像,随后将刻录好的镜像文件放置到 U 盘里面,通过启动设备并结合一些相...

    杰哥的IT之旅
  • 腾讯云服务器操作系统TencentOS安装与体验

    TencentOS Server( 又名Tencent Linux 简称Tlinux) 是腾讯针对云的场景研发的 Linux 操作系统,提供了专门的功能特性和性...

    yuanfan2012

扫码关注云+社区

领取腾讯云代金券