โคลนพาร์ติชั่นหรือฮาร์ดไดรฟ์ทั้งไฟล์


35

ฉันชอบโคลนพาร์ติชันทั้งหมดหรือฮาร์ดไดรฟ์ทั้งหมดลงบนดิสก์ภายนอกที่มีขนาดใหญ่กว่า แต่ต้องการสร้างไฟล์ที่กระจัดกระจาย ฉันมักจะใช้ddสำหรับการโคลน แต่มันไม่รองรับไฟล์ที่กระจัดกระจาย เป็นวิธีแก้ปัญหาฉันใช้สิ่งที่ชอบ:

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

อย่างไรก็ตามนี่เป็นเรื่องยุ่งยากเล็กน้อยสำหรับรสนิยมของฉันและไม่อนุญาตให้ฉันดำเนินการต่อหากยกเลิก เป็นเรื่องตลกที่มีเครื่องมือ NTFS สำหรับสิ่งนี้ ( ntfsclone) แต่ไม่มีเครื่องมือดังกล่าวสำหรับระบบไฟล์ดั้งเดิมของ Linux (EXT2-4)

มีเครื่องมือที่ดีกว่าสำหรับสิ่งนี้เช่นddตัวแปรที่มีการสนับสนุนเบาบาง? ฉันไม่ได้มองหาซอฟต์แวร์ที่เป็นกรรมสิทธิ์สำหรับการสำรองข้อมูลดิสก์ แต่เพียงต้องการทำสำเนาโคลนแบบเบาบางซึ่งฉันสามารถติดตั้งเป็นอุปกรณ์วนรอบหากจำเป็น


7
+1 สำหรับการใช้งานอย่างสร้างสรรค์cpมันไม่เคยเกิดขึ้นกับฉันเลยว่าคุณสามารถทำสำเนาดิสก์อิมเมจ ฉันมักจะบีบอัดพวกเขาหากฉันต้องการที่จะประหยัดพื้นที่ ตอนนี้ทำไมในคำถามไม่ได้คำตอบ?
แม็กเคเล็บ

คำตอบ:


21

dd_rescueคุณต้องการ

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
ที่ดี! คู่มือกล่าวว่า "หากกระบวนการคัดลอกถูกขัดจังหวะโดยผู้ใช้คุณสามารถดำเนินการต่อในตำแหน่งใดก็ได้ในภายหลัง" และ "-a spArse การเขียนไฟล์ (default = no)" สิ่งที่ฉันต้องการ! ขอบคุณ!
Martin Scharrer

3
ค้นหาdd_rescueออนไลน์ฉันพบว่ายังมีเครื่องมืออื่นที่เรียกว่าddrescue(ไม่มีเครื่องหมายขีดเส้นใต้) ซึ่งได้รับการพัฒนาอย่างเป็นอิสระจากdd_rescueแต่ดูเหมือนว่าจะทำแบบเดียวกัน ฉันแค่พูดถึงว่านี่เป็น FYI ทั่วไป
Martin Scharrer

ใช่dd_rescueและddrescueไม่ใช่สิ่งเดียวกัน ในทางทฤษฎีที่พวกเขาทำงานเดียวกัน dd_rescueแต่โดยทั่วไปฉันเคยโชคดีขึ้นกับพี่
Steven Pritchard

1
ในกรณีที่ทุกคนสงสัยคุณสามารถหยุดการคัดลอกได้ตลอดเวลาด้วย Ctrl-C มันจะแสดงตำแหน่งปัจจุบันของคุณและคุณสามารถใช้ค่านั้นเพื่อเริ่มต้นใหม่โดยการเพิ่ม-sและตำแหน่งไปที่คำสั่งเดิม (ดังนั้นจึงดูเหมือนว่าdd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw)
Steven Pritchard

1
@ สตีเว่นพริทชาร์ด: ไม่จำเป็นต้องจำตำแหน่ง ระบุชื่อไฟล์ที่สามซึ่งจะเป็น logfile และเมื่อรีสตาร์ทมันจะอ่านมันและเลือกที่มันทิ้ง
Tanith Rosenbaum

20

เพียงเพื่อความสมบูรณ์โทรสำหรับddrescue กระบวนการ--sparseหรือการ-Sตั้งค่าสถานะอนุญาตให้ปลายทางการเขียนเบาบาง

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

หรือด้วยตัวเลือกยาว:

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

หรือถ้าคุณชอบMiB :

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

เพื่อให้การช่วยเหลือถูกขัดจังหวะและทำงานต่อคุณสามารถใช้ logfile:

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

โปรดทราบว่า GNU ddrescueและdd_rescueเป็นโปรแกรมที่แตกต่างกัน แต่ GNU ddrescueดูเหมือนจะแพร่หลายมากขึ้น ตัวอย่างเช่นมันบรรจุอยู่ในGRMLแล้ว


จำเป็นต้องมีการดูแลเป็นพิเศษของอิมเมจเมื่อกู้คืนหรือไม่คุณสามารถจัดเตรียมคำสั่งที่ใช้เพื่อกู้คืน ddrescue หรือไม่?
user12439

ในทางทฤษฎีสื่อจัดเก็บข้อมูลที่คุณกำลังใช้สำหรับการช่วยเหลือควรจะมีความน่าเชื่อถือมากขึ้นเพื่อให้คุณสามารถมักจะใช้เพียง DD dd if=sda1.raw of=/dev/sdb1กับการเขียนไปยังดิสก์ทดแทน: อย่างไรก็ตามหากต้องการใช้ ddrescue สำหรับการกู้คืนคุณเพียงแค่เปลี่ยนแหล่งที่มา / ปลายทางที่คุณใช้สำหรับการช่วยเหลือไปยังแหล่งที่มา / ปลายทางใหม่โดยเฉพาะอย่างยิ่งกับไฟล์บันทึกใหม่ หากเป็นไปได้ (มักจะไม่ใช่) แน่นอนคุณสามารถใช้ ddrescue เพื่อคัดลอกข้อมูลโดยตรงจากดิสก์แหล่งที่ไม่ดีไปยังดิสก์ทดแทน
zaTricky

