ISO镜像的制作
Posted rtoax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ISO镜像的制作相关的知识,希望对你有一定的参考价值。
文档修改日志
日期 | 修改内容 | 修改人 | 备注 |
---|---|---|---|
2021年11月9日 | 创建 | 荣涛 | |
2021年11月10日 | rootfs.img的修改 | 荣涛 | cpio指令 |
1. 引言
2. ISO制作
2.1. 挂载
$ sudo mount CentOS-7-x86_64-Minimal-2009.iso original-iso/
2.2. 拷贝镜像
# 为新的镜像创建文件夹
$ mkdir new-iso
# 同步拷贝
$ rsync -a original-iso/ new-iso/
# 查看
$ tree -L 2
.
├── CentOS-7-x86_64-Minimal-2009.iso
├── new-iso
│ ├── CentOS_BuildTag
│ ├── EFI
│ ├── EULA
│ ├── GPL
│ ├── images
│ ├── isolinux
│ ├── LiveOS
│ ├── Packages
│ ├── repodata
│ ├── RPM-GPG-KEY-CentOS-7
│ ├── RPM-GPG-KEY-CentOS-Testing-7
│ └── TRANS.TBL
└── original-iso
├── CentOS_BuildTag
├── EFI
├── EULA
├── GPL
├── images
├── isolinux
├── LiveOS
├── Packages
├── repodata
├── RPM-GPG-KEY-CentOS-7
├── RPM-GPG-KEY-CentOS-Testing-7
└── TRANS.TBL
2.3. 替换文件
替换编译 kerel 后已重新制作的 install.img,initrd.img 和 vmlinuz 文件。
2.4. 修改rootfs
修改rootfs可选项。
查看rootfs.img文件格式:
$ file rootfs.img
rootfs.img: ASCII cpio archive (SVR4 with no CRC)
列出rootfs.img文件中的内容:
$ cpio -t -F rootfs.img
root.squashfs
etc
etc/coreos-live-rootfs
fedora-coreos-34.20211016.3.0-metal.x86_64.raw.osmet
fedora-coreos-34.20211016.3.0-metal4k.x86_64.raw.osmet
1318915 blocks
将文件root.squashfs
提取出来:
$ sudo cpio -idvu -F rootfs.img root.squashfs
将root.squashfs
解压:
$ sudo unsquashfs root.squashfs
添加你想要添加的文件即可。
然后,生成新的文件root.squashfs
:
$ sudo mksquashfs squashfs-root/ root.squashfs
再将生成的文件添加到rootfs.img中:
$ sudo ls root.squashfs | cpio -o -F rootfs.img
至此,对rootfs.img的修改就完成了。
2.5. 修改信息
修改 grub.cfg 等文件中的标识信息。
2.6. 拷贝RPM
拷贝编译的 kernel rpm 文件到Packages目录中,并刷新 repodata 文件。
2.7. 制作ISO镜像
# 可以使用命令
$ sudo mkisofs -o destination-filename.iso /home/username/folder-name
# 如果发现,生成的ISO文件中文件名大小写字母发生变化,添加 -r 选项
$ sudo mkisofs -r -o destination-filename.iso /home/username/folder-name
# 比较全的命令
$ sudo genisoimage -r -J -T -v -V fedora-coreos-34.20211016.3.0 -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e images/efiboot.img -no-emul-boot -o my.iso myiso/
2.8. 插入 md5sum
3. 参考链接
- 重新制作安装 ISO
- How to Create an ISO File in Linux
- 定制自己的CentOS安装光盘ISO
- Live CD
- 从CentOS ISO 文件到CCLinux ISO文件的制作方法
- linux下cpio命令使用
- How to Download, Fix, and Update Isolinux.bin
- 如何下载、修复并更新 Isolinux.bin
4. 附录
4.1. CPIO指令指南
cpio是一个非常古老的归档工具。已逐渐被tar替代,但是有些功能是tar不存在的,所以还是分享下它的用法。
cpio - copy files to and from archives
cpio用于创建、解压归档文件,也可以对归档文件执行拷入拷出的动作,即向归档文件中追加文件,或从归档文件中提取文件。它也支持tar格式的归档文件,但是对压缩后的tar(如.tar.gz格式)就没法支持了,cpio毕竟不会调用对应的(解)压缩工具。
cpio一般从标准输入获取数据,写入到标准输出,所以一般会结合管道、输入重定向、输出重定向使用。
cpio有三种运行模式:
Copy-out模式:此模式下,cpio将向归档文件中拷入文件,即进行归档操作,所以成为归档模式。它会从标准输入中读取待归档的文件,将它们归档到目标目标中,若未指定归档的目标,将归档到标准输出中。在copy-out模式下,最典型的是使用find来指定待归档文件,在使用find时,最好加上"-depth"以尽可能减少可能出现的问题,例如目录的权限问题
Copy-in模式:此模式下,cpio将从归档文件中提取文件,或者列出归档文件中的文件列表。它将从标准输入中读取归档文件。任意cpio的非选项参数都将认为是shell的glob通配pattern,只有文件名匹配了指定模式时才会从中提取出来或list出来。在cpio中,通配符不能匹配到".“或”/",所以如有需要,必须显式指定".“或”/"。如果没有指定匹配模式,则解压或列出所有文件。
Copy-pass模式:此模式下,cpio拷贝一个目录树(即目录中所有文件)到另一个目录下,并在目标目录下以同名的子目录存在。copy-pass模式是copy-in模式再copy-out模式的结合,它中途没有涉及到任何归档行为。这是cpio的一个特殊用法。它从标准输入中读取待拷贝内容,然后将它们复制到目标路径下。
对于cpio这个归档工具来说,它和其它命令有一个区别:在cpio命令行中给出的非选项参数都会认为是pattern。非选项参数的意思是这个参数不是为选项指定的参数。如cpio -t abc <a.cpio中,"-t"选项的功能是列出文件列表,它不需要参数,但后面给定了abc,则表示列出匹配abc的文件或目录。
选项说明:
- -o:(–create)指定运行为copy-out模式,即归档模式
- -i:(–extract)指定运行为copy-in模式,即提取模式
- -p:(–pass-through)指定运行为copy-pass模式,即目录拷贝模式
- -t:(–list)列出归档文件中的文件列表
4.1.1. 常用操作
- 备份:
cpio -ocvB > [ file | device ]
- 还原:
cpio -ivcdu > [ file | device ]
- 查看:
cpio -ivct >[ file | device ]
cpio类型的判断
$ file rootfs.img
rootfs.img: ASCII cpio archive (SVR4 with no CRC)
4.1.2. 列出文件列表
列出归档文件中的文件列表
# 这将会递归列出tree.cpio中的所有文件
cpio -t -F tree.cpio
# 或者
cpio -t < tree.cpio
# 应该对其指定一个匹配模式
# 列出tree.cpio中所有/root/目录下的内容
cpio -t -F tree.cpio /root/*
# 或者
cpio -t /root/* < tree.cpio
# 只列出隐藏文件
cpio -t -F tree.cpio /root/.*
# 既列出隐藏文件,也列出普通文件
cpio -t -F tree.cpio /root/.*,*
4.1.3. 打包cpio文件
找出当前目录下的所有文件,然后将它们打包进一个cpio压缩包文件
$ find . -depth | cpio -ocvB > backup.cpio
#或者
$ find . -depth-print | cpio -ocvB > backup.cpio
注意:cpio 建立起来的归档文件包括文件头和文件数据两部分。文件头包含了对应文件的信息。如文件的 UID,GID,连接数以及文件大小等。其好处是可以保留硬连接,在恢复时默认情况下保留时间戳,无文件名称长度的限制
4.1.4. 解压提取cpio文件
注意:cpio只能提取文件时只能提取到当前目录下。
# 提取/root/下的文件到当前目录,同名文件将提取失败
cpio -idv -F tree.cpio /root/
# 使用"-u"选项,这将覆盖已存在动作
cpio -idvu -F tree.cpio new.txt
从cpio压缩包中的解压出文件
# 将cpio包中的文件解压并输入标准输出
cpio -icvu --to-stdout < grub.cpio
# 解压到原始位置,解压出来的每个文件的时间属性改为当前时间
cpio --absolute-filenames -icvu < test.cpio
# 解压到原始位置,同时不改变解压出来的每个文件的时间属性)
cpio --absolute-filenames -icvum < test.cpio
# 解压到当前目录下
cpio -icvu < test.cpio
# 或者
cpio -icvum < test.cpio
cpio -ivcdu < initrd.img
注意:既然解压到标准输出,所以就不能使用-d参数了。
4.1.5. 向归档文件中追加文件
"-A
"选项。
# 这将会把/root/new.txt下的文件追加到tree.cpio中,由于tree.cpio中已经有了/root目录
# 所以追加后路径为tree.cpio中的/root/new.txt
# 而如果tree.cpio中没有待追加文件所在的目录,则会新建一个目录。
ls /root/new.txt | cpio -oA -F tree.cpio
# 在tree.cpio中追加一个/boot目录,它和/root目录是同级别的
# 好像没有办法直接指定追加的目标路径
find /boot -depth -print0 | cpio -oA -F tree.cpio
将当前目录下名为inittab文件加入initrd.cpio包中
# 命令1
find . -name inittab -depth | cpio -ovcB -A -F initrd.cpio
# 命令2
find . -name inittab -depth | cpio -ovcB -A -O initrd.cpio
# 命令3(--quit:表示不显示复制块)
find . -name inittab -depth | cpio -ovcB -A --quiet -O initrd.cpio
# (不忽略文件列表清单的文件名最前面的“/")
cpio --absolute-filenames -vtc < boot.cpio
# (默认是忽略文件列表清单的文件中最前面的)
cpio --no-absolute-filenames -vtc < boot.cpio
4.1.6. 其他命令
在解包cpio时,对解包出来的文件进行交互的更名
cpio -icvdu -r < grub.cpio
复制文件并更改文件的属主与属组
find . -depth| cpio -R ruanxi:ruanxi -pL /backup/
4.2. Squashfs操作
# 提取
unsquashfs root.squashfs
# 打包
mksquashfs squashfs-root/ squashfs.img
4.3. 如何制作一个可启动的CD
https://wiki.syslinux.org/wiki/index.php?title=ISOLINUX
用SYSLINUX或ISOLINUX制作启动U盘或光盘 SYSLINUX/ISOLINUX 是专门用来引导可移动介质的轻量级引导程序,因为这样的介质通常不会固定只针对一种硬件。我们主要介绍以下ISOLINUX 引导安装程序。ISOLINUX其实是一个简单的Linux系统。
ISOLINUX 是 Linux/i386 的引导加载程序,可在“无仿真”模式下在 ISO 9660/El Torito CD-ROM 上运行。 这避免了创建空间有限(对于“软盘仿真”)或兼容性问题(对于“硬盘仿真”)的“仿真磁盘映像”的需要。
- 确保有mkisofs,并且版本比较新;
- 下载syslinux,网址https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/
- 创建一个文件夹,名字为
CD_root
,当作ISO镜像主文件树- 拷贝你想放到CD上的所有文件到这个文件夹;
- 在
CD_root
创建名字为isolinux
的文件夹; - 在
CD_root
创建images
和kernel
文件夹;- 拷贝任何你想启动到的软盘镜像;
- 从syslinux存档中拷贝
"[bios/]memdisk/memdisk"
到kernel
文件夹;
- 使用下main的命令生成镜像:
mkisofs -r -o output.iso \\
-b isolinux/isolinux.bin -c isolinux/boot.cat \\
-no-emul-boot -boot-load-size 4 -boot-info-table \\
CD_root
文件boot.cat
将自动生成。
4.3.1. isolinux.cfg示例
isolinux.cfg
display boot.txt
prompt 1
default 1
# Boot other devices
label a
localboot 0x00
label b
localboot 0x80
label c
localboot -1
# PC-DOS
label 1
kernel /kernel/memdisk
append initrd=/images/tools.imz
# Darik´s Boot and Nuke
label 2
kernel /kernel/memdisk
append initrd=/images/bootnuke.imz
# MemTest
label 3
kernel /kernel/memtp170
boot.txt
☼09a☼07 - Boot A:
☼09b☼07 - Boot first HDD
☼09c☼07 - Boot next device
☼091☼07 - ☼0fPC-DOS☼07
☼092☼07 - Darik's Boot and Nuke
☼093☼07 - memtest86
4.4. isolinux.bin的下载,修改和更新
Isolinux.bin 被视为一种 Binary Disk Image 文件。 它最常用于 VMware 开发的 VMware Workstation 12.5.5。 它使用 BIN 文件扩展名,被视为可执行应用程序(二进制磁盘映像)文件。
Isolinux.bin 于 2019 年 9 月 19 日首次在 Windows 10 操作系统中使用 VMWare Workstation Player 15.5.1 发布。 VMware Workstation 12.5.5 的最新文件更新发布于 2017 年 4 月 4 日 [文件版本 12.5.5]。 Isolinux.bin 与 VMware Workstation 12.5.5 和 VMWare Workstation Player 15.5.1 打包在一起。
请继续阅读以找到正确的 isolinux.bin 文件版本下载(免费)、详细的文件信息和 BIN 文件疑难解答说明。
4.5. initrd
initrd = init ramdisk
, 顾名思义,就是在启动时使用的一个内存虚拟磁盘,它是系统广泛的硬件支持性的必需品。
我们知道,Linux 的驱动程序是内核的一部分,它们提供了硬件向上层的抽象接口,Linux 内核的核心子系统 — 虚拟文件系统部分的工作强烈依赖于底层硬件驱动程序的支持,在启动过程当中,当某些必备的驱动程序无法使用的时候,比如 EXT2 文件系统、IDE 硬盘适配器等无法工作的时候,系统启动将就此中止,发生所谓的 Kernel Panic,这也是初学者编译内核最常遇到的困难。
然而,我们当然不能将所有的驱动都编译到内核当中去,因为我们不能无限制地加大内核的尺寸,这对于系统资源,尤其是引导过程中非常有限的可用存储资源是难以承受的 .
我们可以把很多驱动程序编译成模块,随用随加载 极少数情况,某些模块是相互冲突的,比如 2.4 内核的某些版本之中,reiserfs 和 ext3 两种驱动不能同时被编译到内核当中。 所以,我们只能在内核中放入必要的驱动程序,其余的不那么需要的部分编译成模块放到 /lib/modules/uname -r
/ 之中,在需要的时候会被加载。
但是,对于具有通用性的内核,是很难论断出哪几种驱动程序才是真正必须的,究竟是 Intel 的 IDE 磁盘控制器还是 AMD/nVidia 的,抑或是 VIA 的,乃至光纤通道SCSI 磁盘……是阿,这真是个很困扰人的问题,没有一个驱动可以在占用绝对少的空间的前提下应付所有的设备,于是,我们退而求其次,寻求一个中间介质 — ramdisk
在内核启动前,引导程序首先在内存之中构建一个 ramdisk,成为一个基本文件系统,然后 Linux 内核以此为自己的根文件系统启动,这样的好处是可以不必理会磁盘驱动的问题,只要能驱动 ramdisk 就可以了。
用 ramdisk 启动之后,在 ramdisk
的启动脚本 (一般叫 /linuxrc
) 之中,针对硬件尝试 ramdisk 里面的 /lib/modules/uname -r
/,加载恰当的驱动,这时系统已经具备了切换到硬盘或其他介质上的文件系统的条件了。
机不可失,这时,我们首先加载硬盘或光盘、u 盘等启动介质,然后设该介质为根分区,并运行其 init 进程为 1 进程,之后,在 init 脚本中,释放掉 initrd 的空间,这就是借助 initrd 的引导过程。在这个过程之中 引导程序帮我们多做了一件事 — 构建 ramdisk, 把 initrd 放入内存。
4.5.1. 用 SYSLINUX/ISOLINUX 引导软盘和光盘
以上是关于ISO镜像的制作的主要内容,如果未能解决你的问题,请参考以下文章