
我有一個磁碟,例如/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:
mkdir /srcfs && mount /dev/sdXN /srcfs
使用
zerofill
,zerofree
或僅:
dd if=/dev/zero of=/srcfs/tmpzero.txt
用零填充未使用的區塊;等待它完全填滿檔案系統然後:
rm /srcfs/tmpzero.txt
使用 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 進行管道傳輸即可。