Хотя поначалу предлагаемый «вызов» может показаться трудным, неосуществимым или звучать наивно, как некоторые прокомментировали, это не так. Основная идея использования dd для переноса с диска на больший и меньший - это прекрасно и дает преимущества для переноса данных. Конечно, наличие достаточного свободного места для размещения занятых данных на целевом диске является необходимым требованием.
Идея состоит в том, чтобы продумывать каждый раздел отдельно, а не весь диск сразу, как было изначально предложено. Может быть достигнуто еще больше: усеченные разделы можно также безопасно перенести с помощью инструментов изменения размера файловой системы. Действительно, такой вид миграции интересен для сохранения метаданных файловой системы и расширенных атрибутов файлов, которые нельзя легко скопировать с помощью таких инструментов, как cp, rsync, pax, ..., которые работают на уровне файловой системы, а не на уровне блочных устройств. Использование dd устраняет необходимость переустановки ОС или необходимости перемаркировки FS во избежание проблем с SELinux.
Ниже я обычно делаю для решения подобных задач:
1) Сначала вы должны уменьшить файловую систему (ы) в затронутых разделах, которые будут усечены. Для этого используйте инструмент resize2fs (если мы говорим о ext2 / ext3 / ext4 fs - другие современные FS также имеют инструменты изменения размера для той же цели). Обратите внимание, что хотя - по очевидным причинам - файловая система не может быть больше, чем раздел, в котором она находится, она может безопасно быть меньше. Уловка безопасности здесь состоит в том, чтобы уменьшить «больше, чем необходимо». Например: представьте, что у вас есть файловая система объемом 1 ТБ, которую вы хотите перенести на диск объемом 500 Гб. В этом случае я предлагаю уменьшить fs, скажем, до 450 гигабайт (для этого, конечно, должно быть достаточно свободного места, т. Е. Занимаемое в настоящее время пространство в этой файловой системе не может превышать 450 гигабайт). Кажущиеся потраченными впустую 50 гигабайтами места будут исправлены после переноса данных.
2) Разбить целевой диск соответствующей геометрией с учетом его пространственных ограничений;
3) dd данные, используя устройство (я) раздела, а не устройство диска (то есть, используйте dd if=/dev/sda# of=/dev/sdb#
для каждого раздела вместо использования if=/dev/sda of=/dev/sdb
). ПРИМЕЧАНИЕ: sda и sdb здесь только примеры; ВАЖНОЕ ПРИМЕЧАНИЕ: При переходе с устройства с большим разделом на устройство меньшего размера dd будет жаловаться на попытку записи сообщения в конец блочного устройства, это нормально, так как данные файловой системы были бы полностью скопированы до достижения этой точки. Чтобы избежать этого сообщения об ошибке можно указать размер копии с помощью bs=
и count=
параметрами в соответствии с размером усадки файловой системы, но это потребует некоторого (простой) расчета, но если сделано неправильно может рисковать данные.
4) После добавления данных измените размер соответствующей файловой системы (ов) в целевом разделе (ах) снова, используя resize2fs. На этот раз не указывайте новый размер файловой системы. При запуске без указания размера resize2fs увеличивает файловую систему так, чтобы она занимала максимально допустимый размер, поэтому в этом случае файловая система 450 Гиг будет снова расти, занимая весь раздел 500 Гига, и ни один байт не будет потрачен впустую. (Подход «уменьшить больше, чем необходимо» позволяет избежать ошибочного указания размеров и риска для ваших данных. Обратите внимание, что единицы GB и GiB могут быть сложными).
Примечание для более сложных операций: если у вас есть менеджер загрузки, который вы собираетесь скопировать, что весьма вероятно, вы можете создать первые несколько КБ диска, используя дисковое устройство вместо устройств раздела (например, dd if=/dev/sda of=/dev/sdb bs=4096 count=5
), а затем перенастроить геометрию в / dev / sdb (которая временно будет содержать недопустимую геометрию для нового диска, но нетронутый и действительный менеджер загрузки). Наконец, продолжайте использовать устройства разделов, как описано выше, для добавления разделов за раз. Я делал такие операции много раз. Совсем недавно я успешно выполнил сложную миграцию при переходе с жесткого диска, содержащего набор установок MacOSX и Linux, на меньший SDD в моем MacMini6,2. В этом случае мне пришлось загружать Linux с внешнего диска, делать загрузочный менеджер, запускать gdisk для исправления GPT на новом диске и, наконец, добавлять каждый раздел, содержащий только что сжатые файловые системы. (Обратите внимание, что схема разделов GPT хранит две копии таблицы разделов, одну в начале, а другую в конце диска. gdisk часто жалуется, потому что не может найти вторую копию PT и потому что разделы превышают размер диска, но он корректно решает проблему копирования PT после переопределения геометрии диска). Это был гораздо более сложный случай, но стоит упомянуть, потому что иллюстрирует, что этот вид операции также вполне осуществим.
Удачи! ... и самое главное, не забудьте сделать резервную копию всех важных данных перед такой операцией. Ошибка, и вы наверняка можете нанести непоправимый ущерб вашим данным.
И на всякий случай я не особо подчеркнул: сделайте резервную копию ваших данных перед миграцией! :)
dd
расчет оптимального размера блока