dd图像大小 – 它是否等于分区的大小?

我正在使用dd在Ubuntu 14.04上创建我的启动分区的映像。 这是我第一次这样做。

在检查磁盘上的使用情况时,我使用了df -h 。 您将看到我的/dev/sda1分区大小为5.8G …

 bash$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 220G 5.8G 203G 3% / none 4.0K 0 4.0K 0% /sys/fs/cgroup udev 3.9G 4.0K 3.9G 1% /dev tmpfs 797M 976K 796M 1% /run none 5.0M 0 5.0M 0% /run/lock none 3.9G 30M 3.9G 1% /run/shm none 100M 28K 100M 1% /run/user /dev/sda5 239G 32K 239G 1% /windows 

我尝试使用以下命令在image中创建并将其保存在/tmp

 bash$ sudo dd if=/dev/sda1 of=/tmp/ubuntu.image 

它开始在我的/tmp目录中创建一个图像,但是当我检查它的进度时,图像在取消之前保持增长到30G以上。

这引起了我的一些问题:

  • 为什么磁盘映像会这么大?
  • 它会等于分区的大小吗?
  • 有没有办法将磁盘映像保持为实际使用空间的大小?
  • 有更好的工具可供使用吗?

 /dev/sda1 220G 5.8G 203G 3% / 

/dev/sda1大小为220 GB,使用的是5.8 GB。 所以:

  1. dd进行逐字节复制,因此分区的总大小很重要,而不是分区中的内容。
  2. 是。 它将增长到220 GB。
  3. 您可以使用gzipxz压缩生成的图像:

     sudo dd if=/dev/sda1 | xz > /tmp/ubuntu.image 
  4. 取决于你所谓的更好的工具。 对于某些任务,需要逐字节复制(例如,从故障磁盘恢复数据)。 在这种情况下, dd +压缩是最简单的方法。 如果没有,请考虑像partimage这样的东西。

嗯…你对dd文件的大小有很好的答案(如果未压缩的是与分区大小相同的话)。

但我在这里看到另一个问题:你有:

 bash$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 220G 5.8G 203G 3% / [...] 

…和/tmp没有安装在其他位置,因此它位于/dev/sda1 ,并且安装了/dev/sda1

所以如果你这样做:

  sudo dd if=/dev/sda1 of=/tmp/ubuntu.image 

您正在同一分区上的文件系统复制/dev/sda1分区的映像 – 这将导致:

  1. 在命令有机会完成之前填充分区(想一想),除非在运行中压缩并且很幸运,但是

  2. 记录具有该分区完全不一致副本的文件; 安装的分区在多任务操作系统中一直在变化。

根据经验, 只有在未安装分区时才进行分区。

此外,假设分区是系统的/分区,并且您以root身份执行命令,则将完全填满根分区(root保留空间将用完),并且您可能需要使用救援盘恢复混乱……

我的理解是dd完全克隆了驱动器,包括空的空间。 如果您的驱动器是220GB,则dd将生成220GB的副本,无论使用多少空间。

ServerFault上的这个答案建议通过gzip管道,这应该是压缩未使用空间的一种非常有效的方法。

 dd if=/dev/sda1 | gzip -c > /tmp/ubuntu.image 

您可能还希望首先进行碎片整理并将零写入空白区域,理论上这两者都可以使压缩效率更高。