سؤال باستخدام DD لاستنساخ القرص


كان هناك عدد من الأسئلة بخصوص أدوات استنساخ الأقراص و dd تم اقتراحه مرة واحدة على الأقل. لقد فكرت بالفعل في استخدام dd نفسي ، وذلك أساسا لسهولة الاستخدام ، وأنه متاح بسهولة على جميع توزيعات لينكس القابلة للتشغيل إلى حد كبير.

ما هي أفضل طريقة للاستخدام dd لاستنساخ قرص؟ أجريت بحثًا سريعًا من Google ، وكانت النتيجة الأولى واضحة محاولة فاشلة. هل هناك أي شيء أحتاج إلى القيام به بعد استخدام ddأي ، أي شيء لا يمكن قراءته باستخدام dd؟


176
2018-05-05 18:21


الأصل


أنا على علم بكيفية عمل dd ، كان سؤالي أكثر في اتجاه أي مشاكل معروفة تتعلق بـ dd عند استنساخ الأقراص (كما هو موضح في الرابط) ، ربما لم يكن ذلك واضحا. ما تحتوي عليه إجابته ولا تحتوي على "لم يسبق لي أن واجهت أي مشاكل معه". لقد قمت بالإجابة على إجابتك أيضًا ، حيث أنك قدمت بالفعل بعض النقاط المثيرة للاهتمام (أنا أحب واحدة حول عدم وجود مؤشر تقدم). - falstro
يبدو أنك حصلت على Spolsky Bump: joelonsoftware.com/items/2009/05/29.html - Kyle Cronin
لم أشاهد هذا هنا عندما سألت (وأجبت) عن سؤال مماثل حول المتميز - superuser.com/questions/11453/... - warren
من المفارقات أن جويل يرتبط بالسؤال كمثال جيد على خطأ الخادم ، على الرغم من أن أيا من الإجابات كانت جيدة. لم يكن هناك إجابة واحدة من بين 25 (باستثناء التعليقات) مع الحق dd خيارات لتخطي كتل سيئة - وهو أمر ضروري عند استنساخ الأقراص لاستعادة. أضفت إجابة أفضل ، والتي يمكن استنساخ الأقراص وجود كتل سيئة: dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror - Sam Watkins
أعتقد أن استعادة د د قد "تفشل" إذا كان الحديث عن أنظمة الملفات المعتمدة على هندسة القرص واستعادة تتم على محركات الأقراص الثابتة غير متطابقة؟ لقد واجهت بعض الفشل في استعادة dd ، وأعتقد أن هذه كانت المشكلة في حالتي. - Marco


الأجوبة:


Dd هو بالتأكيد أفضل أداة نسخ ، فإنه سيتم إنشاء نسخة متماثلة 100٪ ببساطة باستخدام الأمر التالي. لم يسبق لي أن واجهت أي مشاكل في ذلك.

dd if=/dev/sda of=/dev/sdb bs=32M

كن على علم أنه أثناء استنساخ كل بايت ، يجب عدم استخدام هذا على محرك أقراص أو قسم يتم استخدامه. لا يمكن للتطبيقات الخاصة مثل قواعد البيانات التعامل مع هذا بشكل جيد للغاية وقد ينتهي بك الأمر مع بيانات تالفة.


152
2018-05-05 18:31



بالطبع ، طالما أن / dev / sdb على الأقل بحجم / dev / sda ... - Eddie
إضافة "bs = 100M conv = notrunc" وهي أسرع بكثير في تجربتي. - Tim Williscroft
فقط كن حذرا جدا مع الحروف "i" و "o" ... - bandi
لا أحد يعرف هذه الخدعة ... dd هو برنامج نسخ غير متناسق ، يعني أنه سيقرأ أولاً ، ثم يكتب ، ثم يعود. يمكنك توجيه الأنبوبة dd إلى نفسها وإجبارها على تنفيذ النسخة المتناظرة ، كما يلي: dd if=/dev/sda | dd of=/dev/sdb. في الاختبارات التي أجريتها ، فإن تشغيل الأمر بدون الأنبوب أعطاني معدل ~ 112kb / s. مع الأنبوب ، حصلت على ~ 235kb / s. لم أواجه أي مشاكل مع هذه الطريقة. حظا سعيدا! - Mistiry
Mistiry ، هذا ليس معنى كلمة متماثل. - psusi


