我看过很多帖子讨论如何使用 dd 创建驱动器映像并仅存储“使用过的数据”。在提出问题/疑问之前,让我们先假设几件事。
假设
- 要克隆/映像的驱动器是 /dev/sda
- /dev/sda 是 10TB
- /dev/sda 上的已用空间为 1TB
- 图像存储到某个远程 CIFS 安装位置
疑问/问题
使用类似于cp
与--sparse=always
选项结合的命令dd
应该会生成一个稀疏文件,使得该文件显示为 1GB:
cp --sparse=always <(dd if=/dev/sda bs=8M) /mnt/remote/location/disk.img
或者像下面这样,应该压缩所有零空间:
dd if=/dev/sda1 | gzip -c > /mnt/remote/location/disk.img.gz
所以,稀疏映像文件对恢复有何影响?传输的数据是 1GB 还是 10GB(包括感知到的空白/归零空间)?这显然是评估潜在网络负载和恢复时间的考虑。
PS,我知道还有其他选项,例如 Clonezilla 和 ddrescue 之类的程序将允许恢复功能,但问题具体是关于在上述上下文中使用 dd。
谢谢。
答案1
写入 Windows CIFS 共享 SMB1
这微软的话是:“在 Windows NTFS 文件系统中,默认情况下文件不是稀疏的。应用程序或用户需要通过 FSCTL_SET_SPARSE 控制代码明确将文件标记为稀疏。”不幸的是,Linux 不会通过 SMB1 标记这些文件。据说如果您首先在 Windows 端(使用 Cygwin )将文件设为稀疏文件dd if=/dev/zero of=BigFile bs=1M count=1 seek=150000
,则可以继续从 Linux 将其写入为稀疏文件。我相信读取将未经优化。
实验
使用 RHEL6 coreutils-8.4cp --sparse=always local_file /mnt/cifs/file_on_cifs
不会写入稀疏文件。读取 CIFS 文件时,它会读取零区域(无菲埃马普优化)。在 RHEL6 中,备份和恢复都将通过网络传输整个文件;最好对其进行 gzip 压缩。
Ubuntu 14x 上的 coreutils-8.25 情况相同。
写入 Windows CIFS 共享 SMB2/SMB3
有一个2014 补丁“为 SMB2/SMB3 挂载添加稀疏文件支持”,因此希望 Windows 8.1 和其他平台的挂载共享能够支持稀疏文件。
写入 Linux CIFS 共享
当您在 Linux 客户端上安装来自某个 Linux 服务器的 Samba 共享时,即使在 SMB1 上,您也可以写入稀疏文件。没有读取优化。
答案2
您可以使用救援其-S
选项为:
-S --sparse Use sparse writes for outfile. (The blocks of zeros are not actually allocated on disc). May save a lot of disc space in some cases. Not all systems support this. Only regular files can be sparse.
您可以发出类似ddrescue /dev/sda1 /path/to/outfile