发布于 2026-01-06 4 阅读
0

如何创建基于 Debian 的自定义 ISO

如何创建基于 Debian 的自定义 ISO

欢迎亲爱的读者,我是沉默的莫比乌斯,您谦卑的钢领自动人偶。

说实话,我从事定制 ISO 镜像的工作已经持续了 14 年,期间一直深受其扰。我遇到的每个客户最终都会提出要求,希望我们为开发团队提供定制的 GNU/Linux 操作系统,并要求 ISO 文件中包含所有必要的工具和脚本。坦白讲,我总是试图使用各种工具、脚本或框架来绕过这项任务,因为我始终不确定深入研究 GNU/Linux 系统内部机制是否是正确的选择。
随着时间的推移,我选择了几个自己比较喜欢的发行版,并努力精通它们,但之前提到的那个难题却始终困扰着我。
这次面对客户,我决定挑战自己,努力学习更多相关知识,并将我的发现分享给各位读者。
因此,我们必须从头开始,首先要找到一个基本的 ISO 文件,以及我们将要使用的工具列表,以便着手完成这项复杂的任务。
前提条件和假设: 

  • 我本人是 Debian 发行版的用户,已经使用了 14 年,因此我也会使用相同的发行版来完成这项任务。
  • 我们将修改 ISO 文件以创建适用于我们用例的自定义 GNU/Linux 发行版,该文件为Ubuntu 20.04.4,我们也可以从提供的链接下载。
  • 其他工具的安装将在下文中逐步展示。
  • 我将使用的步骤和工具也可以用于所有其他发行版,但我只在 Debian 和 RedHat 系列上进行了测试,由于出现了一些差异,因此决定只遵循 Debian 系列。

伟大的计划

每个流程都应该有行动计划,因此我们在此列出一份这样的规则清单:
我们将:

  • 从此链接获取 Ubuntu 20.04 ISO 镜像,或从此链接获取 Ubuntu 24.04 ISO 镜像。
  • 解压缩您选择下载的 ISO 文件。
  • 解压缩内置文件系统并连接到它。
  • 进行必要的更改
  • 断开与文件系统的连接。
  • 将文件系统恢复到原来的状态。
  • 将所有更改压缩到 ISO 文件中。

现在,事不宜迟,让我们直接进入正题:
首先,我们需要下载 ISO 文件并安装解压缩所需的初始工具。顺便一提,ISO 是另一种用于数据归档的压缩格式。CD/DVD 通常使用 ISO 9660 标准,您可以通过提供的链接了解更多信息。让我们开始下载 ISO 文件:

curl -X GET -OL https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-live-server-amd64.iso
# OR a newer version
curl -X GET -OL https://releases.ubuntu.com/24.04.2/ubuntu-24.04.2-live-server-amd64.iso
Enter fullscreen mode Exit fullscreen mode

一旦完成上述步骤,最好有一个名为 `<init>` 的初始工具,xorriso该工具用于创建、加载、操作和写入 ISO 9660 文件系统映像。

注意:我们也可以使用7z7zip,这是一个用于压缩和解压缩文件和图像的工具,但是,事实证明,在 RedHat 系统上它无法使用,因为其软件包存储库中保存的版本已损坏。

让我们执行安装:

 sudo apt-get update && sudo apt-get install -y xorriso
Enter fullscreen mode Exit fullscreen mode

安装完成后即可使用。另一种方法是使用 7zip,但不知何故,我使用的版本无法打开 ISO 文件。我们可以用以下命令解压缩之前下载的 Ubuntu 文件:

xorriso -osirrox on -indev "ubuntu-20.04.4-live-server-amd64.iso" -extract / iso && chmod -R +w iso
# OR a newer version
xorriso -osirrox on -indev "ubuntu-24.04.2-live-server-amd64.iso" -extract / iso && chmod -R +w iso
Enter fullscreen mode Exit fullscreen mode

该命令的输出结果将创建iso一个文件夹,其中包含命令中提供的所有文件的内部结构。但是,文件夹里究竟有什么呢?

 

