如何编辑ISO映像(包括可启动的ISO)
我正在寻找可用于编辑 ISO映像的Ubuntu工具。 包括可以像Ubuntu和Windows ISO一样启动的ISO映像。 不仅可以编辑,还可以保存已编辑的ISO,并且在USB驱动器或CD / DVD上刻录时仍可以启动。
ISO大师
我以前使用ISO Master将文件添加到ISO。 它适合您的需要,因为它保留了ISO是否可引导的状态。 我过去曾用它将其他内容(如音乐)添加到实时磁盘中。 但请注意,在更改ISO文件后,您只能“另存为”,即将创建另一个ISO文件,因此请确保您有足够的磁盘空间。
对此的常见答案是解压缩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=N
与skip=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
(这次搜索您的脚本),因为该文件可能仍处于读取缓存中。