لتوفير مساحة ، يمكنك ضغط البيانات التي تنتجها dd باستخدام gzip ، على سبيل المثال:

dd if=/dev/hdb | gzip -c  > /image.img

يمكنك استعادة القرص الخاص بك مع:

gunzip -c /image.img.gz | dd of=/dev/hdb

لتوفير مساحة أكبر ، يمكنك إلغاء تجزئة محرك الأقراص / القسم الذي ترغب في استنساخه مسبقًا (إذا كان ذلك مناسبًا) ، ثم فصل جميع المساحة المتبقية غير المستخدمة ، مما يسهل الأمر على ضغط gzip:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

الانتظار قليلا ، سوف تفشل في النهاية مع رسالة "القرص الكامل" ، ثم:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

يمكنك أيضًا الحصول على عملية dd قيد التشغيل في الخلفية لوضع التقرير عن طريق إرسال إشارة إليه باستخدام الأمر "قتل" ، على سبيل المثال:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

تحقق من نظامك - الأمر أعلاه لأوامر Linux و OSX و BSD dd تختلف في الإشارات التي يقبلونها (يستخدم OSX SIGINFO - يمكنك الضغط السيطرة+تي للإبلاغ عن الحالة).


104
2018-05-06 22:47



هل يعمل هذا أيضًا مع "حديث" مثل BTRFS ، NILFS ، [أيًا كان ما يمكنك أن تحلم به]؟ - Steve Schnepp
DD يعمل على أجهزة كتلة ، ومستوى التجريد أقل من نظام الملفات ، لذلك ينبغي ، نعم. أنا لم أحاول بالفعل ، على الرغم من. هم ، NILFS تبدو مثيرة للاهتمام ، سآخذ لنلقي نظرة على ذلك. - David Hicks
+1 لل kill -SIGUSR1 %1، والأمر OSX dd بسعادة يقبل SIGUSR1 ... السوبر مفيدة ، وذلك بفضل! - stuartc
+1 لـ Kill -SIGUSR1 1234 كنت أبحث عن ذلك. - hot2use
هل يجب أن تكون: dd if=/dev/hdb | gzip -c > /image.img.gz ؟ - Mike Causer


الحذر: dd'ing نظام ملفات حي يمكن أن تفسد الملفات. والسبب بسيط ، ليس لديه فهم لنشاط نظام الملفات الذي قد يحدث ، ولا يحاول التخفيف من حدته. إذا كانت الكتابة جارية جزئيا ، فستحصل على كتابة جزئية. هذا عادة ما يكون غير جيد للأشياء ، وعادة ما تكون قاتلة لقواعد البيانات. وعلاوة على ذلك ، إذا كنت المسمار حتى عرضة الخطأ المطبعي إذا و من المعلمات ، ويل لكم. في معظم الحالات، رسينك هو أداة فعالة على قدم المساواة مكتوبة بعد ظهور تعدد المهام، وسوف توفر وجهات نظر ثابتة من الملفات الفردية.

ومع ذلك ، ينبغي أن يقوم DD بالتقاط بدقة لحالة بت لمحرك غير محمّل. Bootloaders ، وحدات التخزين llvm ، UUIDs التقسيم والتسميات ، إلخ. تأكد فقط من أن لديك محرك أقراص قادرة على نسخ محرك الأقراص الهدف بت لبت.


37
2018-05-05 20:20



