GNU/Linux >> Belajar Linux >  >> Linux

dd di seluruh disk, tetapi tidak ingin bagian kosong

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:

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

  2. 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

  3. 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.


Linux
  1. Sysadmin Linux ingin tahu:Ke mana perginya ruang disk saya?

  2. Bisakah Skrip Dapat Dieksekusi Tetapi Tidak Dapat Dibaca?

  3. Bandingkan Direktori Tapi Bukan Isi File?

  1. Apakah File Command Shuf> File Meninggalkan File Kosong, Tapi Perintah Serupa Tidak??

  2. Hard Drive Ubuntu Tidak Terdeteksi Oleh Bios Tetapi Terlihat Dalam Manajemen Disk?

  3. Inti dibuang, tetapi file inti tidak ada di direktori saat ini?

  1. tomcat berjalan, tetapi port 8080 tidak merespons

  2. Linux bagaimana cara menyalin tetapi tidak menimpa?

  3. `ssh <host>` adalah shell login, tetapi `ssh <host> <command>` bukan?