dapatkah 'dd' digunakan untuk mengkloning ke HDD yang lebih kecil, mengetahui bahwa partisi perlu diedit?

14

Saya sudah terbiasa ddmengkloning disk seperti ini:

 dd if=/dev/sdb of=/dev/sda bs=4096 conv=notrunc,noerror,sync

Dan itu selalu berhasil. Setiap dan semua dokumen di 'dd' bersusah payah untuk mengingatkan Anda bahwa disk target harus berukuran sama atau lebih besar dari sumbernya. Apakah itu mutlak harus benar?

Sekarang, saya cukup mengerti bahwa jika saya mengkloning ke disk yang lebih kecil saya tidak dapat mengharapkan partisi yang bahkan sebagian 'di luar batas' pada target menjadi utuh.

Namun, mengetahui sepenuhnya bahwa saya perlu mengedit partisi saya pada target nanti, menghapus yang 'out of bounds', bisakah saya masih menggunakan 'dd' untuk membuat salinan brute force dari sumber hingga batas-batas yang ukuran fisik target? Atau akankah 'mengurangi' target menjadi tumpukan rongsokan merokok ketika mencapai batas ukurannya ;-)

BTW, meneliti ini, saya telah melihat nilai-nilai yang direkomendasikan untuk bs=segala sesuatu dari bs=1024sampai bs=32M, apa yang sebenarnya yang terbaik?

Ray Andrews
sumber
Catatan, jika menggunakan dd penghitungan ukuran blok optimal berguna
Wilf

Jawaban:

7

Drive fisik seharusnya tidak mulai merokok, setidaknya, tetapi kemungkinannya sangat baik bahwa sistem file Anda tidak akan berfungsi lagi (maksud saya, sistem file target; jika Anda hanya menyalin dan tidak menyentuh apa pun di sumbernya, sumber itu sendiri harus baik-baik saja) ). Data di dalam partisi tidak selalu dialokasikan dalam urutan yang meningkat. Beberapa di antaranya mungkin ada di akhir partisi bahkan jika partisi tidak penuh (sebenarnya, saya pikir ini terjadi secara deterministik dengan beberapa filesystem, tetapi saya tidak cukup tahu untuk mendapatkan rinciannya). Data di sana mungkin penting untuk integritas sistem file. Jadi saya sangat menyarankan Anda untuk tidak mengandalkan salinan seperti itu.

Jika Anda ingin melakukan salinan ini, pertama-tama Anda harus mengecilkan partisi dengan beberapa alat yang menyadari struktur internal dan mampu memetakan semuanya dengan baik menjadi partisi yang lebih kecil. Kemudian Anda bisa melakukan copy. gpartedadalah antarmuka GUI yang baik untuk melakukan hal-hal semacam ini.

Untuk bsnilainya, biasanya ide terbaik adalah memiliki beberapa tes sebelum memulai salinan yang sebenarnya. Ada beberapa alat yang membantu Anda mengotomatiskan pemeriksaan ini, tetapi saya tidak ingat namanya. Dalam pengalaman saya, kisaran terbaik biasanya antara 4M dan 16M. Lebih tinggi dari itu Anda tidak menghasilkan banyak lagi. Tetapi itu tergantung pada banyak hal, termasuk disk itu sendiri. Sebagai contoh, saya jarang bekerja dengan disk high-end nyata, yang mungkin cocok untuk nilai yang lebih tinggi karena kecepatan dan ukuran cache yang lebih besar.

EDIT Jika sebuah partisi sepenuhnya disalin, maka Anda dapat menggunakannya tanpa masalah. Namun, seperti yang digarisbawahi oleh orang lain, Anda juga harus yakin bahwa tabel partisi masih utuh (setidaknya, entri yang relevan). Dengan empat partisi utama MBR tidak ada masalah, karena mereka dijelaskan dalam 512 byte pertama dari disk. Partisi logika dijelaskan di seluruh partisi yang diperluas, sehingga entri mungkin hilang (tetapi mereka akan menggambarkan partisi yang akan hilang pula). Dengan GPT ada salinan tabel partisi baik di awal dan di akhir disk. Anda kehilangan yang kedua, tetapi Anda dapat membangunnya kembali dari yang pertama. Tentu saja disarankan untuk melakukan itu sesegera mungkin; jawaban lain lebih tepat sehubungan dengan itu.