وأظن أن sync ليس هو الحل لمشكلة الفساد. ماذا يحدث إذا كان deamon أو شيء يكتب ملفات أكثر بعد sync، أثناء ال dd عملية؟ - Deleted
من المستحسن استخدام محرك الأقراص أولاً (أو إعادة تركيبه للقراءة فقط) ولكنه ليس دائمًا ممكنًا - Alex Bolotov
في هذه الحالة ، يمكنك استخدام rsync والسماح لها بملف مقبض السحرية للحصول على ملف متناسق وتتيح لدلالات Copy On Write التعامل مع عمليات الكتابة الواردة. - jldugger
أود أن أضيف أن تشغيل dd على نظام ملفات مركّب لن يؤدي إلى تصفية الملفات الموجودة على نظام الملفات المحمّل ، ولكن المقصود هنا هو أن تكون نسخة نظام الملفات بالضرورة في حالة جيدة معروفة. - 3molo
عن طريق rsync سوف تضمن أن البيانات الداخلية في نظام الملفات الوجهة متسقة. هذا سوف لن تأكد من أن البيانات في الملفات متناسقة - للقيام بذلك ، ستحتاج إلى تأمين الملفات وأي برامج الكتابة إلى الملفات تحتاج إلى احترام هذه الأقفال. - Martin Geisler


عند استخدام dd لاستنساخ قرص قد يحتوي على قطاعات سيئة ، استخدم "conv = noerror، sync" للتأكد من أنه لا يتوقف عندما يواجه خطأً ، ويملأ القطاع (القطاعات) المفقودة ذات البايتات الفارغة. عادة ما تكون هذه هي الخطوة الأولى التي أتخذها إذا حاولت الاسترداد من قرص فاشل أو فشل - الحصول على نسخة قبل القيام بأي محاولات الاسترداد ، ثم القيام بعملية الاسترداد على القرص (المستنسخ) الجيد. أترك الأمر لأداة الاسترداد للتعامل مع أي قطاعات فارغة لا يمكن نسخها.

أيضا ، قد تجد سرعة dd يمكن أن تتأثر بإعداد bs (حجم الكتلة). عادة ما أحاول bs = 32768 ، ولكن قد ترغب في اختبارها على أنظمتك الخاصة لمعرفة ما يناسبك. (هذا يفترض أنك لست بحاجة إلى استخدام حجم فدرة محدد لسبب آخر ، على سبيل المثال ، إذا كنت تكتب على شريط.)


26
2018-05-07 02:42



إذا كان لديك قرص به قطاعات سيئة ، فعليك استخدام "ddrescue" بدلاً من dd. إنه أكثر فعالية ، ولديه فرصة أفضل بكثير لاستعادة المزيد من البيانات. (لا تخلط مع dd_rescue ، وهي ليست جيدة) - davr
يجب عدم استخدام حجم كتلة كبير في حالة محاولة تخطي الكتل السيئة ، أو تخطيها كثيرًا. 4096 كبيرة بما فيه الكفاية. - Sam Watkins


لاستنساخ قرص ، كل ما عليك فعله هو تحديد الإدخال والإخراج إلى dd:

dd if=/dev/hdb of=/image.img

بالطبع ، تأكد من أن لديك أذونات مناسبة للقراءة مباشرة من / dev / hdb (أوصي بتشغيلها كجذر) ، و / dev / hdb ليست محملة (أنت لا تريد نسخ أثناء تغيير القرص - التثبيت كما للقراءة فقط مقبول أيضًا). بمجرد اكتمال الصورة ، سيكون image.img عبارة عن نسخة بايت للبايت من القرص بأكمله.

هناك بعض العيوب لاستخدام الأقراص المضغوطة dd. أولاً ، سيقوم dd بنسخ القرص بأكمله ، وحتى المساحة الفارغة ، وفي حالة تنفيذه على قرص كبير يمكن أن يؤدي إلى ملف صورة كبير للغاية. ثانيًا ، يوفر dd مؤشرات تقدم على الإطلاق ، والتي يمكن أن تكون محبطة لأن النسخة تستغرق وقتًا طويلاً. ثالثًا ، إذا قمت بنسخ هذه الصورة إلى محركات أقراص أخرى (مرة أخرى ، باستخدام dd) ، فيجب أن تكون كبيرة أو أكبر من القرص الأصلي ، ومع ذلك لن تتمكن من استخدام أي مساحة إضافية قد تكون لديك على القرص الهدف حتى تغيير حجم الأقسام الخاصة بك.

