วิธีการคัดลอกเค้าโครงพาร์ติชันของดิสก์ทั้งหมดโดยใช้เครื่องมือมาตรฐาน


81

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

dd if=/dev/sda of=partitiontable.bin bs=1 skip=446 count=64 # backup
dd if=partitiontable.bin of=/dev/sda bs=1 seek=446 count=64 # restore

แต่เมื่อพูดถึงเลย์เอาต์ของโลจิคัลพาร์ติชั่นฉันสงสัยว่ามีเครื่องมือมาตรฐานในรูปแบบที่คล้ายกันในการบันทึกเลย์เอาต์หรือไม่? ฉันเดาว่าปัญหาหลักคือการหาค่าชดเชยให้กับสถานที่ตั้งของ EBRs เพราะสิ่งนั้นddจะทำส่วนที่เหลือ โปรดทราบว่าฉันต้องสามารถนำทุกสิ่งกลับไปยังดิสก์เปล่า (อาจ) และจึงกู้คืนโครงร่างเดียวกัน การใช้เครื่องมือแบ่งพาร์ติชันเช่นfdiskหรือใช้ได้partedแต่ฉันต้องสามารถใช้งานอัตโนมัติ (การเขียนสคริปต์) และไม่ควรขึ้นอยู่กับแพ็คเกจ X ที่เกี่ยวข้อง - บรรทัดคำสั่งเท่านั้น

แผนการสำรองข้อมูลของฉันทำด้วยตนเองในสคริปต์ไพ ธ อนตัวเล็ก ๆ โดยใช้โมดูล struct แต่ฉันหวังว่าจะมีวิธีที่ง่ายกว่า

คำตอบ:


89

คุณสามารถใช้sfdiskสำหรับงานนี้

ประหยัด

sfdisk -d /dev/sda > part_table

Restore:

sfdisk /dev/sda < part_table

สำหรับตารางพาร์ติชัน GPT ต้องใช้sfdiskจาก util-linux 2.26 หรือใหม่กว่า มันเป็นอีกครั้งที่เป็นลายลักษณ์อักษรจากรอยขีดข่วนบนด้านบนของ libfdisk

สิ่งนี้คัดลอก UUIDs ไม่เปลี่ยนแปลงแทนที่จะสร้างใหม่ ดังนั้นดิสก์ใหม่จึงเป็นโคลนของแท้ไม่ใช่แค่ดิสก์อื่นที่มีเค้าโครงเหมือนกัน โปรดสังเกตว่า Linux /dev/disk/by-uuid/ดูที่ UUID ของระบบไฟล์ แต่ไม่ใช่ UUID ในตารางพาร์ติชัน sfdiskจะสร้าง UUID ใหม่หากคุณแก้ไข UUID จากการถ่ายโอนข้อมูล (ต่อพาร์ติชั่นและ UUID สำหรับตารางพาร์ติชั่นใกล้กับจุดเริ่มต้นของไฟล์)


1
ฉันไม่รู้แน่ชัด แต่ข้อ จำกัด เดียวที่อยู่ในใจของฉันคือขีด จำกัด ขนาด 2TB สำหรับพาร์ติชันที่กำหนดโดยชุดรูปแบบตารางพาร์ติชัน msdos เพื่อเอาชนะขีด จำกัด นี้คุณสามารถใช้ GPT แทน แต่ AFAIK sfdisk ไม่สามารถทำงานกับ GPT ได้ ฉันไม่ทราบว่ามีข้อ จำกัด อื่น ๆ หรือไม่ถ้า sfdisk จะรายงานหากไม่สามารถรับมือได้
Petr Uzel

2
sfdiskไม่ทำงานกับวอลุ่มขนาดใหญ่หรือรองรับ GPT
dhchdhd

1
@Barry และเมื่อคุณพูดว่า "ใหญ่" คุณหมายถึงขีด จำกัด 2TB @Petr กำลังพูดถึง?
Lauritz V. Thaulow

5
วิธีที่ถูกต้องคือ: sudo parted / dev / sda -lm> sda.parted
dhchdhd

1
บางครั้งมันมีประโยชน์ในการเพิกเฉยต่อปัญหาของ DOS เท่านั้นเพื่อเพิ่มตัวเลือก-L หรือ --linux :sfdisk -L /dev/sda < part_table
Diego

50

ขึ้นอยู่กับว่าดิสก์ต้นทางของคุณใช้พาร์ติชันMBR (aka "dos" หรือ "msdos") หรือตารางพาร์ติชันGPT (aka "GUID")

ดิสก์ที่มีขนาดเกิน 2 TB ไม่สามารถใช้ MBR ได้ดังนั้นจึงเป็น GPT

