שאלה שימוש ב- DD לשיבוט דיסק


היו מספר שאלות לגבי כלי שיבוט דיסק ו dd הוצע לפחות פעם אחת. כבר שקלתי להשתמש dd עצמי, בעיקר בגלל קלות שימוש, וכי הוא זמין בקלות על כל הפצות לינוקס אתחול.

מהי הדרך הטובה ביותר להשתמש dd שיבוט דיסק? עשיתי חיפוש מהיר של Google, והתוצאה הראשונה הייתה ברורה ניסיון כושל. האם יש משהו שאני צריך לעשות לאחר השימוש dd, כלומר יש משהו שלא ניתן לקרוא באמצעות dd?


176
2018-05-05 18:21




אני יודע איך dd עובד, השאלה שלי היתה יותר לכיוון של בעיות ידועות הקשורות dd כאשר שיבוט דיסקים (כפי שתואר על ידי הקישור), אולי זה לא היה ברור מאוד. מה התשובה שלו מכיל שלך הוא לא "מעולם לא היו לי בעיות עם זה". עשיתי את התשובה שלך מדי, כפי שעשית בהחלט כמה נקודות מעניינות (אני אוהב את זה על שום אינדיקציה התקדמות). - falstro
ללא שם: נראה כאילו יש לך את bump spolsky: joelonsoftware.com/items/2009/05/29.html - Kyle Cronin
לא ראיתי את זה כאן כאשר שאלתי (וענה) שאלה דומה על superuser - superuser.com/questions/11453/... - warren
זה אירוני כי ג'ואל קשור לשאלה כדוגמה טובה של תקלות בשרת, אם כי אף אחת מהתשובות לא היתה טובה. לא הייתה תשובה אחת בין 25 (למעט הערות) עם הימין dd אפשרויות דילוג על בלוקים רע - וזה חיוני כאשר שיבוט דיסקים להתאוששות. הוספתי תשובה טובה יותר, אשר יכול לשכפל דיסקים שיש בלוקים רע: dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror - Sam Watkins
אני חושב dd לשחזר עלול "להיכשל" אם מדברים על כונן מערכות הגיאומטריה תלויה ושחזור נעשה על כוננים קשיחים שאינם זהים? חוויתי כמה כשלים על שחזור 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

המתן קצת, dd ייכשל בסופו של דבר עם הודעת "דיסק מלא", ולאחר מכן:

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

כמו כן, תוכל לקבל תהליך dd הפועל ברקע כדי לדווח על מצב על ידי שליחת אות עם הפקודה kill, למשל:

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

בדוק את המערכת שלך - הפקודה הנ"ל היא עבור פקודות לינוקס, OSX ו BSD dd שונים האותות שהם מקבלים (OSX משתמש SIGINFO - אתה יכול ללחוץ Ctrl+T כדי לדווח על הסטטוס).


104
2018-05-06 22:47



האם זה עובד גם עם fs "מודרני" כגון 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 מערכת הקבצים לחיות יכול להשחית קבצים. הסיבה היא פשוטה, אין לה הבנה של פעילות מערכת הקבצים שעלולה להתרחש, ולא עושה כל מאמץ להקטין אותה. אם לכתוב הוא חלקית underway, תקבל קצת לכתוב. זה בדרך כלל לא טוב לדברים, ובדרך כלל קטלני עבור מסדי נתונים. יתר על כן, אם אתה מזיין את הקלדת מועדים אם ו of פרמטרים, אוי לך. ברוב המקרים, rsync הוא כלי יעיל באותה מידה שנכתב לאחר הופעתו של ריבוי משימות, ותספק תצוגות עקביות של קבצים בודדים.

עם זאת, DD צריך ללכוד במדויק את מצב קצת כונן unmounted. Bootloaders, כרכים llvm, מחיצה UUIDs ותוויות, וכו 'רק לוודא שיש לך כונן מסוגל שיקוף את כונן היעד קצת עבור קצת.


37
2018-05-05 20:20