3

มีการเสนอแพทช์ในปี 2007 เพื่อให้การสนับสนุนไฟล์กระจัดกระจายใน GNU dd แต่ดูเหมือนจะไม่ได้ทำให้มันกลายเป็น coreutils (อย่างน้อยไม่เป็น 8.4) ฉันสงสัยว่า dd มีการเปลี่ยนแปลงมากเกินไปตั้งแต่นั้นมาโปรแกรมแก้ไขอาจใช้กับเวอร์ชันปัจจุบันโดยไม่ต้องทำงานมาก

ฉันรู้สึกประทับใจกับการใช้ความคิดสร้างสรรค์cpในคำถามของคุณมากและทำให้ฉันมีการติดตามการใช้งานเพื่อให้สามารถดำเนินการทำงานต่อได้สำเร็จ

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

แก้ไข: ลบทิ้ง ddแน่นอนว่าอันดับที่สองจะค้นหาตำแหน่งผิดในไฟล์เอาต์พุตเนื่องจากมันไม่ได้มีความยาวเท่ากับอินพุต


1
เช่นเดียวกับกรณีที่มีคำตอบของ bhinesley มันจะเป็นการดีที่สุดที่จะบันทึกความคืบหน้าของ dd เพื่อให้กลับมาทำงานได้อย่างถูกต้อง หากคุณต้องใช้วิธีนี้สำหรับทั้งการเรียกใช้ครั้งแรกและการดำเนินการต่อและบันทึกทั้งคู่ขนานของ dd อย่างอิสระจากนั้นคุณสามารถรู้ว่าไกลแค่ไหนในการส่งออกที่จะแสวงหา หากฉันมีเวลาฉันจะพยายามทำให้ดีขึ้น
Eli Heady

2
ขอบคุณสำหรับลิงค์ไปยังแพทช์ ฉันเริ่มคิดเกี่ยวกับการเขียนโปรแกรมบางอย่างเช่นตัวเอง :-) ไม่สามารถวางไฟล์ที่กระจัดกระจายเพื่อให้โค้ดของคุณใช้งานไม่ได้
Martin Scharrer

ใช่ฉันเพิ่งค้นพบว่าตัวเอง โอ้มันสนุกมากที่ได้พบกับการใช้งานใหม่ ๆ อย่างบ้าคลั่งcp- ขอบคุณ!
Eli Heady

1
dd คอมมิชชันที่ 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: เพิ่มการสนับสนุนสำหรับตัวเลือก Conv = sparse" ("(iwrite): แปลงการเขียนบล็อก NUL เป็นการค้นหา หากมีการร้องขอ ")
osgx

1

เพียงแค่เพิ่ม 2 เซ็นต์ของฉัน อีกวิธีในการสร้างไฟล์แบบเบาบางจากดิสก์ดิบคือใช้qemu-imgโดยใช้บางสิ่งเช่น:

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

คุณสามารถใช้สิ่งนี้ในพาร์ติชันเดียวเช่นกัน นอกจากนี้คุณยังมีตัวเลือกในการแปลงดิสก์ดิบ / พาร์ติชันเป็นรูปแบบอื่น ๆ ที่รองรับ qemu-img (QCOW2, VHD [x], vmdk, ฯลฯ )


1

ตัวเลือกหนึ่งคือrsync ตัวอย่างเช่น:

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

คำอธิบาย:

  • -S/ --sparseเพื่อข้ามบล็อกเบาบางเมื่อเขียน
  • -P/ --partial --progressเพื่อแสดงความคืบหน้าและเก็บไฟล์ที่ถ่ายโอนบางส่วน
  • --copy-devices เพื่อคัดลอกเนื้อหาของอุปกรณ์

คุณสามารถเพิ่ม--appendเพื่อดำเนินการต่อการคัดลอกขัดจังหวะ (หรือ--append-verifyเพื่อยืนยันการตรวจสอบมากกว่าการแข่งขันข้อมูลใหม่และเก่า)

แก้ไข : ฉันเพิ่งรู้ว่าcopy-devices.diffอยู่ระหว่างการพิจารณาและอาจไม่ปรากฏในหลาย ๆ ระบบ (แม้ว่าจะรวมอยู่ในFedora , Ubuntu , Debianและอื่น ๆ )


0

หมายเหตุ: สิ่งนี้ใช้ไม่ได้ด้วยเหตุผลที่อธิบายไว้ในความคิดเห็นฉันจะปล่อยไว้ที่นี่เพื่ออ้างอิง

ตรวจสอบสถิติของ dd โดยใช้ kill -USR1:

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

ดำเนินการต่อโดยใช้ข้าม / ค้นหา:

$ 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`

หากไม่มี $ i_bytes จะเป็นการยากที่จะดำเนินการต่อ อาจเป็นการง่ายที่สุดในการบันทึกสถิติ dd ไปยังไฟล์ในกรณีที่เครื่องขัดข้องหรืออะไรก็ตาม


อันที่สองcpจะเขียนทับไฟล์ที่มีอยู่ไม่ใช่เหรอ? ฉันรู้skipและตัวเลือกอื่น ๆ ddของ ปัญหาคือcpส่วนหนึ่ง
Martin Scharrer

อืมใช่แล้วคุณพูดถูก
binesis


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.