我已经从 HostA 创建了 HDDA(分区)的映像备份并保存在 HostB 上
ssh -c blowfish user@ip-or-hostname "dd if=/dev/sda1 | gzip -1 -" | dd of=sda1.gz conv=sync,noerror
HDD 大小为 200GB,创建的映像约为 45GB。
与驱动器大小相比,图像大小是否正确?它的压缩量是否达到约 77% 的压缩量?
我的想法是:
我现在想格式化 LVM2_member 驱动器并将其再次创建为 ext3,然后我将恢复为其创建的映像,以便可以访问我正在查找的数据。
谢谢你!
答案1
磁盘映像的可压缩性在很大程度上取决于其中存储的数据类型、已使用或曾经使用过的数据量(在该驱动器的整个生命周期内不会被明确擦除)。
简而言之,无法判断。 77% 是完全合理的,0%(一个充满视频/oggs 的磁盘)和 99%(一个空的、最近被零擦除的磁盘)也是如此。
现在,对您的命令进行一些评论:
ssh -c blowfish user@ip-or-hostname "dd if=/dev/sda1 | gzip -1 -" |
dd of=sda1.gz conv=sync,noerror
它们conv=sync,noerror
用于从磁盘读取。dd
是一个愚蠢的应用程序,它只是从源文件进行固定大小的读取并向目标文件进行固定大小的写入。
如果磁盘发生故障,并且某个扇区发生故障,则 512 字节的固定大小读取可能会失败并且不返回任何内容。如果dd
要在该扇区的输出上写入 0 字节,则意味着由于数据将被移动,目的地已损坏。相反,您想要的是将 512 字节的零输出到目的地以替换该故障扇区。这就是conv=sync
部分。
另外,您不希望它在第一个错误 => 处停止conv=noerror
。
dd
现在,这仅对读取块设备(左侧)有用dd
您的右侧dd
正在从 ssh 进程提供的管道中读取数据。再次dd
从该管道中一次读取 512 个字节。如果ssh
不以大小不是 512 倍数的块的形式写入输出怎么办?然后,dd
最终可能会从该管道读取不完整的 512 个块,并用conv=sync
填充它们zeros
,从而损坏压缩文件。
你在这里想要的是:
ssh -c blowfish user@ip-or-hostname "dd if=/dev/sda1 conv=sync,noerror |
gzip -1" > sda1.gz
或者使用lzop
而不是gzip
更快,即使压缩效果不佳,并且至少能够在其页脚中记录大于 4GB 的未压缩大小。