dd 整个磁盘,但不想要空部分

dd 整个磁盘,但不想要空部分

我有一个磁盘,比如 /dev/sda。

这是 fdisk -l:

 Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          27      209920   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              27         525     4000768    5  Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5              27         353     2621440   83  Linux
/dev/sda6             353         405      416768   83  Linux
/dev/sda7             405         490      675840   83  Linux
/dev/sda8             490         525      282624   83  Linux

我需要制作一个映像存储在我们的文件服务器上,以便用于刷新我们正在制造的其他设备,因此我只想要使用的空间(仅约 4gb)。我想保留 mbr 等...因为此设备应在复制完成后立即准备好启动。

有什么想法吗?我以前一直在使用dd if=/dev/sda of=[//fileserver/file],但那时我的主副本在 4gb 闪存 ide 上。

答案1

以前我遇到过与嵌入式 Linux 发行版类似的问题 - 在压缩图像之前清除所有垃圾。

dd if=/dev/zero of=asdf.txt。等它死掉。删除asdf.txt。

您刚刚将设备上的所有可用空间都写入零。

现在获取磁盘映像并通过 gzip 运行它。瞧,稀疏映像。

如果您实际需要写入磁盘,则可能无法很好地扩展并可能导致问题,但是嘿。

您可以将磁盘的 rsync 快照拍摄到另一个卷,将其清零,然后获取该磁盘映像。

注意:可能对 SSD 有害,用户在提交之前应考虑此操作。

答案2

假设您想要保存/dev/sdXN并且/tgtfs/image.raw您是 root:

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. 使用zerofillzerofree或者仅:
    dd if=/dev/zero of=/srcfs/tmpzero.txt
    用零填充未使用的块;等待它完全填满文件系统然后:
    rm /srcfs/tmpzero.txt

  3. 使用 dd 获取图像并使用 conv=sparse 即时打零:
    dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw

如果您想使用压缩,则不需要使用 dd 来打零,因为零块具有高度可压缩性:

dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw

PS:请注意,在基于闪存的存储介质(即源文件系统是 SSD)上定期进行此操作(用零填充文件系统)并不是一个好主意,因为这会导致对 SSD 进行大量写入并缩短其使用寿命。(但偶尔传输数据是可以的)

答案3

使用 dd,带有 count 选项。

在您的例子中,您使用的是 fdisk,因此我将采用该方法。您的“sudo fdisk -l”产生了:

    Disk /dev/sda: 64.0 GB, 64023257088 bytes
    255 heads, 63 sectors/track, 7783 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x0000e4b5

    Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          27      209920   83  Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2              27         525     4000768    5  Extended
    Partition 2 does not end on cylinder boundary.
    /dev/sda5              27         353     2621440   83  Linux
    /dev/sda6             353         405      416768   83  Linux
    /dev/sda7             405         490      675840   83  Linux
    /dev/sda8             490         525      282624   83  Linux

您应该注意的两件事是 1) 单位大小,以及 2) “结束”列。在您的例子中,您的磁柱大小等于 8225280 字节。在“结束”列中,sda8 终止于 525(即 525[单位]*16065*512 = ~4.3GB)

dd 可以做很多事情,例如在偏移量之后开始,或在特定数量的块之后停止。我们将使用 dd 中的 count 选项执行后者。命令如下所示:

    sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526

其中 -bs 是块大小(最简单的方法是使用 fdisk 使用的单位,但只要在这些单位中声明了 count 选项,任何单位都可以),count 是我们要复制的单元数(请注意,我们将计数增加 1 以捕获最后一个块)。

答案4

你不能。dd是一个非常低级的工具,它无法区分文件和空白空间。

另一方面,空白空间将会被压缩得非常好,所以如果您只关心存储空间,而不是写入时间,那么只需通过 gzip 进行传输即可。

相关内容