يمكنك أيضًا إجراء نسخة مباشرة من القرص إلى القرص:

dd if=/dev/hdb of=/dev/hdc

ولكنك لا تزال خاضعًا للقيود الواردة أعلاه فيما يتعلق بمساحة حرة.

وفيما يتعلق بالمشاكل أو القضايا ، فإن الجزء الأكبر يقوم بعمل ممتاز. ومع ذلك ، منذ فترة وجيزة ، كان لدي قرص صلب كان على وشك الموت ، لذلك كنت أستخدم لمحاولة نسخ المعلومات التي استطعت إيقافها قبل موتها تمامًا. وعلم بعد ذلك أن dd لا يتعامل مع أخطاء القراءة بشكل جيد - فهناك العديد من القطاعات على القرص التي تعذر على dd قراءتها ، مما أدى إلى الاستسلام والتوقف عن النسخ. في ذلك الوقت لم أستطع إيجاد طريقة لأخبر dd أن تستمر بالرغم من مواجهة خطأ قراءة (رغم ذلك يظهر كما لو أنه يحتوي على هذا الإعداد) ، لذلك قضيت وقتًا طويلاً في تحديد التخطّي يدويًا والسعي إلى القفز فوق الأقسام غير القابلة للقراءة.

قضيت بعض الوقت في البحث عن حلول لهذه المشكلة (بعد أن أنجزت المهمة) ووجدت برنامجًا يسمى ddrescueوالتي تعمل ، حسب الموقع ، مثل dd ولكنها تواصل القراءة حتى لو واجهت خطأ. لم أستخدم البرنامج في الواقع ، لكن الأمر يستحق النظر ، خاصة إذا كان القرص الذي تنسخ منه قديمًا ، والذي يمكن أن يحتوي على قطاعات سيئة حتى إذا بدا النظام على ما يرام.


17
2018-05-05 18:26



... دد يوفر على الاطلاق أي مؤشرات التقدم ... - حسنا هذا ليس صحيحا - هناك طريقة صعبة نوعا ما لإظهار التقدم - عليك أن تعرف pid من dd process ('ps -a | grep dd') ثم ترسل إشارة USR1 إلى هذه العملية - 'kill -USR1 < dd_pid_here> '(بدون <>) التي تضطر dd لإظهار معلومات التقدم. - Michal Bernhard
"العديد من القطاعات على القرص الذي لا يمكن قراءة dd": أعتقد ذلك conv=sync,noerror من شأنه أن يساعد. - Gauthier
ال conv=sync,noerror الخيارات ضرورية ، فهي تسمح لـ dd بتخطي الكتل السيئة وإخراجها في الصورة بحيث تتم محاذاة الأشياء بشكل صحيح. الدعائم لعدد قليل جدا من الناس الذين علقوا شيئا عن ذلك. - Sam Watkins
GNU ddrescue يوفر مؤشر التقدم دون أي خيارات خاصة ، ويمكنك إيقاف النسخ واستئناف المكان الذي تركته. - endolith
طريقة أقل صعوبة للحصول على التقدم مع dd هي إضافة الخيار status=progress - James


إذا تلف محرك الأقراص المصدر على الإطلاق ، سيكون لديك المزيد من الحظ باستخدام dd_rhelp مع dd_rescue (تفضيل شخصي) أو جنو ddrescue.

السبب وراء ذلك هو ، في أخطاء القراءة ، dd يستمر المحاولة ويحاول ويحاول - يحتمل الانتظار لفترة طويلة لحدوث المهلة. dd_rescue الأشياء الذكية مثل القراءة حتى خطأ ، ثم اختيار بقعة أخرى على القرص والقراءة إلى الوراء إلى الخطأ الأخير ، و dd_rhelp هو في الأساس dd_rescueمدير الجلسة - بدء واستئناف بذكاء dd_rescue يعمل لجعله أسرع مرة أخرى.

