我有一个大磁盘(8TB),我想尝试挽救一个较小的磁盘(1TB)。是否可以对较大的磁盘进行分区并仅使用该分区进行挽救?或者 ddrescue 无论如何都会格式化整个磁盘?
答案1
简短回答
您可以使用分区作为输出文件ddrescue
,并且该工具不会“格式化整个磁盘”,但几乎可以肯定的是,使用这种副本会有些复杂。如果您不想使用整个块设备(例如您的大磁盘),那么请写入文件系统中的常规文件(可能位于您的大磁盘上)。
工作原理(ddrescue
分区等)
ddrescue
从文件读取(导入文件) 并写入man 1 ddrescue
文件 (输出文件)。请注意,“文件”是一个广义的术语。在上下文中,ddrescue
我们应该考虑常规文件和块设备(磁盘、分区)。重要的是,您可以从头到尾读取常规文件或块设备,并获得一串字节。
ddrescue
将输入文件复制到输出文件;这就像cp
具有跳过读取错误、重试、恢复、向后工作的能力。如果没有读取错误,并且输出文件是文件系统中具有足够空间的常规文件,那么最终输出文件将是输入文件的副本,即,如果您从头到尾读取一个文件和另一个文件,那么您将获得两个相同的字节序列。
如果存在读取错误,则输出文件可能不是完美的副本,映射文件将告诉您它的哪些部分来自输入文件以及哪些只是占位符。
如果输出文件是块设备,请记住,写入块设备既不能截断也不能扩展它。如果块设备太小,那么您将获得不完整的副本。如果块设备正好,那么您将获得完美的副本(除非存在未更正的读取错误)。如果块设备太大,那么您将获得末尾有额外字节的副本。
无论如何,最重要的是ddrescue
努力将一个文件的内容复制到另一个文件。目标是做什么cp
。算法而所说的能力,也只是“努力”的意思。
如果没有读取错误,那么你可以用 得到相同的结果cp infile outfile
。还有更多工具可以完成这项工作(请参阅这个答案)。
您想复制整个设备,即较小的磁盘。整个设备(例如/dev/sdx
在 Linux 中)几乎总是包含一个分区表,该表告诉操作系统整个设备的哪些片段应该作为单独的块设备公开,我们称之为分区(/dev/sdx1
、/dev/sdx2
、...)。当程序打开分区并从中读取或写入时,就像访问任何其他可查找文件一样。操作系统将其转换为访问整个设备,它会确保每次访问都以正确的偏移量进行,并且不会让程序访问分区外的片段。
分区通常包含一个文件系统。换句话说,您可以从中读取的字节序列是我们称为某种类型的文件系统的结构。操作系统希望(几乎)每个分区都包含一个文件系统。
整个设备可能直接包含一个文件系统。这称为“超级软盘”。这种设置是可能的,但并不常见,不建议。
整个设备几乎总是包含一个分区表,然后是文件系统(其中的片段是分区),中间可能有一些空字节、垃圾或其他内容。这类似于一个简单的文件系统。它是特定于整个设备的“文件系统”,没有人/任何事物会期望它位于实际分区内。
考虑一下cp infile outfile
,它会覆盖outfile
而不会写入任何other_file
。它与类似ddrescue
:如果您告诉它写入,/dev/sdx3
那么它将覆盖此确切分区而不会写入/dev/sdx1
、/dev/sdx2
等/dev/sdx4
(除非分区重叠,这首先是一种病态情况)。它将更改/dev/sdx
(整个设备)的内容,只是因为可以通过打开访问的字节序列/dev/sdx3
是通过打开可以访问的字节子序列/dev/sdx
。它仍然不会更改的分区表/dev/sdx
,因为分区表在之外/dev/sdx3
(除非分区与分区表重叠,这将是另一种病态情况)。
所以不会,ddrescue
不会格式化整个磁盘,它只会覆盖目标分区。请注意,即使您将ddrescue
整个磁盘复制到另一个整个磁盘,目标磁盘上也会出现分区表和文件系统,而不是因为执行了“格式化” ddrescue
。它们之所以出现,是因为它们是从一个磁盘复制到另一个磁盘的字节序列中的字节子序列(除非存在读取错误);稍后操作系统会解释它们。在这方面,ddrescue
愚蠢的人cp
可以复制 AVI、PDF 或任何其他常规文件,而无需了解 AVI 或 PDF,也无需从头开始创建 AVI 或 PDF,也无法编辑它;稍后您的媒体播放器或 PDF 阅读器会解释这些文件。您甚至可以用于ddrescue
读取尽可能多的常规文件。
您能获得什么
如果您的小磁盘是超级软盘(没有分区表,文件系统直接位于整个设备上),那么将其复制到大磁盘的分区将创建一个常见情况,即文件系统位于分区内,这是每个操作系统都期望的。您将能够从副本中挂载文件系统,除非复制时读取错误严重损坏了它(但即使如此,数据恢复原则上也很简单)。但我不希望您的小磁盘是超级软盘。
您的小磁盘很可能包含分区表、分区和文件系统。如果是这样,将其全部复制到大磁盘的分区将创建一个分区中嵌套分区的异常情况据我所知,没有操作系统会期望这一点。实际上,“内部”分区(从较小的磁盘复制)将“不可见”(例如,在 Linux 中,它们不会自动出现在 中/dev/
)。有工具(例如partx
、kpartx
)和方法(mount -o offset=…
)可以访问它们及其文件系统。
考虑将较小的磁盘复制到常规文件。使用此类文件与使用分区一样简单,至少在现代 Linux 中是如此。即:
如果较小的磁盘是超级软盘,则文件将包含文件系统,并且您将能够使用它来挂载它
mount /path/to/file /mountpoint
(同样,除非复制时读取错误严重损坏了文件系统)。 Modernmount
可以挂载常规文件,它会自动创建循环设备。(可以使用“手动”创建循环设备losetup
。)如果较小的磁盘包含分区表,则文件将包含它的副本。
fdisk -l /path/to/file
或gdisk -l …
将显示表格(除非读取错误……)。mount -o offset=…
应该可以工作(除非……)。您可以使用partx
或kpartx
。Modernlosetup
可以为文件创建循环设备和用于分区内。例如:losetup --partscan --show --find /path/to/file
通过将副本写入分区,您可以获得类似的结果;常规文件仍然具有一些优点:
- 根据您放置文件的文件系统,该文件可能是压缩的或者至少是稀疏的。
- 如果文件系统支持重新链接,最好制作文件的重新链接副本并将其设为只读。关键是有时您需要修改文件内的文件系统以挽救数据(例如,
fsck
由于从源读取时出现错误,文件系统瘫痪),但这有可能使情况变得更糟。由于有副本,您可以随时重新开始;重新链接可避免花费时间和磁盘空间的实际复制。 - 您可以使用具有足够空间的现有文件系统(无需重新分区)。当不再需要该文件时,只需将其删除(无需再次重新分区)。
- 您可以为文件指定一个描述性名称,也可以保护它。包含无法识别内容的分区会“请求”文件系统(例如,某些过于热心的操作系统可能会询问您是否要格式化它;单击一下就会酿成灾难)。