Giovanni Mascellani
sumber
Silakan lihat pertanyaan yang diedit :)
Ray Andrews
1
@rayandrews Tidak yakin pembaruan apa yang Anda harapkan, tetapi pada dasarnya ddmenyalin byte. Itu akan dimulai pada byte 0, dan terus menyalin sampai sesuatu (dalam kasus Anda, akhir media di tujuan) menghentikannya. Itu akan meninggalkan Anda dengan tabel partisi yang menentukan drive lebih besar dari kenyataan dan partisi di luar drive ... tetapi jika Anda memperbaikinya, itu akan baik-baik saja. Meskipun mungkin akan lebih mudah menggunakan dd per-partisi untuk menyalin data. [Ini juga akan meninggalkan Anda dengan semua masalah dd normal, seperti duplikat UUID]
derobert
Yang saya suka adalah ia membuat dan memberi label partisi dan sistem file saat berjalan - sangat menghemat waktu. Benar tentang UUID ya.
Ray Andrews
1
bagaimana Anda mengembalikan tabel gpt kedua?
user230910
2

Meskipun pada awalnya "tantangan" yang diusulkan mungkin tampak sulit, tidak layak atau terdengar naif seperti yang dikomentari oleh beberapa orang, itu tidak. Gagasan utama di balik menggunakan dd untuk bermigrasi dari disk yang lebih besar ke yang lebih kecil baik-baik saja dan memiliki manfaat untuk memigrasi data. Tentu saja, memiliki ruang kosong yang cukup sehingga data yang ditempati sesuai dengan disk tujuan adalah persyaratan yang diperlukan.

Idenya adalah untuk berpikir dalam melakukan setiap partisi secara individual dan bukan seluruh disk sekaligus seperti yang awalnya diusulkan. Bahkan lebih banyak yang dapat dicapai: Partisi yang akan terpotong juga dapat dimigrasi dengan aman dengan sedikit bantuan alat bantu ukuran ulang sistem file. Memang, migrasi semacam itu menarik untuk mempertahankan matadata filesystem dan atribut file diperluas yang tidak dapat dengan mudah disalin dengan alat-alat seperti cp, rsync, pax, ... yang beroperasi di lapisan sistem file dan tidak memblokir lapisan perangkat. Menggunakan dd elliminates kebutuhan menginstal ulang OS atau harus menandai ulang FS untuk menghindari masalah dengan SELinux.

Di bawah ini adalah apa yang biasanya saya lakukan untuk menyelesaikan tugas serupa:

1) Pertama, Anda harus mengurangi filesystem di dalam partisi yang terpengaruh yang akan terpotong. Untuk ini, gunakan alat resize2fs (dengan asumsi kita berbicara tentang ext2 / ext3 / ext4 fs - FS modern lainnya juga memiliki alat pengubah ukuran untuk tujuan yang sama). Perhatikan bahwa meskipun - untuk alasan yang jelas - sistem file tidak boleh lebih besar dari partisi di dalamnya, ia dapat dengan aman menjadi lebih kecil. Trik keamanan di sini adalah mengurangi "lebih dari yang dibutuhkan". Misalnya: bayangkan Anda memiliki sistem file 1TB yang ingin Anda migrasi ke drive 500 Gig. Dalam hal ini, saya sarankan mengurangi fs menjadi, katakanlah, 450 Gig (Anda harus memiliki cukup ruang kosong untuk ini, tentu saja, yaitu, ruang yang saat ini ditempati dalam sistem file ini tidak dapat melebihi 450 Gig). Ruang kosong sebesar 50 Gig jelas akan diperbaiki setelah migrasi data.

2) Partisi disk tujuan dengan geometri yang sesuai mengingat batasan ruangnya;

3) dd data menggunakan perangkat partisi dan bukan perangkat disk (yaitu, gunakan dd if=/dev/sda# of=/dev/sdb#untuk setiap partisi daripada menggunakan if=/dev/sda of=/dev/sdb). CATATAN: sda dan sdb di sini hanyalah beberapa contoh; CATATAN PENTING: Ketika melakukan dari perangkat partisi yang lebih besar ke yang lebih kecil, dd akan mengeluh tentang upaya untuk menulis posting ke akhir perangkat blok, itu ok karena data sistem file akan sepenuhnya disalin sebelum mencapai titik itu. Untuk menghindari pesan kesalahan seperti itu, Anda dapat menentukan ukuran salinan yang digunakan bs=dan count=parameter yang cocok dengan ukuran sistem file menyusut, tetapi ini akan memerlukan beberapa perhitungan (sederhana), tetapi jika dilakukan secara salah dapat membahayakan data Anda.

4) Setelah melakukan data, ubah ukuran sistem file masing-masing dalam partisi tujuan menggunakan size2fs lagi. Kali ini tidak menentukan ukuran sistem file baru. Ketika dijalankan tanpa spesifikasi ukuran, resize2fs menumbuhkan filesystem sehingga menempati ukuran maksimum yang diizinkan, jadi, dalam hal ini, sistem file 450 Gig akan tumbuh lagi untuk menempati seluruh partisi 500 Gig dan tidak ada byte yang akan terbuang. (Pendekatan "kurangi lebih dari yang dibutuhkan" menghindari Anda untuk secara tidak sengaja menentukan ukuran yang salah dan membahayakan data Anda. Perhatikan bahwa unit GB vs GiB bisa rumit).

