如何编辑ISO镜像(包括可引导的ISO)

我正在寻找适用于Ubuntu的工具,可以用来编辑ISO镜像。包括可引导的ISO镜像,如Ubuntu和Windows ISO镜像。不仅能够编辑,还可以保存编辑后的ISO,并且在烧录到USB驱动器或光盘时仍然能引导启动。
5个回答

ISO Master install isomaster

我以前用过ISO Master来向ISO文件中添加文件。它非常适合你的需求,因为它能保留ISO文件是否可引导的状态。我以前使用它来向现场光盘中添加其他内容(比如音乐)。不过请注意,在对ISO文件进行更改后,你只能选择“另存为”,也就是会创建另一个ISO文件,所以请确保你有足够的磁盘空间来存放两个文件。

isomaster


1请注意:此方法不适用于Windows安装镜像。 https://askubuntu.com/q/228690/821405 - ederag
保存ISO文件后,您可能需要运行以下命令以使其再次可引导:sudo isohybrid output.iso如果您的系统没有isohybrid命令,请使用以下命令进行安装:sudo apt install syslinux-utils - diegov
1我刚刚尝试了使用Linux Mint安装程序的ISO Master,它删除了带有EFI文件的FAT分区,基于ISO文件写入的磁盘无法启动。 - inf3rno
@diegov "isohybrid: Mint-21-XFCE-32bit.iso: 非预期的启动目录参数" - inf3rno
解决方案无效,与上述评论中的问题相同。 - Mehdi

常见的解决方法是解压iso文件,进行修改,然后再重新打包。正如dv3500ea的回答中提到的那样,"ISO Master"是一个很好的前端工具来完成这个任务。
如果:
- 你没有足够的空间来进行操作 - 你只想对文件进行局部修改而不是整体重写 - 你想修改一个包含isofs文件系统(也称为iso9660)的存储设备而不需要复制整个设备,或者 - 如果你认为这种解压/打包的方式还不够"酷"
那么这个答案就适合你!
总结一下,我们将用我们想要的文件替换isofs文件系统中的现有文件。我们想要的文件必须比现有(目标)文件小,并且尾随的空白字符(或垃圾)是可以接受的。实际上,这只需要两个命令,但要小心:一个打字错误可能会完全破坏目标文件系统,甚至覆盖源文件。备份是你的朋友!
在我的情况下,我想将一个脚本存储在一个活动启动盘中,这样我就不必每次都重新输入它。脚本位于script.py,而我的目标(一个USB闪存驱动器)位于/dev/sdc。脚本的大小为202字节,所以我们的第一步是找到一个大于202字节的文件,以便我们可以覆盖它。在将其挂载到/mnt后,我在/mnt/info.txt找到了一个合适的文件。
我们不能只是在挂载点上覆盖info.txt,因为它会抱怨它是一个只读文件系统。不过,我们是root用户,所以让我们向他们展示一下我们的能力!我们需要弄清楚info.txt在文件系统中的位置。找到一些(可能)唯一于info.txt的字符串,例如This is the official distribution CD of X.,然后在磁盘上搜索它:
$ sudo strings -a -t d /dev/sdc | grep 'CD of X.'
2573588480 This is the official distribution CD of X. See INSTALL for how to [...]

或者,也可以使用grep来完成这个任务,它的速度更快,但是需要从一开始就指定:`$ sudo grep -oba 'This is ...' /dev/sdc`。
现在我们知道了它的位置,只需要用我们的文件替换这些字节即可。
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202

这行代码:
  • 从输入文件(if)复制字节到输出文件(of),它并不关心输出文件实际上是一个设备,因为“一切皆文件”。
  • conv=notrunc 告诉它不要截断输出文件,因为我们只想覆盖几个字节,而不是从某个点开始覆盖整个文件。
  • bs=1 将块大小设置为1。通常你希望块大小为4k或更大,但这样可以避免进行(内联)数学计算,并且让我们能够精确指定位置到字节。
  • seek=N 定位到输出文件的某个点(注意 seek=Nskip=N 不同,因为 skip 是跳过输入文件的字节!)。当然,我们将其设置为目标文本所在的位置。
  • count=N 只复制这么多字节。我认为这可以省略,因为它会注意到输入文件的结尾,但为了确保我还是把它留了下来。

然后,文件就被覆盖了!

等等,目标文件比我们的脚本要大,所以在USB存储设备上,文件现在变成了像这样的内容:"while do if run() blah; blah(); yright 2007 X Inc."。存在一些尾部垃圾字符。修复此问题的两种方法:使输入文件更长(添加空格),或在末尾添加一个注释符号。请注意,许多编辑器在末尾添加换行符,因此您可能需要将count=设置为N-1字节(如果现在文件有203个字节,且你注意到最后一个字节是换行符,则将count设置为202)。您可以使用xxd script.py | tail命令检查文件中是否有换行符,并检查最后一个字节是否为0a(或者在某些特殊情况下为0d)。

对于.iso文件,此过程完全相同,只需将/dev/sdc替换为your.iso

请注意,当您检查挂载点上的目标文件以查看是否成功时,您可能需要再次使用strings命令(这次搜索您的脚本),因为该文件可能仍然位于读取缓存中。


3这个回答太有趣了,我想给它一百个赞哈哈 - Paulo Coghi

PowerISO刚刚发布了他们的ISO编辑软件的免费Linux版本1。与ISO Master类似,它保留了ISO是否可引导的状态。然而,它允许你直接保存到原始文件(先删除原始文件),因此不需要足够的磁盘空间来存储两个文件。我还发现它的界面比ISO Master更易于使用和直观。

screenshot of PowerISO for Linux


1与其Windows程序不同,Linux版本可以免费使用,没有任何大小限制或类似的限制。


2值得一提的是,这个应用需要支付费用,29.95美元,如果你想去除300MB的限制。 - Celdor
1@Celdor 不,那只适用于Windows版本。Linux版本是免费的,没有任何大小限制。 - user435587
Linux版本已不再更新,并且在Ubuntu Xenial中无法正常工作。 - eadmaster
保存ISO文件后,您可能需要运行以下命令以使其再次可引导:sudo isohybrid output.iso如果您的系统没有isohybrid命令,请使用以下命令进行安装:sudo apt install syslinux-utils - diegov

尝试使用xorriso
从这里获取示例
xorriso -indev INPUT.ISO -outdev OUTPUT.ISO -add FILE_TO_ADD.EXT

非常有趣的校长。谢谢你。 - Luis Alvarado
无法安装xorriso。错误 - 在执行配置命令时出错 - 路径中找不到可接受的C编译器。 - Subhajit

我最近(2023年03月)需要重新打包Debian GNU Linux iso,以添加一些固件,但使用'isomaster'并没有成功。
我记得在2014年时,'isomaster'方法在大多数ISO以MBR模式引导时运行良好。
但很抱歉,在2023年的混合UEFI / MBR ISO中,无法再使用ISOMASTER软件的旧方法。 这是因为今天的ISO不再是简单的ISO,而是被称为“isohybrid”的常见名称,因为引导加载程序处于混合状态(UEFI / MBR)。
这里有一个完整示例的链接,我需要向ISO添加文件,并且我已经成功地重新打包了一个带有UEFI和MBR的Debian GNU Linux isohybrid ISO,并且几乎在所有情况下都能成功引导(从USB闪存驱动器,硬盘驱动器,刻录的DVD,以及以MBR模式启动虚拟机和以UEFI模式启动虚拟机的虚拟化管理程序): 使用原始引导设备重新打包ISO 希望对您有所帮助。