Jak skopiować układ partycji całego dysku przy użyciu standardowych narzędzi

81

Chcę wykonać kopię zapasową całego układu partycji dysku twardego, w tym dysków logicznych, aby móc przywrócić ten układ na innym dysku. Ja nie chce skopiować zawartość partycji tylko układ. W przypadku partycji podstawowej i rozszerzonej jest to łatwe:

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

Ale jeśli chodzi o układ partycji logicznych, zastanawiam się, czy wśród standardowych narzędzi istnieje podobny sposób zapisywania układu? Myślę, że głównym problemem jest znalezienie przesunięć w lokalizacjach EBR, ponieważ dzięki temu ddzrobi resztę. Pamiętaj, że muszę umieć wszystko przywrócić (ewentualnie) pusty dysk, a tym samym przywrócić ten sam układ. Korzystanie z narzędzi do partycjonowania takich jak fdisklub partedjest w porządku, ale muszę być w stanie zautomatyzować ich użycie (skrypty) i nie powinny one zależeć od żadnych pakietów związanych z X - tylko wiersz poleceń.

Mój plan tworzenia kopii zapasowych polega na tym, że robię to ręcznie w małym skrypcie Pythona za pomocą modułu struct, ale raczej miałem nadzieję, że istnieje łatwiejszy sposób.

Lauritz V. Thaulow
źródło

Odpowiedzi:

89

Możesz użyć sfdisk do tego zadania.

Zapisać:

sfdisk -d /dev/sda > part_table

Przywracać:

sfdisk /dev/sda < part_table

W przypadku tablic partycji GPT wymaga to programu sfdiskutil-linux 2.26 lub nowszego. Został napisany od nowa na libfdisku .

Spowoduje to skopiowanie UUID bez zmian, zamiast generowania nowych. Tak więc nowy dysk jest klonem oryginału, a nie tylko innym dyskiem o tym samym układzie. Zauważ, że Linux /dev/disk/by-uuid/patrzy na UUID systemu plików, a nie na UUID w tablicy partycji. sfdiskwygeneruje nowe UUID, jeśli edytujesz UUID z zrzutu (na partycję i UUID dla samej tablicy partycji w pobliżu początku pliku).

Petr Uzel
źródło
1
Nie wiem na pewno, ale jedynym ograniczeniem, jakie przychodzi mi na myśl, jest ograniczenie rozmiaru partycji do 2 TB narzucone przez schemat tabeli partycji msdos. Aby pokonać ten limit, można zamiast tego użyć GPT, ale sfdisk AFAIK nie może współpracować z GPT. Nie wiem, czy jest jakiś inny limit, ani czy sfdisk zgłosi, jeśli nie da sobie rady.
Petr Uzel
2
sfdisknie działa z dużymi woluminami ani nie obsługuje GPT.
dhchdhd
1
@Barry, a kiedy mówisz „duży”, masz na myśli limit 2 TB, o którym mówi @Petr?
Lauritz V. Thaulow
5
Prawidłowy sposób to: sudo parted / dev / sda -lm> sda.parted
dhchdhd
1
Czasami przydaje się ignorowanie problemów tylko z DOS-em, aby dodać opcję -L lub --linux :sfdisk -L /dev/sda < part_table
Diego
50

Zależy to od tego, czy dysk źródłowy używa tablicy partycji MBR (aka „dos” lub „msdos”), czy GPT (aka „GUID”).

Dyski o pojemności powyżej 2 TB nie mogą korzystać z MBR, więc są GPT.

Dyski o pojemności poniżej 2 TB mogą korzystać z obu, więc najpierw musisz dowiedzieć się, która to jest.

Zakładając, że korzystasz z systemu Linux, użyj jednego z poniższych poleceń, aby dowiedzieć się, z której tablicy partycji korzysta dysk źródłowy:

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

Dany

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

Dla dysków MBR

użyj sfdiskzgodnie z sugestią Petra Uzela lub tego wariantu:

# 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

Dla dysków GPT

Prawidłowa odpowiedź została podana tu i tutaj przez Krisa Harpera .

Potrzebujesz fdisk GPT . Spójrz na stronę pobierania lub uruchom sudo apt-get install gdisk.

Następnie użyj polecenia 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

Ostatnie polecenie losowo identyfikuje identyfikator GUID na dysku i wszystkich partycjach. Jest to konieczne tylko wtedy, gdy dyski mają być używane na tym samym komputerze, w przeciwnym razie nie jest to konieczne.

mivk
źródło
10
Zawsze boję się, że zmieszam dwa parametry, więc dobrym pomysłem jest --backup=Filewyeksportowanie tabeli partycji z dysku źródłowego i --load-backup=Fileprzywrócenie dysku docelowego.
zidarsk8
Czy istnieje ryzyko dla istniejących danych na dyskach i kolejnych partycjach, gdy przenosisz tabelę partycji, a następnie losowo identyfikujesz GUID dysków i partycji, jak opisano powyżej? Dzięki!
EngBIRD
@EngBIRD: Dopóki nie pomieszasz $ source i $ dest, nie ma ryzyka dla danych, ponieważ nie ma danych na temat miejsca docelowego. Kopiujesz tylko układ partycji i nadal musisz sformatować i skopiować dane później.
mivk
Powodem, dla którego pytam, jest to, że nie zaczynam od pustego dysku, wymieniam dwa dyski wokół ...
EngBIRD
5

Starsze, ale wciąż interesujące powiązania dzielone na części i python-lvm .

Aktualizacja:

Poprzedni został opublikowany, ponieważ powyższe nie działa w wielu nowoczesnych sytuacjach na stronie podręcznika sfdisk.

sfdisk nie rozumie tabeli partycji GUID (GPT) i nie jest przeznaczony dla dużych partycji. W szczególnym przypadku użyj bardziej zaawansowanego GNU parted (8).

To polecenie obsługuje jednak partycje> 2 TB i LVM.

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

Przykładowe dane wyjściowe:

BYT;
/dev/sda:12.9GB:scsi:512:512:msdos:VMware Virtual disk;
1:1049kB:12.9GB:12.9GB:::boot, lvm;
dhchdhd
źródło
14
Jak przywrócić z zapisanego sda.partedpliku na nowy dysk?
Avery Chan,
4
Ta odpowiedź jest bezużyteczna, ponieważ pytanie dotyczyło skopiowania układu partycji na nowy dysk. Odpowiedź dotyczy tylko dumpingu. Jak importować? Proszę poprawić
itsafire
Najwyraźniej w tej chwili nie ma dobrej odpowiedzi: serverfault.com/questions/709582/…
Otheus