Catatan untuk operasi yang lebih kompleks: Jika Anda memiliki boot manager yang ingin Anda salin, yang sangat mungkin terjadi, Anda dapat menemukan beberapa KB pertama dari disk menggunakan perangkat disk alih-alih perangkat partisi (seperti dd if=/dev/sda of=/dev/sdb bs=4096 count=5), dan kemudian mengkonfigurasi ulang geometri di / dev / sdb (yang sementara akan berisi geometri yang tidak valid untuk drive baru tetapi boot manager yang utuh dan valid). Terakhir, lanjutkan menggunakan perangkat partisi seperti dijelaskan di atas untuk melakukan partisi pada suatu waktu. Saya melakukan operasi seperti ini berkali-kali. Baru-baru ini, saya berhasil melakukan migrasi kompleks ketika memutakhirkan dari HDD yang berisi campuran instalasi MacOSX & Linux ke SDD yang lebih kecil di MacMini6,2 saya. Dalam hal ini, saya harus mem-boot Linux dari drive eksternal, melakukan bootmanager, menjalankan gdisk untuk memperbaiki GPT di disk baru dan akhirnya menemukan setiap partisi yang berisi filesystem yang menyusut. (Perhatikan bahwa skema partisi GPT menyimpan dua salinan tabel partisi, satu di awal dan satu lagi di akhir disk. gdisk banyak mengeluh karena tidak dapat menemukan salinan kedua dari PT dan karena partisi melebihi ukuran disk, tetapi itu benar memperbaiki masalah salinan PT setelah Anda mendefinisikan ulang geometri disk). Ini adalah kasus yang jauh lebih kompleks, tetapi patut disebutkan karena menggambarkan bahwa operasi semacam ini juga sangat mungkin dilakukan.

Semoga berhasil! ... dan yang paling penting ingatlah untuk membuat cadangan semua data penting sebelum operasi semacam itu. Sebuah kesalahan dan Anda pasti dapat merusak data Anda secara tidak dapat diperbaiki.

Dan kalau-kalau saya tidak cukup menekankan: buat cadangan data Anda sebelum migrasi! :)

Marcelo
sumber
Penjelasan yang sangat bagus, terima kasih!
nirvana-msu
1

Jika Anda ingin memasukkan mobil di lorong yang 20cm lebih sempit dari mobil, dan Anda memotong 20cm kiri mobil, apakah mobil masih bekerja? Mungkin tidak.

Jika Anda menyalin awal disk ke disk lain dan memotong salinan pendek karena disk target lebih kecil, hasilnya tidak akan berfungsi. Bahkan jika akan ada cukup ruang untuk memuat semua file pada disk target, memotong setelah N byte dari awal disk tidak akan memberi Anda sistem file yang berfungsi.

Jika disk dibagi dalam partisi bergaya PC (GPT atau MBR), maka semua partisi yang sepenuhnya sesuai dengan target akan berfungsi. Ada satu pengecualian: dengan partisi MBR, jika partisi logis tidak diberi nomor dalam urutan disk, maka segera setelah rantai meninggalkan area target, partisi tidak akan lagi terdaftar. (Jika Anda tidak mengerti ini, itu satu alasan lagi untuk tidak melakukan salinan disk parsial.) Akan lebih masuk akal untuk menyalin partisi yang ingin Anda simpan, daripada menyalin dari awal dan mengakhiri dengan apa pun yang cocok . Partisi yang disalin sebagian pada akhirnya tidak akan dapat digunakan.

Jika disk atau partisi parsial adalah volume fisik LVM, dan Anda membuat salinan parsial dari volume fisik itu, Anda tidak dapat memastikan untuk mendapatkan data yang berguna dari hasilnya.

