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

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

文档参考链接:https://cloud.tencent.com/developer/article/1729640

### 回答1: 在 Linux 下使用 yum 命令安装自定义 iso 的步骤如下: 1.将 iso 文件挂载到本地目录: ``` mount -o loop /path/to/iso /mnt/cdrom ``` 2.创建一个 repo 文件: ``` vi /etc/yum.repos.d/myrepo.repo ``` 3.在 myrepo.repo 文件中加入以下内容: ``` [myrepo] name=myrepo baseurl=file:///mnt/cdrom enabled=1 gpgcheck=0 ``` 其中,baseurl 指向刚才挂载的 iso 文件的目录。 4.运行 yum 命令安装软件包: ``` yum install package_name ``` 其中,package_name 是你想要安装的软件包名称。 5.卸载 iso 文件: ``` umount /mnt/cdrom ``` 这样就可以使用 yum 命令安装自定义 iso 了。 ### 回答2: 在Linux下,yum是一种包管理器软件,用于安装、升级和删除软件包。通常情况下,yum会从预配置的软件源中获取安装包进行安装。但是如果需要安装自定义ISO文件,可以通过一些额外的步骤来完成。 首先,将ISO文件复制到Linux系统中的一个目录下,例如/var/tmp目录。 然后,使用mount命令将ISO文件挂载到一个临时目录: ``` sudo mount -o loop /var/tmp/custom.iso /mnt ``` 这将把ISO文件的内容挂载到/mnt目录下。 接下来,创建一个新的yum存储库配置文件。在/etc/yum.repos.d/目录下创建一个新的文件,例如custom.repo: ``` sudo vi /etc/yum.repos.d/custom.repo ``` 在该文件中添加以下内容: ``` [custom] name=Custom ISO baseurl=file:///mnt enabled=1 gpgcheck=0 ``` 保存并退出。 最后,运行yum命令安装需要的软件包: ``` sudo yum install package-name ``` 这样yum将会从自定义ISO文件中安装软件包。 安装完成后,可以使用umount命令将ISO文件卸载: ``` sudo umount /mnt ``` 通过上述步骤,可以使用yum命令安装自定义ISO文件中的软件包。 ### 回答3: 在Linux系统中,可以使用yum命令来安装软件和包,但是默认情况下,yum仅从官方软件源或已配置的镜像源中获取软件包进行安装。如果要安装自定义ISO镜像,可以按照以下步骤进行操作: 1. 首先,将自定义ISO镜像文件上传到Linux系统,可以使用FTP、scp或其他文件传输工具进行上传。 2. 确保自定义ISO镜像文件所在的路径可以被系统访问到。可以将ISO镜像文件放在一个特定目录下,比如/home/username/iso目录下。 3. 打开终端窗口,并使用root用户或者拥有sudo权限的用户登录。 4. 输入以下命令,挂载ISO镜像文件到一个临时的挂载点: ``` sudo mount -o loop /home/username/iso/your_custom_iso.iso /mnt/iso ``` 5. 输入以下命令,将挂载点设置为yum的软件源: ``` sudo yum-config-manager --add-repo=file:///mnt/iso ``` 6. 输入以下命令,清除并重建yum缓存: ``` sudo yum clean all sudo yum makecache ``` 7. 现在,可以使用yum命令来安装自定义ISO中的软件包了。例如,要安装名为your_package的软件包,可以输入以下命令: ``` sudo yum install your_package ``` 8. 安装完成后,可以使用umount命令卸载ISO镜像文件: ``` sudo umount /mnt/iso ``` 通过以上步骤,你可以在Linux下使用yum命令安装自定义ISO镜像中的软件包。请注意,在安装完成后,建议卸载ISO镜像文件,以释放系统资源和空间。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值