我正在使用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。因此:
dd
逐字节进行复制,因此分区的总大小很重要,而不是分区中的内容。- 是的。它将增长到 220 GB。
gzip
您可以使用或压缩生成的图像xz
:sudo dd if=/dev/sda1 | xz > /tmp/ubuntu.image
- 取决于你如何定义更好的工具。对于某些任务,需要逐字节复制(例如,从故障磁盘恢复数据)。在这种情况下,
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
您正在复制文件系统上的分区映像位于同一分区---这将导致:
填充分区前该命令将有机会完成(想一想),除非即时压缩并且很幸运,但是
记录一个与该分区完全不一致的副本的文件;在多任务操作系统中,已安装的分区一直在变化。
根据经验,你dd
有一个分区仅当未安装时。
此外,由于该分区是/
您的系统的分区,并且您正在以 root 身份执行该命令,那么您将完全填满您的根分区(根保留空间将被用完),并且您可能需要使用救援磁盘启动来恢复混乱...
答案3
据我所知,这dd
会对驱动器进行精确克隆,包括空白空间。如果您的驱动器是 220GB,dd
则会制作 220GB 的副本,无论使用了多少空间。
ServerFault 上的这个答案建议使用管道gzip
,这应该是压缩未使用空间的一种非常有效的方法。
dd if=/dev/sda1 | gzip -c > /tmp/ubuntu.image
您可能还希望先进行碎片整理,然后将零写入空白空间,从理论上讲,这两种方法都可以使压缩更有效率。