aschapelle@vaiolabs ~/iso[]$ ls -l
total 68
drwxrwxr-x. 3 aschapelle aschapelle  4096 Feb 23 11:26 boot
drwxrwxr-x. 3 aschapelle aschapelle  4096 Feb 23 11:26 casper
drwxrwxr-x. 3 aschapelle aschapelle  4096 Feb 23 11:26 dists
drwxrwxr-x. 3 aschapelle aschapelle  4096 Feb 23 11:26 EFI
drwxrwxr-x. 2 aschapelle aschapelle  4096 Feb 23 11:26 install
drwxrwxr-x. 2 aschapelle aschapelle 12288 Feb 23 11:26 isolinux
-rw-rw-r--. 1 aschapelle aschapelle 27389 Feb 23 11:26 md5sum.txt
drwxrwxr-x. 3 aschapelle aschapelle  4096 Feb 23 11:26 pool
drwxrwxr-x. 2 aschapelle aschapelle  4096 Feb 23 11:26 preseed
lrwxrwxrwx. 1 aschapelle aschapelle     1 Apr 23 16:14 ubuntu -> .
# OR a Newer version
aschapelle@vaiolabs-io ~/iso []
$ ls -la
total 56
dr-xr-xr-x  1 aschapelle aschapelle  2048 Feb 17 00:49 .
drwxr-x---+ 6 root       root        4096 Jun 10 10:44 ..
dr-xr-xr-x  1 aschapelle aschapelle  2048 Jan 27 15:56 boot
-r--r--r--  1 aschapelle aschapelle  2048 Feb 17 00:49 boot.catalog
dr-xr-xr-x  1 aschapelle aschapelle  6144 Feb 17 00:49 casper
dr-xr-xr-x  1 aschapelle aschapelle  2048 Feb 17 00:49 .disk
dr-xr-xr-x  1 aschapelle aschapelle  2048 Feb 17 00:45 dists
dr-xr-xr-x  1 aschapelle aschapelle  2048 Jan 27 15:56 EFI
dr-xr-xr-x  1 aschapelle aschapelle  2048 Feb 17 00:45 install
-r--r--r--  1 aschapelle aschapelle 30615 Feb 17 00:49 md5sum.txt
dr-xr-xr-x  1 aschapelle aschapelle  2048 Feb 17 00:46 pool
lr-xr-xr-x  1 aschapelle aschapelle     1 Feb 17 00:45 ubuntu -> .

Enter fullscreen mode Exit fullscreen mode

需要重点关注的主要文件夹是 boot、casper 和 isolinux。

  • boot文件夹包含用于安装的实时系统的安装程序选项。
  • casper包含名为 squashfs 的压缩文件系统文件,以及用于加载文件系统的初始 RAM 磁盘 (init-rd) 文件和 Linux 内核必不可少的 vmlinuz 文件。
  • isolinux它提供启动系统的配置文件等功能。

那么,接下来该怎么办呢? 
嗯,亲爱的读者,这完全取决于您的意愿,但从我的角度来看,我们应该拆解 casper 文件夹中的一个文件系统,对其进行编辑、配置和自定义,然后再将其修复以供进一步使用。 

注:我将在其他教程中介绍不同 ISO 实现的用例,其中可能会涉及这些细节。

squashfs 的反汇编工具可以按如下方式安装:

sudo apt-get install -y squashfs-tools syslinux syslinux-efi isolinux
Enter fullscreen mode Exit fullscreen mode

安装完成后,为了安全起见,我们可以将 filesystem.squashfs 文件复制到另一个文件中,并在该文件中调整其参数。

# copy  filesystem.squashfs to your home directory
 cp iso/casper/filesystem.squashfs ~/
# chage directory to your home directory
 cd ~
# open the squashfs file
 sudo unsquashfs filesystem.squashfs
Enter fullscreen mode Exit fullscreen mode

注意:从现在开始,在机器之神的帮助下,我将继续使用 Ubuntu 24.04 ISO 进行操作,但 20.04 ISO 的步骤基本相同。
输出结果应如下所示:

Parallel unsquashfs: Using 4 processors
33457 inodes (38383 blocks) to write
[============================================|] 38383/38383 100%
created 29764 files
created 3675 directories
created 3572 symlinks
created 9 devices
created 0 fifos
Enter fullscreen mode Exit fullscreen mode

注意:在 Debian 系统本身以及其他一些 Debian Linux 发行版中,该文件filesystem.squashfs可能位于不同的位置,例如 `/etc/debian/` 或 `/etc/debian/` liveinstall请根据实际情况进行检查和调整。

最终,我们会得到一个名为 filesystem-root 的新文件夹。
在这里,我们可以了解到,本质上,Live-ISO 文件系统的架构是这样的:它将压缩后的文件系统复制到新的介质上,例如简单的 SATA 硬盘,无论是 USBhda还是sdaUSB存储设备nvme0。文件系统复制完成后,fakerooting系统就开始运行,这意味着系统会自动选择如何安装系统、使用哪些分区、如何配置网络等等。
我们将执行相同的操作,但不安装系统。首先,让我获取一个……fakeroot