Jika Anda ingin menyalin hanya beberapa data dari disk besar ke disk yang lebih kecil, buat partisi di disk yang lebih kecil. Jika Anda ingin menyalin partisi ke partisi ukuran yang sama, Anda dapat melakukannya dengan cat. Jika Anda ingin menyalin partisi ke partisi yang lebih kecil, buat sistem file pada partisi target dan lakukan salinan level file dengan sesuatu seperti cp -aatau pax -rw -pe -t.

Anda dapat menggunakannya ddsebagai ganti catjika Anda seorang masokis. ddmemiliki sintaks aneh dan biasanya lebih lambat daripadacat kecuali jika Anda menemukan ukuran buffer yang tepat. Tidak ada nilai optimal tunggal untuk ukuran buffer, itu tergantung pada karakteristik perangkat keras Anda. Jika ukurannya terlalu kecil, ddakan membuang waktu membuat banyak transfer kecil. Jika ukurannya terlalu besar, ddakan membuang waktu untuk membaca satu buffer sebelum mulai menulis yang berikutnya. Ukuran optimal untuk transfer disk ke disk biasanya beberapa megabyte (1024 byte sangat kecil). catakan memilih ukuran yang layak tanpa usaha di pihak Anda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Yup, saya baik-baik saja dengan kehilangan partisi terakhir. Pada semua disk saya, semua hal penting selalu cocok dengan ukuran bahkan disk terkecil saya. Partisi di luar itu selalu tidak penting. Masalahnya dengan 'cat' adalah ia tidak akan membuat partisi atau MBR (kecuali saya salah)
Ray Andrews
@rayandrews Jika Anda menjalankan catseluruh disk, ia akan membuat partisi yang sama (dengan peringatan untuk partisi MBR, lihat edit saya). Hal yang sama berlaku untuk dd, menggunakan ddhanyalah cara yang rumit untuk dilakukan cat. Jika Anda menjalankan catpartisi, maka tentu saja itu tidak akan membuat partisi; gunakan fdisk / gdisk / parted / ... untuk itu.
Gilles 'SO- stop being evil'
Sangat menarik. OK, tunjukkan saya contoh perintah, maka saya akan mencobanya, dan jika bagus ini adalah solusi terbaik.
Ray Andrews
@rayandrews Contoh perintah untuk melakukan apa?
Gilles 'SANGAT berhenti menjadi jahat'
Hanya perintah sampel menggunakan 'cat' untuk mengkloning disk. Jadikan itu jawaban baru sehingga saya bisa menerimanya.
Ray Andrews
0

Saya ingin berbagi pengalaman saya dengan topik ini, jika ini terbukti bermanfaat bagi pembaca lain. Baru-baru ini saya menggunakan DDRESCUE untuk memulihkan 1/3 pertama partisi NTFS dari hard drive yang tidak berfungsi, dan berhasil membangun kembali segmen partisi yang dipulihkan ke hard drive yang lebih kecil - dengan demikian menyelamatkan file yang diambil (dan kehilangan sisanya). Berikut ini adalah langkah-langkah yang saya ambil untuk melakukannya (pasti pendekatan HACKSAW !!) ...

Hard drive sumber terdiri dari 750GB yang diformat dalam NTFS dengan file MBR. Saya telah menggunakannya hanya beberapa kali untuk membuat cadangan file, sehingga sebagian besar file berada di awal drive, sekitar 160GB. Anggota keluarga mengetuk hard drive (dipasang eksternal) ke lantai - tidak pernah berfungsi dengan benar setelah itu! Menggunakan ddrescue (susah payah) saya bisa memulihkan sebagian besar awal drive. Karena kerusakan fisik, menutup sangat sering selama proses ...

Saya punya hard drive laptop kecil yang tersedia 150GB (dipasang secara eksternal), yang saya ekstrak langsung ke data ddrescue. Atau saya bisa mengekstraksi data ke file gambar, dan kemudian me-mount file tersebut, namun saya pikir menulis data langsung ke hard drive menjadi lebih mudah.

Trik kunci untuk penyelamatan adalah mengedit secara manual data MBR dan Sektor Boot NTFS pada hard drive penyelamatan. Tanpa melakukan hal itu, hard drive tidak dikenali oleh sistem operasi apa pun. Saya tidak dapat menemukan program yang cocok di linux untuk melakukannya, jadi saya beralih ke windows. Ada paket praktis bernama Alat Dukungan Windows, tidak lagi dipelihara namun tetap bermanfaat (lihat tautan di bawah)! Alat yang saya gunakan untuk mengedit partisi adalah Disk Probe. Pastikan untuk mengetahui nilai sektor akhir dari hard drive Anda (saya menggunakan fdisk -l di Ubuntu)

