如何在Ubuntu上从.iso文件中创建.img文件?

我想创建一个包含Ubuntu 13.10的.img文件。我知道如何获取.iso文件,但是关于如何将其“转换”为.img文件的说明只在Mac上找到(例如,请参见这里)--然而,我使用的是Ubuntu 13.10。创建.img文件需要哪些步骤?
背景信息:我想使用.img文件在Android上运行Complete Linux Installer。Complete Linux Installer已经提供了.img文件(请参见这里),但它们太小了。Ubuntu只能“看到”.img文件的大小,这远远不足以提高生产力--这就是为什么我想创建一个更大的.img文件。我尝试使用resize2fs myImage.img 4G来扩大镜像的大小,但是从这样的镜像中运行的Ubuntu仍然认为.img文件很小,所以我希望通过直接创建一个更大的.img文件,Ubuntu可以“看到”更大的空间。我知道我在这方面有些冒险...

这是一个关于在Mac上无法将ISO转换为IMG的问题的问答。或许可以帮到你? - user101351
我不这么认为。它(再次)要么基于Mac OS X(使用hdiutils),要么只是建议将.iso重命名为.img(我怀疑这是否是正确的方法)。 - Marius Hofert
1问题毫无意义。您提供的图像文件似乎是已经安装好并准备运行的系统。您不需要使用 ISO 镜像将 Ubuntu 安装到其中之一。 - psusi
我的目标是准确获取这样一个.img文件,只是“更大”。我认为应该从.iso文件开始。 - Marius Hofert
3个回答

