在最近发生在我身上的 灾难之后,我决定开始备份我的数据。我正在寻找克隆分区和磁盘的最佳方法,并在 stackexchange 网络上的另一个站点上遇到了一个问题。
第二个答案似乎很有趣,但是在第二部分中,它提出了以下建议:
为了节省更多空间,请事先对您要克隆的驱动器/分区进行碎片整理(如果合适),然后将所有剩余未使用的空间清零,使 gzip 更容易压缩
这似乎是一个耗时的过程,并且可能会缩短 HDD 的使用寿命,所以我在想:为什么要将硬盘驱动器的未使用空间归零?为什么不将分区缩小到接近它在磁盘上占用的大小,然后将 dd 与 gzip 结合使用?
例如,如果托管我的 Windows 安装的分区大小为 450GB,使用的数据大小为 80GB,我可以使用 Windows 上的“磁盘管理”将分区缩小 '450 - 80 + 0.5'GB。0.5GB 是为了避免后台进程尝试写入磁盘时出现问题。
然后我可以使用 live linux 发行版来执行命令:
dd if=/dev/hdb | gzip -c > /image.img.gz
然后我可以回到 Windows 并扩展分区以声明未分配的空间。
由于我没有尝试过这种方法,所以我想问:
我错过了什么/有什么问题吗?
我问的原因是我还没有找到一个答案或文章提到这种方法。
我的第二个问题是:为了这个目的,现在有没有比 gzip 更好的压缩工具?
缩小分区也是一个耗时的过程,因为它需要移动大量数据——这些数据通常分布在整个分区(以避免碎片)而不是一开始就打包所有文件,所以你越多想要缩小分区,需要将更多的数据物理移动到不同的地方。
超过某个“已使用”百分比,它甚至可能比清零空白空间要慢,因为收缩工具需要在将数据写入其他位置之前读取数据,因此工作速度不到 HDD 的一半。
(此外,Windows 通常会拒绝将在线文件系统压缩到某个点以上——例如,如果您从 ~1TB 文件系统开始,即使文件系统几乎是空的,最小值通常也会是 ~450GB。从 Windows PE 离线压缩,或即使从使用 ntfsresize 的 Linux 中,也可能需要进一步减少它。)
两个更好的选择是:
使用 克隆分区,除了它理解 NTFS 空间分配位图外
ntfsclone
,它的行为类似于dd
,因此它将避免读取 NTFS 认为未使用的任何扇区。结果类似于对文件系统进行预置零,但速度更快,因为既不写入也不读取空扇区。partclone
是一个支持更多文件系统的类似工具,但不幸的是只能输出其专有图像格式(需要第二次 partclone 调用才能恢复到物理分区),而 ntfsclone 只输出一个“原始”图像,可以直接写入新分区。在某些情况下,您可以使用
Disk2vhd.exe
,它在 Windows 上运行并始终输出 VHD 或 VHDX 映像文件(它用于将物理 Windows 安装转换为 Hyper-V)。VHD(X) 映像是动态分配的,因此它们只占用所需的空间——它们可以作为虚拟磁盘附加到任何 Windows 10 系统上。但是,Disk2vhd 没有用于从VHD 恢复到物理磁盘的配套工具(尽管这可以使用 qemu-img 完成)。使用 创建文件级映像
dism.exe /capture-image
,输出 WIM 存档(与 Windows 安装过程使用的类型相同) - 然后可以使用 将其提取到新的 NTFS 分区/apply-image
,保留 [几乎] 所有 Windows 特定的元数据。您可以从 Windows PE 执行此操作,例如通过启动 Windows 安装程序或恢复环境,然后按 Shift+F10 进入命令提示符。
这种方法避免了任何与调整大小相关的问题(例如,您可以从 1TB 磁盘捕获图像并将其提取到 256GB 的磁盘),但它比 ntfsclone 慢,因为您需要一个中间位置来存储图像,目前还不清楚它是否真的捕获所有元数据。(例如,事实证明您需要使用该
/EA
选项才能包含 WSL1 使用的扩展属性。)