ดิสก์ที่มีขนาดต่ำกว่า 2 TB สามารถใช้งานได้ทั้งสองอย่างดังนั้นคุณจะต้องค้นหาก่อนว่ามันคืออะไร

สมมติว่าคุณอยู่บน Linux ให้ใช้คำสั่งใดคำสั่งหนึ่งต่อไปนี้เพื่อค้นหาว่าพาร์ติชั่นตารางที่ดิสก์ต้นทางใช้:

disk=/dev/sda

# Always available, but old versions may not recognize gpt
fdisk -l $disk | grep type

# `apt-get install gdisk` or equivalent on non-Debian systems
gdisk -l $disk | grep -A4 'scan'

# `apt-get install parted`
parted $disk print | grep Table

ป.ร. ให้ไว้

source=/dev/sda
dest=/dev/sdb

สำหรับดิสก์ MBR

ใช้sfdiskตามที่แนะนำโดยคำตอบของ Petr Uzel หรือตัวแปรนี้:

# Save MBR disks
sfdisk -d $source > /partitions-backup-$(basename $source).sfdisk
sfdisk -d $dest   > /partitions-backup-$(basename $dest).sfdisk

# Copy $source layout to $dest
sfdisk -d $source | sfdisk $dest

สำหรับดิสก์ GPT

คำตอบที่ถูกต้องได้รับที่นี่และที่นี่โดยคริสฮาร์เปอร์

คุณต้องGPT fdisk ดูที่หน้าดาวน์โหลดsudo apt-get install gdiskหรือเรียกใช้

จากนั้นใช้คำสั่งsgdisk :

# Save MBR disks
sgdisk --backup=/partitions-backup-$(basename $source).sgdisk $source
sgdisk --backup=/partitions-backup-$(basename $dest).sgdisk $dest

# Copy $source layout to $dest and regenerate GUIDs
sgdisk --replicate=$dest $source
sgdisk -G $dest

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


10
ฉันกลัวเสมอฉันจะผสมพารามิเตอร์ทั้งสองดังนั้นเคล็ดลับที่ดีคือใช้--backup=Fileเพื่อส่งออกตารางพาร์ติชันจากไดรฟ์ต้นทางและ--load-backup=Fileเพื่อกู้คืนในไดรฟ์ปลายทาง
zidarsk8

มีความเสี่ยงต่อข้อมูลที่มีอยู่บนดิสก์และพาร์ติชันที่ตามมาเมื่อคุณย้ายตารางพาร์ติชันแล้วสุ่ม GUID ของดิสก์และพาร์ติชันตามที่คุณอธิบายไว้ข้างต้นหรือไม่ ขอบคุณ!
EngBIRD

@EngBIRD: ตราบใดที่คุณไม่รวม $ source และ $ dest ไว้จะไม่มีความเสี่ยงต่อข้อมูลเนื่องจากไม่มีข้อมูลในปลายทาง คุณคัดลอกเค้าโครงพาร์ติชันเท่านั้นและยังจำเป็นต้องฟอร์แมตและคัดลอกข้อมูลในภายหลัง
mivk

เหตุผลที่ฉันถามคือในความเป็นจริงฉันไม่ได้เริ่มจากดิสก์เปล่าฉันจะสลับสองดิสก์รอบ ๆ ...
EngBIRD

5

ที่เก่ากว่า แต่ยังน่าสนใจและการผูก พีระมิดlvm

ปรับปรุง:

โพสต์ก่อนหน้านี้ถูกโพสต์เพราะข้างต้นไม่สามารถใช้งานได้ในหลายสถานการณ์ที่ทันสมัยต่อหน้า sfdisk

sfdisk ไม่เข้าใจ GUID Partition Table (GPT) และไม่ได้ออกแบบมาสำหรับพาร์ติชั่นขนาดใหญ่ โดยเฉพาะอย่างยิ่งใช้ GNU ขั้นสูงที่แยกส่วน (8)

อย่างไรก็ตามคำสั่งนี้รองรับพาร์ติชั่น 2 TB และ LVM

# parted -ms /dev/sda print > sda.parted

ตัวอย่างผลลัพธ์:

BYT;
/dev/sda:12.9GB:scsi:512:512:msdos:VMware Virtual disk;
1:1049kB:12.9GB:12.9GB:::boot, lvm;

14
คุณจะกู้คืนจากsda.partedไฟล์ที่บันทึกไปยังดิสก์ใหม่ได้อย่างไร?
เอเวอรี่ชาน

4
คำตอบนี้ไม่มีประโยชน์เพราะคำถามเกี่ยวกับการคัดลอกเค้าโครงพาร์ติชันไปยังไดรฟ์ใหม่ คำตอบนั้นเกี่ยวกับการทุ่มตลาด วิธีการนำเข้า กรุณาปรับปรุง
itsafire

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