https://en.wikipedia.org/wiki/Windows_Support_Tools

Menggunakan kalkulator yang bagus dan beberapa kreativitas, saya memuat dan memasang hard drive ke Disk Probe di Windows dan mengedit nilai-nilai sektor akhir. Dalam MBR, dua set nilai harus diubah, yaitu a) sektor ujung hard drive dan b) sektor ujung partisi NTFS. Di Sektor Boot NTFS nilai Total Sektor partisi harus diubah. Dalam setiap kasus, nilai numerik diturunkan untuk mencocokkan "dimensi" hard drive yang lebih kecil (sektor akhir diubah dari 750GB menjadi 150GB). Klik tab Lihat untuk mengedit nilai-nilai ini.

Berikut ini adalah gambar Disk Probe yang sedang bekerja mengedit data Sektor Boot NTFS Alat Dukungan Windows - Disk Probe

Setelah mengedit bidang yang disebutkan di atas, Windows mengenali partisi tersebut sebagai partisi yang valid meskipun rusak. Saya memasukkan command prompt dan menjalankan program windows Chkdsk pada hard drive yang rusak (chdsk D :). Sungguh menggetarkan melihat partisi itu kembali hidup, file demi file! Program membangun kembali tabel partisi dan berhasil memetakan kembali semua file yang telah disalin dari hard drive yang rusak. File yang berada di luar jangkauan (tidak disalin) tidak ditemukan dan karenanya dihilangkan.

Bagian selanjutnya saya tidak mengerti alasannya, karena windows berhasil membangun kembali 150GB hard drive dengan file yang disertakan. Meskipun demikian windows secara asli tidak dapat membuka partisi hard drive untuk melihat file (ada beberapa kesalahan). Namun Ubuntu menyelamatkan! Saya reboot ke Ubuntu, memasang hard drive eksternal, dan tanpa masalah sama sekali, semua file yang dipulihkan muncul!

Semoga metode gergaji besi ini memulihkan file dari hard drive besar ke hard drive yang lebih kecil akan terbukti bermanfaat bagi beberapa jiwa miskin lainnya selain saya. Bersulang!

Dan Gardner
sumber
1
Anda jelas menaruh banyak pemikiran dalam jawaban ini. Sayangnya, itu tidak benar-benar menjawab pertanyaan itu. " ddrescuebukan merupakan turunan dari dd, juga tidak terkait dengan ddcara apa pun kecuali keduanya dapat digunakan untuk menyalin data dari satu perangkat ke perangkat lainnya. Perbedaannya adalah bahwa ddrescue menggunakan algoritma canggih untuk menyalin data dari drive yang gagal menyebabkan mereka hanya sedikit Kerusakan mungkin. " - Wikipedia. Selanjutnya, jawaban Anda tampaknya difokuskan terutama pada lingkungan operasi Windows, yang bukan konfigurasi khas di sini
Fox
1
Sebagai penanya asli, saya belum menemukan pengalaman Dan yang paling membantu, ada baiknya untuk mengetahui apa yang dapat dilakukan dalam situasi putus asa, tentu saja itu adalah periferal untuk utas yang tepat ini, tetapi jangan terlalu ketat.
Ray Andrews
0

Anda harus menyusutkan partisi pada sumber terlebih dahulu (atau menghapus yang di luar batas).
Daripada dddan setelah Anda mungkin akan perlu memperbaiki tabel partisi dengan menggunakan gdisk /dev/sd<target>
dan urutan kunci untuk memperbaiki tabel adalah v r d w
saya sarankan Anda untuk merobek partisi sedikit lebih kecil dari yang dibutuhkan dan setelah memperluas mereka kembali ke ukuran penuh dari disk target.
(Jawaban ini didasarkan pada pengalaman pribadi saya ketika mengkloning HDD saya ke SSD yang lebih kecil)

Zhigalin - Pasang kembali CM
sumber
+1. Metode ini juga berfungsi untuk saya: kloning berfungsi ketika semua partisi masuk dalam drive target :-) Hanya satu komentar: Anda perlu memperbaiki tabel partisi cadangan tabel GUID partiiton (GPT), tetapi jika ada MSDOS gaya lama tabel partisi, tidak ada tabel partisi cadangan untuk diperbaiki.
sudodus