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上。

    早在我遇到了embedded式Linux发行版的类似问题之前 – 在压缩映像之前摆脱所有垃圾。

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

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

    现在拿一个磁盘映像并通过gzip运行。 瞧,稀疏的形象。

    如果你真的需要写入磁盘,可能不会很好地扩展,并可能导致问题,但是,嘿。

    您可以将磁盘的rsync快照转换为另一个卷,然后获取该磁盘映像。

    注意:可能对SSD有危险,用户应该考虑这个操作。

    假设你想把/dev/sdXN保存到/tgtfs/image.raw ,你是root:

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

    2. 使用zerofill或者只是: 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)

    假设驱动器的其余部分是空的(全零),你可以通过gzip来pipeDD,这应该很好地压缩空的空间。 你可以使用像zerofree这样的工具,以确保你的空白空间实际上是空白的,所以它压缩很好。

    如果您使用像partimage , clonezilla或其他一些linux克隆工具的工具,他们会自动为您处理大部分这些工具。

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

    另一方面,空的空间将会非常好地压缩,所以如果你只关心存储空间,而不是写时间,那么只需通过gzippipe道。

    虽然/dev/zero可用磁盘空间并使用dd conv=sparse / gz -c是可能的,但是在空闲空间运行在100 GB的巨大磁盘上, /dev/zero ing会非常慢 – 更不用说了作为其他答案指出, /dev/zero SDD到EOF。

    这是我遇到这种情况时所做的:

    • 在一张lubuntu live CD上,使用gparted将磁盘“缩小”到最小可能的大小,剩下的空间未被分配

    • 用过的
      dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz来创build快速压缩的图像(不用说,如果您有足够的空间存储原始数据(或者倾向于减lessCPU负载),则可能需要跳过压缩)

    • 用过的
      dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY将数据复制回不同的磁盘
    • 再次使用gparted来“扩大”分区

    我还没有尝试过多个分区,但我相信上面的过程可以适应复制“分区”,如果目标磁盘上的分区表首先创build,只有分区中包含的数据通过dd复制 – 读取/写入偏移量(分别为dd skip / seek选项)将被要求。

    使用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来捕获最后一个块)。