将 dd 图像拆分成多个文件

将 dd 图像拆分成多个文件

我正在从硬盘中恢复一些数据。该磁盘上有大约 300GB 的数据,但我没有另一个有 300GB 可用空间的硬盘。

我有三块硬盘,分别有 150、40 和 120 GB 的可用空间。

为了创建第一个块,我考虑执行以下操作:

sudo dd if=/dev/sdf1 bs=4096 count=150G | gzip > img1.gz

我应该在其他机器上运行什么来“从我离开的地方继续”?

答案1

您可能需要考虑使用tar,正如 KPWINC 所说,但要直接回答您的问题,您需要使用 的dd“跳过”选项。

如果您的第一个命令如上所述是:

sudo dd if=/dev/sdf1 bs=4096 count=150GB | gzip > img1.gz

那么你的第二个将是:

sudo dd if=/dev/sdf1 bs=4096 skip=150GB count=40GB | gzip > img2.gz

第三:

sudo dd if=/dev/sdf1 bs=4096 skip=190GB count=120GB | gzip > img3.gz

话虽如此,我不确定“GB”后缀是否能达到您的预期效果。我认为它只是对其后的根号进行原始计算,而不是弄清楚如何从您给出的块大小中获取那么多千兆字节。我会这样做:

dd if=/dev/sdf1 bs=`expr 10 * 1024 * 1024` count=`expr 15 * 1024 * 1024 * 1024`

只是为了确保数学正确。

哦,确保在复制时设备不会发生变化。否则会很糟糕。

答案2

这是我的命令行:

dd if=/dev/sda bs=4M | gzip -c | split -b 2G - /mnt/backup_sda.img.gz

它将以这种方式创建 2GB 的文件:

backup_sda.img.gz.aa
backup_sda.img.gz.ab
backup_sda.img.gz.ac

恢复:

cat /mnt/UDISK1T/backup_sda.img.gz.* | gzip -dc | dd of=/dev/sda bs=4M

希望能帮助到你。

答案3

一个简单的解决方案可能是只使用“/usr/bin/split”。它只是将文件分成几部分。您可以使用“-”作为输入文件名来从标准输入读取。split 的优点在于它很简单,它不会以任何实际方式影响工具链,您只需使用“cat”将它们重新组合在一起(或将它们传输到另一个应用程序)即可“连接”文件。

答案4

这里有几件事。首先,您列出的命令可能不会像您预期的那样工作。看起来您正试图达到 150GB,但您需要同时考虑块大小和计数(计数是块大小的块数)。因此,如果您想要 150GB,您可以执行bs=1GB count=150。然后,您可以通过添加 来从上次中断的地方继续,以便skip=150在第二次运行时跳过 150 个块(每个 1GB)。此外,要让 gzip 将其输出发送到标准输出,您需要向其传递选项-c

但是,在执行此操作之前,还有几个问题。您在这里使用 dd 是因为文件系统已损坏/损坏/等等,并且您需要逐位精确的磁盘映像副本吗?还是您只是想删除数据?文件系统感知工具可能更有效。特别是如果源文件系统未满。选项包括 tar,或者您可能需要查看类似克隆兹拉部分克隆部分图像或者对于更特定于 Windows 的选项,直接访问 Windows 文件系统,Linux的NTFS(请注意,前面提到的工具也可以不同程度地处理 Windows 文件系统)。

如果您打算使用非文件系统感知程序对分区进行操作,那么使用 dd 行(如上所述修改为正确)可能会有效。很难说压缩效果如何,但它应该比原始文件系统小。如果您对原始文件系统具有读写访问权限,则值得使用从 /dev/zero 写入的文件填充可用空间以在使用 dd 保存之前将未使用的空间清零。这将增强 gzip 压缩磁盘映像中可用空间的能力。

要对第二个块进行操作,只需skip=XXX在第二次 dd 调用中添加一些位,其中“XXX”等于count=您第一次赋予的值。如果您想在第一个块上执行 150GB,在第二个块上执行 40GB,您可以这样做:

sudo dd if=/dev/sdf1 bs=1GB count=150 | gzip -c > img1.gz

其次是:

sudo dd if=/dev/sdf1 bs=1GB skip=150 count=40 | gzip -c > img2.gz

相关内容