النتيجة النهائية ل dd_rhelp هو الحد الأقصى للبيانات المستردة في الحد الأدنى من الوقت. إذا غادرت dd_rhelp تشغيل ، في النهاية يفعل بالضبط نفس المهمة dd في نفس الوقت. ومع ذلك، إذا dd أخطاء القراءة في بايت 100 من القرص 100Gb لديك ، يجب الانتظار لفترة طويلة لاسترداد 9999،900 بايت * ، بينما dd_rhelp+dd_rescue سوف يستعيد الجزء الأكبر من البيانات بشكل أسرع بكثير.


11
2018-05-31 02:12



بعض المساعدة في الاختيار بين dd_rescue و ddrescue: askubuntu.com/a/211579/50450 - Johann


يجب ألا يحتوي قرص المصدر على أية أنظمة ملفات مثبتة. كمستخدم قادر على قراءة جهاز الكتلة (يعمل الجذر) ، قم بتشغيل 'dd if = / dev / sda ....'

الآن ، أحد الأشياء الرائعة هنا هو أنك تقوم بإنشاء تدفق من وحدات البايت ... ويمكنك القيام بالكثير مع ذلك: قم بضغطه وإرساله عبر الشبكة وقم بتقطيعه إلى نقاط أصغر ، إلخ.

على سبيل المثال:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

لكن بقوة أكبر:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

نسخ أعلاه صورة مضغوطة للقرص المصدر إلى نظام بعيد ، حيث يتم تخزينها في قطع 2G مرقمة باستخدام اسم مضيف المصدر مع الاحتفاظ بك تحديث عن التقدم.

لاحظ أنه بناءً على حجم القرص ، سرعة وحدة المعالجة المركزية على المصدر ، سرعة وحدة المعالجة المركزية على الوجهة ، سرعة الشبكة ، إلخ. قد ترغب في تخطي الضغط ، أو القيام بالضغط على الجانب البعيد ، أو تمكين ضغط ssh.


7
2018-05-29 19:23



يمكن أن يؤدي توفير 1+ عبر gzip إلى توفير الكثير من الوقت والنطاق الترددي! - M. Dudley
يجب أن أشير أيضًا إلى أن إضافة "bs = 1M" إلى الأمر dd سيؤدي إلى تحسين السرعة بشكل كبير. - retracile


لاستنساخ قرص ، كل ما عليك فعله هو تحديد الإدخال والإخراج dd:

dd if=/dev/hdb of=hdb.img

بالطبع ، تأكد من أن لديك الأذونات المناسبة للقراءة مباشرة من /dev/hdb (أوصي بتشغيل كجذر) ، وهذا /dev/hdb غير مُثبت (لا تريد النسخ أثناء تغيير القرص). بمجرد اكتماله ، hdb.img سوف يكون نسخة بايت بايت من القرص بأكمله.

هناك بعض العيوب لاستخدام dd استنساخ الأقراص. أول، dd سيقوم بنسخ القرص بأكمله ، وحتى المساحة الفارغة ، وإذا تم ذلك على قرص كبير يمكن أن يؤدي إلى ملف صورة كبير للغاية. ثانيا، dd يوفر أي مؤشرات التقدم ، والتي يمكن أن تكون محبطة لأن النسخة تستغرق وقتا طويلا. ثالثًا ، إذا قمت بنسخ هذه الصورة إلى محركات أقراص أخرى (مرة أخرى ، باستخدام dd) ، فيجب أن تكون كبيرة أو أكبر من القرص الأصلي ، ومع ذلك لن تتمكن من استخدام أي مساحة إضافية قد تكون لديك على القرص الهدف حتى تغيير حجم الأقسام الخاصة بك.

يمكنك أيضًا إجراء نسخة مباشرة من القرص إلى القرص:

