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

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

/tmp我尝试使用以下命令创建图像并将其保存:

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

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

这让我想到了几个问题:

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

答案1

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

/dev/sda1大小为 220 GB,已使用 5.8 GB。因此:

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

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

答案2

嗯...你对文件的大小有很好的答案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. 记录一个与该分区完全不一致的副本的文件;在多任务操作系统中,已安装的分区一直在变化。

根据经验,你dd有一个分区仅当未安装时

此外,由于该分区是/您的系统的分区,并且您正在以 root 身份执行该命令,那么您将完全填满您的根分区(根保留空间将被用完),并且您可能需要使用救援磁盘启动来恢复混乱...

答案3

据我所知,这dd会对驱动器进行精确克隆,包括空白空间。如果您的驱动器是 220GB,dd则会制作 220GB 的副本,无论使用了多少空间。

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

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

您可能还希望先进行碎片整理,然后将零写入空白空间,从理论上讲,这两种方法都可以使压缩更有效率。

相关内容