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 flash 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 進行管道傳輸即可。

相關內容