Solusi 1:
Kembali pada hari saya mengalami masalah serupa dengan distribusi Linux tersemat - singkirkan semua sampah sebelum mengompresi gambar.
dd if=/dev/zero of=asdf.txt
. Tunggu sampai mati. Hapus asdf.txt.
Anda baru saja menuliskan angka nol untuk semua ruang kosong di perangkat.
Sekarang ambil gambar disk dan jalankan melalui gzip. Voila, gambar jarang.
Mungkin skalanya tidak terlalu baik dan dapat menyebabkan masalah jika Anda benar-benar perlu menulis ke disk, tapi hei.
Anda dapat mengambil snapshot rsync dari disk ke volume lain, membidiknya, lalu mengambil citra disk tersebut.
Catatan:Bisa berbahaya untuk SSD, pengguna harus mempertimbangkan operasi ini sebelum melakukan.
Solusi 2:
Dengan asumsi Anda ingin menyimpan /dev/sdXN
ke /tgtfs/image.raw
dan Anda adalah root:
-
mkdir /srcfs && mount /dev/sdXN /srcfs
-
Gunakan
zerofill
atau hanya:
dd if=/dev/zero of=/srcfs/tmpzero.txt
untuk mengisi blok yang tidak terpakai dengan nol; tunggu sampai mengisi sistem file sepenuhnya lalu:
rm /srcfs/tmpzero.txt
-
Ambil gambar dengan dd dan gunakan conv=sparse untuk menekan angka nol dengan cepat:
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Jika Anda ingin menggunakan kompresi, Anda tidak perlu menekan angka nol dengan dd karena blok nol sangat dapat dikompresi:
dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw
PS:Anda harus mencatat bahwa ini bukan ide yang baik untuk ini (mengisi sistem file dengan nol) pada media penyimpanan berbasis memori flash (yaitu sistem file sumber Anda menjadi SSD) secara teratur, karena akan menyebabkan penulisan ekstensif ke SSD Anda dan mengurangi masa pakainya. (tapi tidak apa-apa untuk transfer data sesekali)
Solusi 3:
Gunakan dd, dengan opsi hitung.
Dalam kasus Anda, Anda menggunakan fdisk jadi saya akan mengambil pendekatan itu. "Sudo fdisk -l "Anda menghasilkan:
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
Dua hal yang harus Anda perhatikan adalah 1) ukuran unit, dan 2) kolom "Akhir". Dalam kasus Anda, Anda memiliki silinder yang sama dengan 8225280 Bytes. Di kolom "End" sda8 berakhir pada 525 (yaitu 525[unit]*16065*512 =~4.3GB)
dd dapat melakukan banyak hal, seperti memulai setelah offset, atau berhenti setelah jumlah blok tertentu. Kami akan melakukan yang terakhir menggunakan opsi hitung di dd. Perintah akan muncul sebagai berikut:
sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526
Di mana -bs adalah ukuran blok (paling mudah menggunakan unit yang digunakan fdisk, tetapi unit apa pun akan melakukannya selama opsi hitung dideklarasikan dalam unit ini), dan hitung adalah jumlah unit yang ingin kita salin (perhatikan bahwa kami menambah hitungan dengan 1 untuk menangkap blok terakhir).
Solusi 4:
Sedangkan /dev/zero
buka ruang disk kosong dan gunakan dd conv=sparse
/gz -c
mungkin, pada disk besar dengan ruang kosong berjalan dalam 100 GB, /dev/zero
ing sangat lambat - belum lagi seperti yang dicatat oleh jawaban lain, /dev/zero
menggunakan SDD hingga EOF.
Inilah yang saya lakukan ketika mengalami situasi ini:
-
Pada live CD lubuntu, digunakan
gparted
untuk 'mengecilkan' disk ke ukuran seminimal mungkin, membiarkan sisa ruang tidak terisi -
Digunakan
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
untuk membuat gambar yang dikompresi dengan cepat (tentu saja, Anda mungkin ingin melewatkan kompresi jika Anda memiliki ruang yang cukup untuk menyimpan data mentah (atau cenderung mengurangi pemuatan CPU) - Digunakan
dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
untuk menyalin data kembali ke disk yang berbeda - Menggunakan
gparted
lagi untuk 'memperluas' partisi
Saya belum mencobanya untuk banyak partisi tetapi saya yakin proses di atas dapat diadaptasi untuk menyalin 'partisi' jika tabel partisi pada disk tujuan dibuat terlebih dahulu dan hanya data yang terdapat dalam partisi yang disalin melalui dd
- pembacaan/penulisan offset (skip
/seek
opsi dd
, masing-masing) akan diperlukan sebagaimana mestinya.
Solusi 5:
Anda tidak bisa. dd
adalah alat tingkat sangat rendah dan tidak memiliki sarana untuk membedakan antara file dan ruang kosong.
Di sisi lain, ruang kosong akan terkompresi dengan sangat baik, jadi jika Anda hanya mementingkan ruang penyimpanan, bukan misalnya waktu menulis, maka salurkan saja melalui gzip.