如何为目录创建图像文件?

如何为目录创建图像文件?

如何为目录创建图像文件?例如:

  • 通过终端命令从文件夹创建 iso 映像说明genisoimage可以为一个目录创建iso镜像文件。我只知道为磁盘卷创建图像文件。是否genisoimage首先为目录创建循环设备或块设备文件(类似于CD/DVD),然后为循环设备或块设备文件创建映像文件?这与将图像文件安装到需要先为图像文件创建循环设备的目录的两步过程完全相反(类似于losetup命令)吗?

  • 有没有可以为目录创建 ext4 映像文件的命令?这也是一个两步过程吗?

还可以为目录创建存档文件。这两个过程有何不同?为目录创建图像文件是否涉及循环设备,而为目录创建归档文件则不涉及循环设备?

答案1

ext4 没有等效的工具。正如你所说,你可以使用循环设备达到等效的效果 -

  1. 创建一个具有足够空间来存储文件的空图像文件。 -truncate -s 1G my.img
  2. 格式化它 -mkfs.ext4 my.img
  3. 将其安装为循环设备 -mount -oloop my.img /mnt
  4. 将文件复制到已安装的文件系统中。 -cp -a directory/. /mnt/.
  5. 使用 将 ext4 文件系统缩小到最小大小resize2fs -M my.img。它会告诉您文件系统有多少块长(以及文件系统块的大小)。
  6. 您现在可以使用适当的命令将文件截断为较小的大小truncate

然而,Linux 内核没有 ISO9660 的可写实现,因此这不是genisoimage实现方式。我们当然也没有适用于 ISO9660 的收缩工具:-)。

将 ISO9660 安装为可写文件系统可能不太实用,因为它不是为此设计的。例如,它可能没有任何结构来有效地记录磁盘上的可用空间,或者允许对写入的文件进行分段以适应删除所留下的空间。


genisoimage确实类似于创建 TAR 或 ZIP 存档文件。文件系统映像将包含所有指定文件的副本。它的大小与所有指定文件大小的总和大致相同。不过,这些存档格式存在一些对比。文件系统数据结构与磁盘设备的扇区(2048 字节)对齐,以便有效读取各个文件。存档格式不符合任何如此大的边界。归档文件被打包以保持紧凑;另请注意,一次提取所有文件是很常见的。我预计存档格式还需要付出更多努力才能寻找一个单独的文件并读取其内容。

我不会将此称为目录的图像。我想从词源上来说,它不是任何真正的块设备的图像。然而它在同一个格式作为作为数据 CDROM 的副本创建的图像文件。正如手册页所说 -

genisoimage拍摄给定目录树的快照,并生成二进制映像,该映像在写入块设备时将对应于 ISO9660 和/或 HFS 文件系统。


为 CD-R(和 DVD-R)创建专用技术的部分原因是它是一种特殊情况。

当你写它们的时候你不能寻找。而且,CD-R写入过程自然需要输入连续的数据流。如果数据提供得不够快并且数据耗尽,则写入将失败并且光盘将毫无用处 - 除了现在许多写入器有一个解决方法这不是标准化的,需要在光盘上写入一个小间隙。

对于操作系统来说,允许使用通用块设备接口写入此类光盘不一定非常有用。我们当然无法在 CD-R 块设备上创建文件系统、安装它并将文件复制到其中。相反,我们使用这种更专业的方法。

我们不告诉genisoimage将文件系统映像直接写入光盘设备,例如/dev/sr0wodim dev=/dev/sr0 -如果我们愿意的话,我们可以通过管道传递它:-)。在古代,提前生成整个文件系统映像可能更安全,因为在读取单个大文件时可以获得更一致的性能。即,读取速度不太可能太慢,因此写入器不太可能耗尽数据并失败。

答案2

当对现有文件系统进行映像时,通常意味着创建现有文件系统底层块设备内容的逐块精确副本。它实际上是一个完全相同的副本存储原样在成像时。

一个ISO镜像有点不同。它是由一组通过任何方式定义的目录和文件构建而成的文件,以便成为 CD/DVD/蓝光光盘从该数据生成的内容的逐块精确副本。它包括在 ISO 映像创建时创建的 ISO9660 文件系统元数据。

ISO 映像格式的存在是因为 CD 刻录机设备最初只能以顺序访问方式写入光盘,并且无法在写入操作中停止而不损坏光盘。因此,您不能在这里写一个文件,在那里写另一个文件,边走边编:您必须预先指定构成 CD-ROM(或音频 CD)的所有文件和所有元数据,直到在发射写入激光之前的最后一个字节,然后一次性写入整个光盘,或者至少是完整的数据或音轨。这对于压制音频 CD 和 CD-ROM 的大规模生产来说是很好的。

(然后,引入了 CD-R,发现即使没有完整的 650 MiB 来写入,也必须浪费整张光盘,很不方便......因此开发了多会话 CD 写入。后来,更无缝的写入启动/停止技术使得开发 CD-RW 数据包写入成为可能,并且 UDF 文件系统的开发就是为了优化这一点......但我离题了。)

您无法像从整个文件系统创建图像文件一样从目录创建图像文件。文件系统映像包括文件系统元数据,该元数据描述了哪些块已分配、哪些块是空闲的,以及每个文件和目录的每个块在包含文件系统的块设备上的物理位置。该信息仅在文件系统其余部分的上下文中才有意义。

尝试复制该信息而不复制文件系统的其余部分几乎是无用的:将文件从此类映像恢复到新文件系统时,您必须忽略原始块位置信息并让文件系统驱动程序放置文件和目录根据目标文件系统上的哪些块是空闲的。否则,在恢复“映像”时,您可能会覆盖和损坏现有文件和/或目录。

因此,当“映像”目录而不是完整的文件系统时,仅存储(相对)路径名、文件和目录所有权、权限和其他属性以及文件内的数据是有意义的。当您开发为此优化的文件格式时,您将得到存档文件: 例如,一个.tar文件。将压缩添加到概念中,您就拥有了一个.tar.gz或一个.zip文件,或众多压缩存档文件格式中的任何一种。

循环设备不是必需的创建镜像文件:要创建一个文件系统的镜像,只需从头到尾依次读取包含该文件系统的块设备的所有块,并将它们全部写入一个文件中,同时确保该文件系统是被成像的图像在成像过程中不会被修改。

循环设备允许访问内容图像文件而不将其写入“真实”块设备。

相关内容