sudo apt-get install -y fakeroot
Enter fullscreen mode Exit fullscreen mode

fakeroot该软件包使我们能够使用chroot一些命令,这些命令会将我们伪装成GNU/Linux 操作系统的伪 root 用户,从而更改我们的文件系统根目录。所以……

 sudo chroot squashfs-root/
[sudo] password for aschapelle: 
root@vaio3lap:/#
Enter fullscreen mode Exit fullscreen mode

现在,剩下的就是配置自定义设置、安装和定义用户、配置文件、软件包、环境,然后按相反的顺序执行到目前为止完成的所有步骤。

注意:通常情况下,由于使用了chroot网络解析,因此没有进行网络转换,nameserver需要在 /etc/resolv.conf 文件中添加配置。

 

 echo 'nameserver 8.8.8.8' > /etc/resolv.conf

接下来就是经典的UNIX/Linux系统管理,包括安装、配置、调整、添加、删除和清理系统。为了便于举例,我将安装几个工具:

# install anything your heart desires, remember not to over do it because of ISO9660 size limitation (4GB)
 apt-get update && apt-get install htop vim atop cloud-init
Enter fullscreen mode Exit fullscreen mode

基本上,你可以在 chroot 文件系统中执行任何操作,包括复制粘贴外部文件、保存 Git 仓库等等。
在退出 chroot 环境之前,最好清理一下工作,例如清理已保存的仓库文件、历史记录和存储空间,在本例中,这可以理解为:

 echo ' ' > /etc/resolv.conf
 apt-get clean
 history -c
 exit
Enter fullscreen mode Exit fullscreen mode

退出 chroot 环境后,我们需要恢复文件系统,这可以通过以下方式实现:

 sudo mksquashfs  squashfs-root/ filesystem.squashfs -comp xz -b 1M -noappend
Enter fullscreen mode Exit fullscreen mode

注意:该过程将使用大部分 CPU 核心,并且需要一些时间,具体时间取决于我们进行了多少更改。 

创建 filesystem.squashfs 文件后,将其复制到 casper 文件夹,更改 md5 签名,然后从中创建新的 ISO 文件:

 cp filesystem.squashfs ./iso/casper/
 md5sum iso/.disk/info > iso/md5sum.txt
 sed -i 's|iso/|./|g' iso/md5sum.txt
 xorriso -as mkisofs -r -V "Ubuntu 24.04 custom amd64" -o ubuntu-24.04.2-custom-amd64.iso -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat -isohybrid-apm-hfsplus -isohybrid-mbr /usr/lib/syslinux/bios/isohdpfx.bin iso/boot iso
Enter fullscreen mode Exit fullscreen mode

我有一些解释要说明:

  • -as mkisofs:与 mkisofs 语法兼容的模式
  • -o ubuntu-24.04.4-custom-amd64.iso:输出 ISO 文件的名称
  • -J:包含 Joliet 的 Windows 扩展程序
  • -b isolinux/isolinux.bin : 指定用于 BIOS 启动的启动映像文件,通常来自 ISOLINUX。
  • -c isolinux/boot.cat:指示 ISO 生成 El Torito 启动目录文件,该文件是 BIOS 启动所必需的。
  • -no-emul-boot:告诉 BIOS 在启动映像时不要模拟软盘或硬盘。
  • -boot-load-size 4:定义要加载到内存中的启动映像的 512 字节扇区的数量。
  • -boot-info-table:指示 xorriso 使用 ISOLINUX 使用的“启动信息表”修补启动映像。
  • -isohybrid-gpt-basdat:添加 GPT 分区表和 BIOS 启动分区
  • -isohybrid-apm-hfsplus:添加了 Apple 分区映射 (APM) 和 HFS+ 支持,从而可以在 Mac 上启动。
  • -isohybrid-mbr /usr/lib/syslinux/bios/isohdpfx.bin:向 ISO 镜像添加传统的 MBR 引导记录——这是混合 ISO-USB 启动所必需的。该过程完成后,我们将得到一个名为 ubuntu-20.04.40-custom-amd64.iso 的新 ISO 文件,我们可以将其刻录到 U 盘并进行测试。

结论

亲爱的读者朋友们,感谢您耐心读到最后。希望这篇文章能帮助您拓展知识面,有所收获。记住:尽情享受阅读的乐趣吧!

谢谢

文章来源:https://dev.to/vaiolabs_io/how-to-create-custom-debian-based-iso-4g37