我会猜测一下,你是想从ISO文件制作一个IMG文件,对吗?如果是这样的话,ISO和IMG除了扩展名之外没有任何区别。
引用一个段落: 如果IMG文件未经压缩,则其结构与ISO格式没有任何区别。可以将IMG格式文件重命名为ISO文件扩展名,并在只识别ISO文件格式的软件中打开。这是在处理IMG格式的程序中访问磁盘信息的有效方法。
(来源:source
维基百科(Wikipedia)似乎也有同样的看法。
ISO镜像是另一种光盘镜像文件类型,通常使用.iso文件扩展名,但有时也会使用.img文件扩展名。它们类似于原始的光盘镜像,但只包含从光盘中获取的计算机数据的一个轨道。它们不能包含多个轨道,也不能包含音频或视频轨道。它们也不包含CD-ROM或DVD扇区的控制头和纠错字段,这些通常存储在原始光盘镜像中。其内部格式遵循光盘文件系统的结构,通常是ISO 9660(用于CD)或UDF(用于DVD)。CUE/BIN和CCD/IMG格式通常包含原始光盘镜像,也可以存储ISO镜像。
那么,如何将ISO转换为IMG?只需更改扩展名即可。
rename 's/\.iso(?=[^.iso]*$)/.img/g' *

现在,要创建一个img,你应该使用dd并将其保存到一个名为img的文件中。

感谢你的帮助,Braiam。如果重命名是解决方案,为什么对于使用Mac OS X的人(他们使用hdiutils进行此操作;请参考UncleNerdicus的链接)无效呢?关于你最后一句话,你能提供更多细节吗? - Marius Hofert
@MariusHofert他做错了(http://askubuntu.com/questions/307360/how-to-convert-from-iso-to-img-file#comment390875_307360)。嗯...最后一行只是将包含“.iso”的文件重命名为“.img”。我需要它只匹配最后一个.iso文件。更新 - Braiam
好的,谢谢。所以我只需要将.iso重命名为.img。那么,如何创建一个6GB大小的.img文件呢?使用resize2fs命令吗?嗯,这可能是一个新问题,但我希望你也知道答案。 - Marius Hofert
@MariusHofert 你可以使用dd命令来“创建”一个img文件。img文件只是文件系统中每个块的精确副本。 - Braiam
dd 的语法是:dd if=infile.img of=outfile.img。我不明白如何使用 dd 来选择 outfile.img 的大小(?)。而且,如果我使用 resize2fs,似乎(更大的)文件大小并没有被“看到”…… - Marius Hofert
有一个参数count的争论,但是outfile.imginfile.img的大小仍然相同。 - Marius Hofert
@MariusHofert dd会精确地读取您输入的设备/文件的相同字节,这就是为什么它具有相同的大小。您可以使用dd创建它们,而不是将iso转换为img。 - Braiam
@Martian2020 你试过重新命名并再次尝试文件吗? - Braiam

只需将文件重新命名即可。任何以.iso扩展名的文件都可以安全地重命名为.img扩展名。

简而言之

ISO与IMG

原始磁盘映像是一个二进制文件,它包含存储设备上存储的二进制数据的逐扇区二进制副本。原始磁盘映像是源介质的完整快照,包括MBR、GUID或Apple分区表。

ISO映像是一个原始磁盘映像,它包含光盘上存储的二进制数据的逐扇区副本。ISO映像包含以ISO-9660文件系统格式化的光盘的二进制数据。

ISO映像是原始磁盘映像的一个子集。ISO映像(.iso扩展名)可以重命名为原始磁盘映像文件(.img扩展名),但反过来并不自动成立,除非磁盘映像包含ISO-9660格式化的数据。包含ext4格式化数据的原始磁盘映像不是ISO映像。

然而,通常情况下,如果ISO映像包含MBR引导扇区或ESP引导分区,它们会被用作可启动介质。BIOS/UEFI固件将能够执行引导加载程序代码并启动系统。

我下载了一个Ubuntu 22.04可启动的ISO文件,用于快速演示,探测文件类型显示为:
root@ubuntu:~# file ./ubuntu-22.04-desktop-amd64.iso
ubuntu-22.04-desktop-amd64.iso: DOS/MBR boot sector; GRand Unified Bootloader, stage1 version 0x79, boot drive 0xbb, stage2 address 0x8e70, 1st sector stage2 0xb8db31c3, stage2 segment 0x201

ISO镜像使用了GPT(GUID分区表)布局,其中包含一个保护MBR。保护MBR包含了第一阶段引导加载程序的引导代码,这是一个小型可执行代码,用于加载第二阶段引导加载程序(即GRUB),负责在传统BIOS引导过程中加载内核。
第二阶段引导加载程序存储在ESP(EFI系统分区)中,具有符合UEFI规范的新型计算机可以通过探测磁盘来直接执行第二阶段引导加载程序。
保护MBR还包含一个分区表,定义了一个大小为整个磁盘的存根分区。这样可以防止不理解GPT布局的软件将磁盘视为空白。

探索镜像内容

要探索镜像的内容,我们可以将ISO镜像附加到一个循环设备上。
循环设备是一个块设备,它将其数据块映射到文件系统中常规文件或另一个块设备的块上,而不是物理存储设备的块。这对于为存储在文件系统中的原始镜像提供块设备非常有用。
你可以使用ls -l /dev/loop*命令列出循环设备。特殊字符设备/dev/loop-control是循环设备的内核驱动程序。它用于动态查找可用的循环设备,并向系统添加和删除循环设备。
将ISO镜像附加到可用的循环设备上:
root@ubuntu:~# losetup -f --show -P ./ubuntu-22.04-desktop-amd64.iso
/dev/loop0

列出分区:
root@ubuntu:~# fdisk -l /dev/loop0
Disk /dev/loop0: 3.41 GiB, 3654957056 bytes, 7138588 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: A09DB2B8-B5F6-43AE-AFB3-91E0A90189A1

Device         Start     End Sectors  Size Type
/dev/loop0p1      64 7129427 7129364  3.4G Microsoft basic data
/dev/loop0p2 7129428 7137923    8496  4.2M EFI System
/dev/loop0p3 7137924 7138523     600  300K Microsoft basic data

挂载 ISO-9660 和 EFI 分区:
root@ubuntu:~# mkdir -p /mnt/{iso,esp}
root@ubuntu:~# mount -o ro /dev/loop0p1 /mnt/iso
root@ubuntu:~# mount /dev/loop0p2 /mnt/esp

注意:ISO-9660是一个只读文件系统,因此分区必须使用“ro”选项挂载。
您可以使用以下命令验证已挂载的文件系统:
root@ubuntu:~# df -T /dev/loop0p{1,2}
Filesystem     Type    1K-blocks    Used Available Use% Mounted on
/dev/loop0p1   iso9660   3564682 3564682         0 100% /mnt/iso
/dev/loop0p2   vfat         4214    3222       992  77% /mnt/esp

卸载分区并释放循环设备,请运行以下命令:
root@ubuntu:~# umount loop0p{1,2}
root@ubuntu:~# losetup -d /dev/loop0

免责声明:我并不保证以下回答正确地回答了问题,但Google搜索给我找到了一些问答,希望我的回答能够帮助解决类似的问题。
我找到一个建议,将"iso"转换为"img"以便从USB启动。我无法使用下载的ISO文件从USB启动。后来我找到一个建议,通过以下方式将其转换为img:
geteltorito f1.iso > f1.img

实际上,我能够从USB启动,其中我写入了一个img文件。这些文件是不同的:
$ file 6muj31uc.iso
6muj31uc.iso: ISO 9660 CD-ROM filesystem data '6muj31us' (bootable)
$ file 6muj31uc.img  
6muj31uc.img: DOS/MBR boot sector; partition 1 : ID=0x4, active, start-CHS (0x0,1,1), end-CHS (0xe,63,32), startsector 32, 30688 sectors

启动镜像听起来像是img文件:
man geteltorito

geteltorito是一个Perl脚本,用于从CD中提取初始/默认El Torito引导映像(如果存在)。