Kloning seluruh partisi atau hard drive ke file yang jarang

35

Saya suka mengkloning seluruh partisi atau seluruh hard drive ke disk eksternal yang lebih besar tetapi ingin membuat file yang jarang. Saya sering menggunakan dduntuk kloning, tetapi tidak mendukung file jarang. Sebagai solusi saya menggunakan sesuatu seperti:

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Namun ini agak terlalu rumit untuk seleraku dan tidak memungkinkan saya untuk melanjutkan proses jika dibatalkan. Sangat lucu bahwa ada alat NTFS untuk ini ( ntfsclone) tetapi tidak ada alat seperti itu untuk sistem file asli Linux (EXT2-4).

Apakah ada alat yang lebih baik untuk ini, misalnya ddvarian dengan dukungan jarang? Saya tidak mencari beberapa perangkat lunak berpemilik untuk cadangan disk tetapi hanya ingin membuat salinan klon yang jarang yang dapat saya pasang sebagai perangkat loop jika diperlukan.

Martin Scharrer
sumber
7
+1 untuk penggunaan kreatif cp, tidak pernah terpikir oleh saya bahwa Anda jarang menyalin gambar disk. Saya selalu hanya mengompres mereka jika saya perlu menghemat ruang. Sekarang mengapa itu dalam pertanyaan bukan jawaban?
Caleb

Jawaban:

21

Kamu ingin dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw
Steven Pritchard
sumber
1
Besar! Manual mengatakan "Jika proses penyalinan terganggu oleh pengguna, dimungkinkan untuk melanjutkan pada posisi apa pun nanti." dan "-sebuah penulisan file spArse (default = no)". Apa yang saya inginkan! Terima kasih!
Martin Scharrer
3
Mencari dd_rescueonline saya menemukan bahwa ada juga alat yang berbeda yang disebut ddrescue(tanpa garis bawah) yang dikembangkan secara independen dari dd_rescuetetapi tampaknya pada dasarnya melakukan hal yang sama. Saya hanya menyebutkan bahwa di sini sebagai FYI umum.
Martin Scharrer
Ya, dd_rescuedan ddrescuebukan hal yang sama. Secara teoritis mereka melakukan pekerjaan yang sama, tetapi umumnya saya lebih beruntung dengan yang lebih tua / asli dd_rescue.
Steven Pritchard
1
Jika ada yang bertanya-tanya, Anda dapat menghentikan salinan kapan saja dengan Ctrl-C. Ini akan menunjukkan posisi Anda saat ini, dan Anda dapat menggunakan nilai itu untuk memulai kembali dengan menambahkan -sdan posisi ke perintah asli. (Jadi akan terlihat seperti dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
Steven Pritchard
1
@ Seven Pritchard: Tidak perlu mengingat posisi. Tentukan nama file ketiga, yang akan menjadi file log, dan saat restart itu akan membacanya dan mengambil di mana itu ditinggalkan.
Tanith Rosenbaum
20

Hanya untuk melengkapi panggilan untuk ddrescue . The --sparseatau -Sbendera memungkinkan tujuan yang akan ditulis jarang:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

Atau dengan opsi panjang:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

Atau jika Anda lebih suka MiBs :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Agar penyelamatan terputus dan dilanjutkan, Anda juga dapat menggunakan file log:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Perhatikan bahwa GNU ddrescuedan dd_rescueprogram yang berbeda. Tetapi GNU ddrescuetampaknya lebih luas. Misalnya sudah dikemas dengan GRML .

maxschlepzig
sumber
Apakah perlu ada perlakuan khusus pada gambar saat memulihkan, dapatkah Anda memberikan perintah yang digunakan untuk memulihkan ddrescue?
user12439
Dalam teori media penyimpanan yang Anda gunakan untuk menyelamatkan seharusnya lebih dapat diandalkan, sehingga Anda biasanya dapat hanya menggunakan dd untuk menulis ke disk pengganti: dd if=sda1.raw of=/dev/sdb1. Namun, untuk menggunakan ddrescue untuk pemulihan, Anda cukup mengubah sumber / tujuan yang Anda gunakan untuk penyelamatan ke sumber / tujuan baru, lebih disukai dengan file log baru. Jika mungkin (sering kali tidak), Anda tentu saja dapat menggunakan ddrescue untuk menyalin data langsung dari disk sumber yang buruk ke disk pengganti.
zaTricky
3

Ada tambalan yang ditawarkan pada 2007 untuk memberikan dukungan file yang jarang di GNU dd, tetapi tampaknya belum membuatnya menjadi coreutils (setidaknya tidak pada 8,4). Saya ragu dd telah berubah terlalu banyak sejak itu, tambalan mungkin berlaku terhadap versi saat ini tanpa banyak pekerjaan.

Saya juga sangat terkesan dengan penggunaan kreatif dari cppertanyaan Anda, dan itu membuat saya di jalur menggunakannya untuk menyelesaikan kembali (di sini dilanjutkan dari ~ 80 juta ke sumber):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Edit: goreskan itu. Yang kedua ddtentu saja mencari posisi yang salah dalam file output, karena itu tidak sama panjang dengan input.

Eli Heady
sumber
1
Seperti halnya dengan jawaban bhinesley, akan lebih baik untuk mencatat kemajuan dd untuk melanjutkan secara akurat. Jika Anda menggunakan pendekatan ini untuk menjalankan pertama dan melanjutkan, dan mencatat kedua paralel dd secara independen, maka Anda bisa tahu seberapa jauh ke dalam output untuk mencari. Jika saya punya waktu saya akan mencoba untuk menyelesaikannya.
Eli Heady
2
Terima kasih atas tautannya ke tambalan. Saya mulai berpikir tentang memprogram sesuatu seperti itu sendiri :-) File jarang tidak dapat ditampilkan sehingga kode Anda tidak akan berfungsi.
Martin Scharrer
Yup, saya baru tahu sendiri. Oh well, itu menyenangkan menemukan kegunaan baru gila cp- terima kasih!
Eli Heady
1
dd commit at 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: tambahkan dukungan untuk opsi conv = sparse" ("(iwrite): Konversi penulisan blok NUL menjadi pencarian jika diminta. ")
osgx
1

