admin管理员组

文章数量:1563217

ISO镜像的制作

荣涛
2021年11月9日

文档修改日志

日期修改内容修改人备注
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指令指南

  • linux下cpio命令使用
  • 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/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/pub/linux/utils/boot/syslinux/
  • 创建一个文件夹,名字为 CD_root,当作ISO镜像主文件树
    • 拷贝你想放到CD上的所有文件到这个文件夹;
  • CD_root创建名字为 isolinux 的文件夹;
    • 从syslinux存档中拷贝"[bios/]core/isolinux.bin"
    • 对于5.00或者更新的版本,也需要从syslinux存档中拷贝"[bios/]com32/elflink/ldlinux/ldlinux.c32"
    • 创建"isolinux.cfg"配置文件,参见示例;
  • CD_root创建imageskernel文件夹;
    • 拷贝任何你想启动到的软盘镜像;
    • 从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示例

  • https://wiki.syslinux/wiki/index.php?title=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的下载,修改和更新

  • How to Download, Fix, and Update Isolinux.bin
  • 如何下载、修复并更新 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 引导软盘和光盘


Copyright (C) CESTC Com.

本文标签: 镜像iso