אני חושד בזה syncהיא לא התשובה לבעיות בשחיתות קבצים. מה קורה אם deamon או משהו כותב יותר קבצים לאחר sync, במהלך dd פעולה? - Deleted
זה רעיון טוב כדי לטעון את הכונן הראשון (או remount כמו לקריאה בלבד) אבל זה לא תמיד אפשרי - Alex Bolotov
ובמקרה זה, אתה משתמש rsync ולתת לו לעשות את הקובץ לטפל הקסם כדי לקבל קובץ עקבי ולתת העתק על כתיבת סמנטיקה להתמודד עם כותבים נכנסות. - jldugger
אני רוצה להוסיף כי פועל dd על מערכת קבצים רכוב לא לקרוע את הקבצים על מערכת הקבצים רכוב, אבל מה שמכונה כאן היא כי עותק של מערכת הקבצים יהיה בהכרח במצב טוב ידוע. - 3molo
שימוש rsync יבטיח כי נתונים פנימיים במערכת הקבצים היעד הוא עקבי. זה לא יהיה ודא כי הנתונים בקבצים הוא עקבי - כדי לעשות זאת, אתה צריך לנעול את הקבצים וכל התוכניות לכתוב את הקבצים יצטרכו לכבד אלה מנעולים. - Martin Geisler


בעת שימוש ב- dd כדי לשכפל דיסק שעלול להכיל סקטורים פגומים, השתמש ב- "conv = noerror, sync" כדי לוודא שהוא אינו מפסיק כאשר הוא נתקל בשגיאה וממלא את המגזר החסר (s) עם בתים null. זה בדרך כלל הצעד הראשון שאני לוקח אם מנסים להתאושש דיסק נכשל או נכשל - לקבל עותק לפני ביצוע כל ניסיונות התאוששות, ולאחר מכן לעשות שחזור על דיסק טוב (משובטים). אני משאיר אותו לכלי ההתאוששות כדי להתמודד עם כל מגזרים ריקים שלא ניתן להעתיק.

כמו כן, אתה עלול למצוא את המהירות של 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

אבל אתה עדיין כפוף למגבלות לעיל לגבי שטח פנוי.

ככל בעיות או gotchas ללכת, dd, על פי רוב, עושה עבודה מצוינת. עם זאת, לפני כמה זמן היה לי כונן קשיח שעמד למות, אז השתמשתי dd לנסות ולהעתיק את המידע מה אני יכול את זה לפני שהוא מת לגמרי. אז נודע כי dd אינו מטפל שגיאות לקרוא טוב מאוד - היו כמה מגזרים על הדיסק כי dd לא יכול לקרוא, גורם dd לוותר ולעצור את העותק. באותו זמן לא הצלחתי למצוא דרך להגיד לד 'להמשיך למרות שהיא נתקלת בשגיאת קריאה (אם כי נראה כאילו זה עושה את ההגדרה), אז ביליתי לא מעט זמן ידני ציון לדלג ולחפש לקפוץ מעל חלקים בלתי קריא.

ביליתי קצת זמן בחקר פתרונות לבעיה זו (לאחר שהשלים את המשימה) ומצאתי תוכנית בשם ddrescue, אשר, על פי האתר, פועל כמו dd אבל ממשיך לקרוא גם אם הוא נתקל שגיאה. אני אף פעם לא ממש השתמשו בתוכנית, אבל זה שווה לשקול, במיוחד אם הדיסק אתה העתקה מ הוא ישן, אשר יכול להיות סקטורים פגומים גם אם המערכת נראית בסדר.


17
2018-05-05 18:26



... dd מספק שום אינדיקציות התקדמות ... - ובכן זה לא נכון - יש דרך מסובכת למדי איך להראות התקדמות - אתה צריך למצוא pid של תהליך dd ('PS-a | grep dd') ולאחר מכן לשלוח את USR1 האות לתהליך זה - 'להרוג -USR1 < dd_pid_here> '(ללא <>) אשר כוח dd להראות מידע התקדמות. - Michal Bernhard
"מספר מגזרים על הדיסק כי dd לא יכולתי לקרוא": אני חושב שזה conv=sync,noerror יעזור. - Gauthier
ה conv=sync,noerror האפשרויות הן חיוניות, הם מאפשרים dd לדלג על בלוקים רע ולאפס אותם בתמונה כך הדברים מיושרים כראוי. Props לאנשים המעטים שהגיבו על זה משהו. - Sam Watkins
גנו ddrescue מספק מחוון התקדמות ללא אפשרויות מיוחדות, ואתה יכול לעצור את העותק ולחדש במקום שבו הפסקת. - endolith
הדרך פחות מסובך להשיג התקדמות עם dd היא להוסיף את האפשרות status=progress - James


