如何编辑ISO映像(包括可启动的ISO)

我正在寻找可用于编辑 ISO映像的Ubuntu工具。 包括可以像Ubuntu和Windows ISO一样启动的ISO映像。 不仅可以编辑,还可以保存已编辑的ISO,并且在USB驱动器或CD / DVD上刻录时仍可以启动。

ISO大师 安装isomaster

我以前使用ISO Master将文件添加到ISO。 它适合您的需要,因为它保留了ISO是否可引导的状态。 我过去曾用它将其他内容(如音乐)添加到实时磁盘中。 但请注意,在更改ISO文件后,您只能“另存为”,即将创建另一个ISO文件,因此请确保您有足够的磁盘空间。

isomaster

对此的常见答案是解压缩iso文件,修改它并重新打包。 看起来像dv3500ea的答案中提到的“ISO Master”是一个很好的前端。

如果:

  • 你没有足够的空间
  • 你只想做一个手术修改而不是重写整个事情
  • 您想要修改包含isofs文件系统(aka iso9660)的存储设备而不复制整个设备,或者
  • 如果你认为这个拆包/重新包装的东西不够hacky

那么这个答案就是给你的!

总之,我们将用我们想要的文件替换isofs文件系统中的现有文件。 我们所需的文件必须小于现有(目标)文件,并且必须接受尾随空格(或垃圾)。 这实际上只需要两个命令,但要小心:错字可以完全破坏目标文件系统,甚至覆盖源文件。 备份是你的朋友!

在我的情况下,我想将一个脚本存储在一个实时启动中,所以我不必每次都重新键入它。 脚本位于script.py ,我的目标(USB记忆棒)位于/dev/sdc 。 脚本的大小是202字节,所以我们的第一步是找到一个大于202字节的文件,这样我们就可以覆盖它。 在/mnt安装后,我在/mnt/info.txt找到了一个合适的文件。

我们不能只覆盖mountpoint上的info.txt ,它会抱怨它是一个只读的文件系统。 不过,我们是根,所以让我们告诉他们这意味着什么! 我们需要弄清楚info.txt在文件系统上的位置。 找一些(可能)对于info.txt唯一的字符串,例如This is the official distribution CD of X. ,并在磁盘上搜索它:

 $ sudo strings -a -td /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记忆棒上,文件现在是这样的:“如果运行()执行()blah; blah(); yright 2007 X Inc.”。 有垃圾垃圾。 解决此问题的两种方法:使输入文件更长(添加空格),或在末尾添加注释符号。 请注意,许多编辑器在末尾添加换行符,因此您可能希望将count=设置为N-1个字节(如果您的文件现在是203个字节,并且您注意到最后一个字节是换行符,则将计数设置为202)。 您可以使用xxd script.py | tail检查文件是否有换行符 xxd script.py | tail并检查最后一个字节是否为0a (或者,在奇怪的情况下,为0d )。

对于.iso文件,该过程是相同的,只是在心理上用your.iso替换/dev/sdc

请注意,当您检查mountpoint中的目标以查看它是否有效时,您可能需要再次使用strings (这次搜索您的脚本),因为该文件可能仍处于读取缓存中。