Cách sao chép bố cục phân vùng của toàn bộ đĩa bằng các công cụ tiêu chuẩn


81

Tôi muốn sao lưu toàn bộ bố cục phân vùng của ổ cứng, bao gồm cả ổ đĩa logic, để tôi có thể khôi phục bố cục đó sang đĩa khác. Tôi không muốn sao chép nội dung của các phân vùng, chỉ bố trí. Đối với các phân vùng chính và mở rộng, thật dễ dàng:

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

Nhưng khi nói đến cách bố trí các phân vùng hợp lý, tôi tự hỏi liệu có tồn tại trong số các công cụ tiêu chuẩn một cách tương tự để lưu bố cục không? Tôi đoán vấn đề chính là tìm ra sự bù đắp cho các vị trí của EBR, bởi vì với điều đó, ddsẽ làm phần còn lại. Hãy nhớ rằng tôi cần có thể đặt mọi thứ trở lại vào một đĩa trống (có thể) và từ đó khôi phục lại bố cục tương tự. Sử dụng các công cụ phân vùng như fdiskhoặc partedtốt, nhưng tôi phải có khả năng tự động hóa việc sử dụng chúng (kịch bản) và chúng không nên phụ thuộc vào bất kỳ gói nào liên quan đến X - chỉ dòng lệnh.

Kế hoạch sao lưu của tôi đang thực hiện thủ công trong một tập lệnh python nhỏ bằng cách sử dụng mô-đun struct, nhưng tôi hy vọng có một cách dễ dàng hơn.

Câu trả lời:


89

Bạn có thể sử dụng sfdisk cho nhiệm vụ này.

Lưu lại:

sfdisk -d /dev/sda > part_table

Khôi phục:

sfdisk /dev/sda < part_table

Đối với các bảng phân vùng GPT, điều này đòi hỏi sfdisktừ produc-linux 2.26 trở lên. Nó được viết lại từ đầu trên libfdisk .

Điều này sao chép các UUID không thay đổi, thay vì tạo ra các UUID mới. Vì vậy, đĩa mới là bản sao của bản gốc, không chỉ là một đĩa khác có cùng bố cục. Tuy nhiên, lưu ý rằng Linux /dev/disk/by-uuid/xem xét các UUID của hệ thống tệp, tuy nhiên, không phải UUID trong bảng phân vùng. sfdisksẽ tạo UUID mới nếu bạn chỉnh sửa UUID từ kết xuất (mỗi phân vùng và UUID cho chính bảng phân vùng gần đầu tệp).


1
Tôi không biết chắc chắn, nhưng giới hạn duy nhất xuất hiện trong đầu tôi là giới hạn kích thước 2TB cho phân vùng được áp đặt bởi sơ đồ bảng phân vùng msdos. Để vượt qua giới hạn này, người ta có thể sử dụng GPT thay thế, nhưng AFAIK sfdisk không thể hoạt động với GPT. Tôi không biết nếu có bất kỳ giới hạn nào khác cũng như nếu sfdisk sẽ báo cáo nếu không thể đối phó.
Petr Uzel

2
sfdiskkhông hoạt động với khối lượng lớn hoặc hỗ trợ GPT.
dhchdhd

1
@Barry và khi bạn nói "lớn", bạn đang đề cập đến giới hạn 2TB mà @Petr đang nói đến?
Lauritz V. Thaulow

5
Cách chính xác là: sudo parted / dev / sda -lm> sda.parted
dhchdhd

1
Đôi khi nó rất hữu ích, để bỏ qua các vấn đề chỉ của DOS, để thêm tùy chọn -L hoặc --linux :sfdisk -L /dev/sda < part_table
Diego

50

Nó phụ thuộc nếu đĩa nguồn của bạn sử dụng bảng phân vùng MBR (còn gọi là "dos" hoặc "msdos") hoặc bảng phân vùng GPT (hay còn gọi là "GUID").

Đĩa trên 2 TB không thể sử dụng MBR, vì vậy chúng là GPT.

Đĩa dưới 2 TB có thể sử dụng cả hai, vì vậy trước tiên bạn sẽ phải tìm ra nó là gì.

Giả sử bạn đang dùng Linux, hãy sử dụng một trong hai lệnh này để tìm ra bảng phân vùng mà đĩa nguồn của bạn sử dụng:

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

Được

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

Đối với đĩa MBR

sử dụng sfdisktheo đề xuất của câu trả lời của Petr Uzel hoặc biến thể này:

# 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

Đối với đĩa GPT

Câu trả lời đúng đã được đưa ra ở đâyở đây bởi Kris Harper .

Bạn cần GPT fdisk . Nhìn vào trang tải xuống hoặc chạy sudo apt-get install gdisk.

Sau đó sử dụng lệnh 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

Lệnh cuối cùng ngẫu nhiên GUID trên đĩa và tất cả các phân vùng. Điều này chỉ cần thiết nếu các đĩa được sử dụng trong cùng một máy, nếu không thì không cần thiết.


10
Tôi luôn sợ tôi sẽ trộn lẫn hai tham số, vì vậy một mẹo hay là sử dụng --backup=Fileđể xuất bảng phân vùng từ ổ đĩa nguồn và --load-backup=Filekhôi phục lại trên ổ đĩa đích.
zidarsk8

Có bất kỳ rủi ro nào đối với dữ liệu hiện có trên các đĩa và các phân vùng tiếp theo khi bạn di chuyển bảng phân vùng và sau đó chọn ngẫu nhiên GUID của các đĩa và phân vùng như bạn mô tả ở trên không? Cảm ơn!
Tiếng Anh

@EngBIRD: Miễn là bạn không trộn lẫn $ source và $ Dest, không thể có rủi ro cho dữ liệu, vì không có dữ liệu về đích. Bạn chỉ sao chép bố cục phân vùng và vẫn cần định dạng và sao chép dữ liệu sau đó.
mivk

Lý do tôi hỏi là trên thực tế tôi không bắt đầu từ một đĩa trống, tôi đang trao đổi hai đĩa xung quanh ...
Tiếng Anh

5

Cũ hơn nhưng vẫn còn thú vị ràng buộc pypartedpython-lvm .

Cập nhật:

Cái trước đã được đăng bởi vì cái trên không hoạt động trong nhiều tình huống hiện đại trên trang man sfdisk.

sfdisk không hiểu Bảng phân vùng GUID (GPT) và nó không được thiết kế cho các phân vùng lớn. Trong trường hợp cụ thể, sử dụng GNU tiên tiến hơn (8).

Lệnh này tuy nhiên hỗ trợ> 2 phân vùng TB và LVM.

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

Đầu ra mẫu:

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

14
Làm thế nào để bạn khôi phục từ sda.partedtệp đã lưu vào một đĩa mới?
Avery Chan

4
Câu trả lời này là vô ích vì câu hỏi là về việc sao chép bố cục phân vùng vào một ổ đĩa mới. Câu trả lời chỉ là về việc bán phá giá. Làm thế nào để nhập khẩu? Hãy cải thiện.
Itsafire

Rõ ràng tại thời điểm này, không có câu trả lời hay: serverfault.com/questions/709582/
Khăn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.