как скопировать структуру разделов целого диска, используя стандартные инструменты

<p>я хочу сделать резервную копию всего раздела <em> </em> жесткого диска, включая логические диски, чтобы я мог восстановить этот макет на другой диск. я делаю <strong>не</strong> хочу скопировать содержимое разделов, только макет. для основного и расширенного разделов это просто:</p><pre><code>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 </code></pre><p>но когда дело доходит до компоновки логических разделов, мне интересно, существует ли среди стандартных инструментов подобный способ сохранения макета? я предполагаю, что основная проблема заключается в поиске смещений в местоположениях ebr, потому что с этим <code>dd</code> сделает все остальное. имейте в виду, что я должен иметь возможность поместить все обратно на (возможно) чистый диск и, таким образом, восстановить тот же макет. использование инструментов разбиения, таких как <code>fdisk</code> или <code>parted</code>, хорошо, но я должен быть в состоянии автоматизировать их использование (создание сценариев), и они не должны зависеть ни от каких пакетов, связанных с x - только командная строка.</p><p>мой план резервного копирования делает это вручную в небольшом сценарии python с использованием модуля struct, но я скорее надеялся, что есть более простой способ.</p>

<p>вы можете использовать <a href="https://linux.die.net/man/8/sfdisk">sfdisk</a> для этой задачи.</p><p>сохранить:</p><pre><code>sfdisk -d /dev/sda > part\_table </code></pre><p>восстановить:</p><pre><code>sfdisk /dev/sda < part\_table </code></pre><p>для таблиц разделов gpt это требует <code>sfdisk</code> из util-linux 2.26 или новее. это <a href="https://git.kernel.org/cgit/utils/util-linux/util-linux.git/commit/?id=1881390de25df8587b8fc281c451796f7d032dd3">было переписано с нуля поверх libfdisk</a> .</p><p>это копирует uuid без изменений, а не генерирует новые. таким образом, новый диск - это клон оригинала, а не просто еще один диск с такой же разметкой. обратите внимание, что в linux <code>/dev/disk/by-uuid/</code> рассматривает uuid файловой системы, но не uuid в таблице разделов. <code>sfdisk</code> создаст новые uuid, если вы отредактируете uuid из дампа (для каждого раздела и uuid для самой таблицы разделов в начале файла).</p>

<p><strong> это зависит </strong>, использует ли ваш исходный диск <a href="http://en.wikipedia.org/wiki/master\_boot\_record"> mbr </a> (он же "dos" или "msdos") или таблица разделов <a href="http://en.wikipedia.org/wiki/guid\_partition\_table"> gpt </a> (также известная как guid).</p><p>диски свыше 2 tb не могут использовать mbr, поэтому они являются gpt.</p><p>диски до 2 tb могут использовать оба, так что сначала вам нужно выяснить, что это такое.</p><p>предполагая, что вы работаете в linux, используйте любую из следующих команд, чтобы выяснить, какую таблицу разделов использует ваш исходный диск:</p><pre><code>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 как предложено в ответе петра узеля или этот вариант:# 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правильный ответ был дан <a href="https://askubuntu.com/a/57922/8822">здесь и <a href="https://unix.stackexchange.com/a/19051/7286">здесь <a href="https://unix.stackexchange.com/users/9978/kris-harper">крис харпер .вам нужно <a href="http://www.rodsbooks.com/gdisk/">gpt fdisk . посмотрите на <a href="http://www.rodsbooks.com/gdisk/download.html">страница загрузки или запустите sudo apt-get install gdisk.затем используйте команду <a href="http://www.rodsbooks.com/gdisk/sgdisk.html">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 </code></pre><p>последняя команда рандомизирует guid на диске и всех разделах. это необходимо только в том случае, если диски должны использоваться на одном компьютере, в противном случае это не нужно.</p>

<p>старые, но все еще интересные <a href="https://fedorahosted.org/pyparted/">pyparted</a> и <a href="http://code.google.com/p/python-lvm/">python-lvm</a> привязки.</p><p><strong> update: </strong></p><p>предыдущий был опубликован, потому что выше не работает во многих современных ситуациях для man-страницы sfdisk.</p><blockquote> <p>sfdisk не понимает guid таблица разделов (gpt) и не предназначена для больших разделов. в частном случае используйте более продвинутый gnu parted (8).</p> </blockquote><p>однако эта команда поддерживает> 2 tb разделы и lvm.</p><pre><code># parted -ms /dev/sda print > sda.parted </code></pre><p>пример вывода:</p><pre><code>byt; /dev/sda:12.9gb:scsi:512:512:msdos:vmware virtual disk; 1:1049kb:12.9gb:12.9gb:::boot, lvm; </code></pre>