Cara menyalin tata letak partisi seluruh disk menggunakan alat standar

82

Saya ingin mengambil cadangan seluruh tata letak partisi pada hard drive, termasuk drive logis, sehingga saya dapat mengembalikan tata letak itu ke disk lain. Saya tidak ingin menyalin isi partisi, hanya tata letak. Untuk partisi primer dan perluasan, mudah:

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

Tetapi ketika datang ke tata letak partisi logis, saya ingin tahu apakah ada di antara alat standar cara yang sama untuk menyimpan tata letak? Saya kira masalah utama adalah menemukan offset ke lokasi EBR, karena dengan itu, ddakan melakukan sisanya. Perlu diingat saya harus bisa mengembalikan semuanya ke disk kosong (mungkin) dan dengan demikian mengembalikan tata letak yang sama. Menggunakan alat partisi suka fdiskatau partedbaik-baik saja, tapi saya harus dapat mengotomatiskan penggunaannya (scripting) dan mereka tidak harus bergantung pada paket-paket yang berhubungan dengan X - hanya baris perintah.

Rencana cadangan saya melakukannya secara manual dalam skrip python kecil menggunakan modul struct, tapi saya agak berharap ada cara yang lebih mudah.

Lauritz V. Thaulow
sumber

Jawaban:

89

Anda dapat menggunakan sfdisk untuk tugas ini.

Menyimpan:

sfdisk -d /dev/sda > part_table

Mengembalikan:

sfdisk /dev/sda < part_table

Untuk tabel partisi GPT, ini membutuhkan sfdiskdari util-linux 2.26 atau yang lebih baru. Itu ditulis ulang dari awal di atas libfdisk .

Ini menyalin UUID tidak berubah, daripada menghasilkan yang baru. Jadi disk baru adalah tiruan dari yang asli, bukan hanya disk lain dengan tata letak yang sama. Perhatikan bahwa Linux /dev/disk/by-uuid/melihat UUID sistem file, bukan UUID di tabel partisi. sfdiskakan menghasilkan UUID baru jika Anda mengedit UUID dari dump (per-partisi dan UUID untuk tabel partisi itu sendiri di dekat awal file).

Petr Uzel
sumber
1
Saya tidak tahu pasti, tetapi satu-satunya batas yang terlintas di benak saya adalah batas ukuran 2TB untuk partisi yang dikenakan oleh skema tabel partisi msdos. Untuk mengatasi batas ini, seseorang dapat menggunakan GPT, tetapi AFAIK sfdisk tidak dapat bekerja dengan GPT. Saya tidak tahu apakah ada batasan lain atau apakah sfdisk akan melaporkan jika tidak bisa mengatasinya.
Petr Uzel
2
sfdisktidak berfungsi dengan volume besar atau mendukung GPT.
dhchdhd
1
@Barry dan ketika Anda mengatakan "besar", Anda mengacu pada batas 2TB yang dibicarakan @Petr?
Lauritz V. Thaulow
5
Cara yang benar adalah: sudo parted / dev / sda -lm> sda.parted
dhchdhd
1
Terkadang berguna, untuk mengabaikan masalah hanya DOS, untuk menambahkan opsi -L atau --linux :sfdisk -L /dev/sda < part_table
Diego
51

Itu tergantung jika disk sumber Anda menggunakan tabel partisi MBR (alias "dos" atau "msdos") atau GPT (alias "GUID").

Disk lebih dari 2 TB tidak dapat menggunakan MBR, jadi mereka GPT.

Disk di bawah 2 TB dapat menggunakan keduanya, jadi Anda harus terlebih dahulu mencari tahu yang mana.

Dengan anggapan Anda menggunakan Linux, gunakan salah satu dari perintah ini untuk mencari tahu tabel partisi mana yang digunakan oleh disk sumber Anda:

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

Diberikan

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

Untuk disk MBR

gunakan sfdiskseperti yang disarankan oleh jawaban Petr Uzel, atau varian ini:

# 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

Untuk disk GPT

Jawaban yang benar diberikan di sini dan di sini oleh Kris Harper .

Anda membutuhkan GPT fdisk . Lihatlah halaman unduhan atau jalankan sudo apt-get install gdisk.

Kemudian gunakan perintah sgdisk :

# Save GPT 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

Perintah terakhir mengacak GUID pada disk dan semua partisi. Ini hanya diperlukan jika disk akan digunakan di mesin yang sama, jika tidak maka tidak perlu.

mivk
sumber
10
Saya selalu takut saya akan mencampur dua parameter, jadi trik yang baik adalah menggunakan --backup=Fileuntuk mengekspor tabel partisi dari drive sumber dan --load-backup=Fileuntuk mengembalikan drive tujuan.
zidarsk8
Apakah ada risiko terhadap data yang ada pada disk dan partisi selanjutnya ketika Anda memindahkan tabel partisi dan kemudian mengacak GUID dari disk dan partisi seperti yang Anda jelaskan di atas? Terima kasih!
EngBIRD
@ EngBIRD: Selama Anda tidak mencampur $ sumber dan $ dest, tidak mungkin ada risiko untuk data, karena tidak ada data di tujuan. Anda hanya menyalin tata letak partisi, dan masih perlu memformat dan menyalin data setelahnya.
mivk
Alasan saya bertanya sebenarnya adalah saya tidak memulai dari disk kosong, saya bertukar dua disk sekitar ...
EngBIRD
5

Bindings pyparted dan python- lvm yang lebih tua tetapi masih menarik .

Memperbarui:

Yang sebelumnya telah diposting karena di atas tidak berfungsi dalam banyak situasi modern per halaman manual sfdisk.

sfdisk tidak mengerti GUID Partition Table (GPT) dan tidak dirancang untuk partisi besar. Dalam kasus tertentu, gunakan GNU parted yang lebih lanjut (8).

Namun perintah ini mendukung> 2 TB partisi dan LVM.

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

Output sampel:

BYT;
/dev/sda:12.9GB:scsi:512:512:msdos:VMware Virtual disk;
1:1049kB:12.9GB:12.9GB:::boot, lvm;
dhchdhd
sumber
14
Bagaimana Anda memulihkan dari sda.partedfile yang disimpan ke disk baru?
Avery Chan
4
Jawaban ini tidak berguna karena pertanyaannya adalah tentang menyalin tata letak partisi ke drive baru. Jawabannya hanya tentang membuang. Bagaimana cara mengimpor? Tolong tingkatkan.
itsafire
Rupanya saat ini, tidak ada jawaban yang baik: serverfault.com/questions/709582/…
Otheus