Hanya menambahkan 2 sen saya. Cara lain untuk membuat file jarang dari disk mentah adalah dengan qemu-img menggunakan sesuatu seperti:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Anda dapat menggunakan ini pada satu partisi juga. Selain itu, Anda memiliki opsi untuk mengubah disk mentah / partisi menjadi format lain apa pun yang didukung qemu-img (QCOW2, VHD [x], vmdk, dll.)

Gabriel Samfira
sumber
1

Pilihan lain adalah rsync . Sebagai contoh:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Penjelasan:

  • -S/ --sparseuntuk melewati blok yang jarang di tulis
  • -P/ --partial --progressuntuk menunjukkan kemajuan dan menyimpan sebagian file yang ditransfer
  • --copy-devices untuk menyalin konten perangkat

Anda dapat menambahkan --appenduntuk melanjutkan salinan yang terputus (atau --append-verifyuntuk mengkonfirmasi checksum atas kecocokan data baru dan lama).

Sunting : Saya baru saja menyadari copy-devices.diff sedang dalam pertimbangan dan mungkin tidak ada pada banyak sistem (meskipun disertakan oleh Fedora , Ubuntu , Debian , dan lainnya)

Kevinoid
sumber
0

Catatan: ini tidak berfungsi karena alasan yang dijelaskan dalam komentar, saya meninggalkannya di sini untuk referensi.

Pantau statistik dd dengan menggunakan kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Lanjutkan dengan menggunakan lewati / cari:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Tanpa $ i_bytes akan lebih sulit untuk melanjutkan. Mungkin paling mudah untuk mencatat statistik dd ke file seandainya mesin crash atau apa pun.

bhinesley
sumber
Yang kedua cphanya akan menimpa file yang ada, bukan? Saya tahu skipdan opsi lainnya dd. Masalahnya adalah cpbagiannya.
Martin Scharrer
Hm, ya, kamu benar.
bhinesley
0

Ada xfsdump dan xfsrestore untuk XFS yang telah menjadi sistem file Linux asli untuk waktu yang cukup lama.

Cristian Ciupitu
sumber
0

Mengapa tidak secara sederhana:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Zaz
sumber