אם כונן המקור פגום בכלל, יהיה לך יותר מזל באמצעות dd_rhelp עם dd_rescue (העדפה אישית שלי) או גנו ddrescue.

הסיבה מאחורי זה היא, על טעויות לקרוא, dd מנסה כל הזמן לנסות ולנסות - פוטנציאל מחכה זמן רב עבור timeouts להתרחש. dd_rescue עושה דברים חכמים כמו קריאה עד שגיאה, ולאחר מכן לבחור נקודה נוספת על הדיסק ולקרוא לאחור לשגיאה האחרונה, ו dd_rhelp הוא בעצם dd_rescueמנהל מושב - מתחיל ומתחדש בחוכמה dd_rescue פועל כדי להפוך אותו מהר יותר.

התוצאה הסופית של dd_rhelp הוא הנתונים המרבי התאושש בזמן המינימום. אם תעזוב dd_rhelp ריצה, בסופו של דבר זה עושה את אותה עבודה בדיוק כמו dd באותו הזמן. לעומת זאת, אם dd נתקלו שגיאות קריאה בבית 100 בדיסק 100Gb שלך, אתה צריך לחכות זמן רב כדי לשחזר את 9,999,900 בתים אחרים *, ואילו dd_rhelp+dd_rescue היה לשחזר את רוב הנתונים הרבה יותר מהר.


11
2018-05-31 02:12



כמה עזרה בבחירה בין dd_rescue ו ddrescue: askubuntu.com/a/211579/50450 - Johann


דיסק המקור אינו חייב לכלול מערכות קבצים מותקנות. כמשתמש מסוגל לקרוא את המכשיר בלוק (שורש עובד), לרוץ 'dd אם / / 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"

הנ"ל מעתיק תמונה דחוסה של harddrive המקור למערכת מרוחקת, שם היא מאחסנת אותם בגושים 2G ממוספרים באמצעות שם המארח של המקור, תוך שמירה על עדכון על ההתקדמות.

שים לב כי בהתאם לגודל הדיסק, מהירות המעבד על המקור, מהירות המעבד על היעד, מהירות הרשת, וכו 'ייתכן שתרצה לדלג על דחיסה, או לעשות את הדחיסה בצד המרוחק, או להפעיל דחיסה של ssh.


7
2018-05-29 19:23



+1 צנרת דרך gzip יכול לחסוך הרבה זמן רוחב פס! - M. Dudley
אני צריך גם לציין כי הוספת 'bs = 1m' הפקודה dd יהיה בדרך כלל לשפר את המהירות. - retracile


כדי לשכפל דיסק, כל מה שאתה באמת צריך לעשות הוא לציין את קלט פלט ddYou

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

החיסרון השני ניתן לפתור באמצעות הצינור (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(Modulo מודיעין נוסף בשכבת מערכת הקבצים.) - retracile


עוד דבר נחמד שאתה יכול לעשות עם dd והצלה דיסקים הוא להעתיק נתונים ברשת:

remote_machine$ nc -l -p 12345

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

אתה יכול מקל gzip בשני צינורות אלה אם הרשת אינה מקומית. לקבלת התקדמות, שימוש pv. כדי להפסיק את Netcat של local_machine לאחר סיום ההעתקה, תוכל להוסיף -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
ובכן, רק thouhgt, אבל לא יכול U פשוט להשתמש gparted כדי resive את המחיצה / הדיסק מועתקים למטה מה נעשה שימוש - ואז ירידה dd? בהנחה שזה תמונה onetime זה צריך להקל על בעיה זו. - bbqchickenrobot


עבור בעתיד יהיה זה עניין לבדוק ddrescue. זה הציל את היום שלי כמה פעמים.


3
2018-05-06 21:06