dd if=/dev/hdb of=/dev/hdc

ولكنك لا تزال خاضعًا للقيود الواردة أعلاه فيما يتعلق بمساحة حرة.

يمكن حل العيب الأول عن طريق gzipping البيانات أثناء إنشاء النسخة. فمثلا:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

العيب الثاني يمكن حلها باستخدام pipeview (pv) أداة. فمثلا:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

لا أعرف بأي طريقة للتغلب على العيب الثالث.

بالإضافة إلى ذلك ، يمكنك تسريع وقت النسخ من خلال قول dd للعمل مع أجزاء أكبر من البيانات. فمثلا:

dd if=/dev/hdb of=hdb.img bs=1024

6
2018-05-29 22:03



لقد أخبرت بالفعل طريقة التغلب على العائق الثالث ... تغيير حجم الأقسام. يعد توسيع القسم عملية آمنة وسريعة بشكل عام (مقابل التقلص أو الحركة ، وهو بطيء وأكثر خطورة لأنه ينقل البيانات حوله). - davr
لن تعمل gzipping مع قرص تم استخدامه لبعض الوقت ، حيث سيتم ملؤه بالبيانات الحالية أو المحذوفة. لن تعمل gzip إلا إذا كانت المساحة الخالية صفرًا ، وهي الحالة فقط مع قرص جديد تمامًا. - Tozz
Tozz: يمكنك تحسين قابلية ضغط صورة نظام الملفات من خلال ملء نظام الملفات بملف مليء بـ 0 ، ومزامنته مع القرص ، ثم حذفه. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon  (ذكاء مودولو الإضافي في طبقة الملفات). - retracile


شيء آخر لطيف يمكنك القيام به مع أقراص dd والإنقاذ هو نسخ البيانات عبر الشبكة:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

يمكنك لصق gzip في كل من خطوط الأنابيب هذه إذا لم تكن الشبكة محلية. للتقدم ، استخدم pv. لجعل netcat local_mach إنهاء بعد الانتهاء من النسخ ، قد تضيف -w 5 أو شيء ما.


5
2018-05-29 18:09



هذا ليس صحيحا تماما. الأمر 'remote_machine' يفتقد إلى شيء ما ، مثل > disk_backup.img أو |dd of=/dev/sdb أو أي شيء آخر ، اعتمادًا على ما تريد القيام به. أنا أظن أنك لا تريد تفريغ صورة قرص ل stdout. - davr
ورمي في gzip على كلا الطرفين لمزيد من تقليل البيانات المرسلة. - 3molo


ضع في اعتبارك أن dd يجعل نسخة طبق الأصل، بما في ذلك جميع المساحة الفارغة.

هذا يعني:

  1. يجب أن يكون محرك الأقراص الثاني بحجم كبير على الأقل
  2. إذا كان محرك الأقراص الثاني أكبر ، فسيتم إهدار مساحة إضافية (نظام الملفات يستطيع يتم توسيع العقل عليك)
  3. إذا كان محرك الأقراص المصدر غير ممتلئ ، سيضيع dd الكثير من الوقت في نسخ مساحة فارغة.
  4. يمكنك نسخ إما محرك الأقراص بأكمله ، أو قسم واحد بهذه الطريقة.
  5. إذا كان هذا محرك أقراص قابل للتشغيل ، فأنا متأكد من أنك بحاجة إلى تثبيت برنامج bootloader بعد استخدام dd

نأمل أن يكون مفيدا


4
2018-05-05 18:38



إذا كنت تستنسخ القرص الثابت بأكمله ، فأنت أيضًا تستنسخ محمل الإقلاع. - Cristian Ciupitu
welll ، مجرد thouhgt ، ولكن لا يمكن أن يو مجرد استخدام gparted إلى resive قسم / القرص يتم نسخها إلى أي شيء يتم استخدامه ثم قطرة dd؟ إذا افترضنا أنها صورة مرة واحدة ، يجب أن تخفف من هذه المشكلة. - bbqchickenrobot