Как переместить Linux в другой раздел?

Мне нужно сделать копию работающей системы Linux, которая (содержится в /, а новое место подготовлено в /mnt/sdb5), по-видимому, содержит значительное количество жестких, программных ссылок и специальных файлов в /dev; было бы cpio справиться с этой работой без применения дополнительной магии?

В настоящее время известны гарантии:

  • не собирается удалять / изменять работающую систему до тех пор, пока копия не будет считаться загрузочной и работать с ней root=/dev/sdb5; перед удалением сделайте полную резервную копию раздела.
  • будет использовать cpio для архивирования каждого корневого каталога по отдельности, поэтому распакует его из среды LiveCD, чтобы донорский раздел не пострадал

Но, тем не менее, мы не собираемся терять время только потому, что cpio пропустил какой-то флаг и нанёс вред полномочиям / типу узла / soft или hardlink.

Какой инструмент использовать / каких подводных камней избегать?

4 ответа

Решение

Чтобы ответить на актуальный вопрос относительно cpio: Эти флаги я бы использовал для cpio:

find / -xdev -depth \! -path ./lost+found -print0 | cpio --pass-through --null --dot --make-directories --unconditional --preserve-modification-time --sparse /mnt/sdb5

Конечно, поскольку вы не копируете по сети, я бы просто использовал cp:

cp --archive --sparse=always --verbose --one-file-system --target-directory=/mnt/sdb5 /

И если вы хотите иметь возможность сделать копирование несколько раз, rsync это лучший выбор для его возобновления возможностей. (Это также, как cp, обрабатывает ACL и расширенные атрибуты и может работать по сети, например, cpio, Так что это самый полезный вариант, за исключением того, что вы делаете первую копию локально, что я предпочитаю делать с помощью cp.)

rsync --archive --inplace --hard-links --acls --xattrs --devices --specials --one-file-system --8-bit-output --human-readable --progress / /mnt/sdb5

Не забудьте скопировать /boot а также /dev !

/boot это просто, просто скопируйте его. Но /dev гораздо сложнее в наше время, так как он скрыт udev, Я рекомендую следующую процедуру:

  1. mkdir /tmp/dev
  2. mount --move /dev /tmp/dev
  3. копия /dev в /mnt/sdb5 используя одну из вышеуказанных команд
  4. mount --move /tmp/dev /dev
  5. rmdir /tmp/dev

Как упомянул @Klox, при копировании разделов одинакового размера я согласен на использование dd,

Но когда вы хотите скопировать диск на другой раздел другого размера, я бы предпочел rsync, Смонтируйте новый раздел (скажем, /mnt/new) и:

# rsync -a --exclude=/proc --exclude=/dev --exclude=/sys / /mnt/new

Нет дополнительной магии для символических ссылок и нет необходимости в живом компакт-диске (для одного пользователя / init 1 все будет в порядке).

Более оптимальный вариант dd использует partimage, он будет копировать только используемый раздел раздела, что делает копирование больших неиспользуемых разделов более целесообразным.

Обратите внимание на важное предостережение:

Partimage НЕ поддерживает Ext4, который используется по умолчанию в новых установках Ubuntu.

Удобная копия включена в дистрибутив System Rescue CD.

При перемещении установок Linux между жесткими дисками я всегда загружаюсь с Live CD и использую dd скопировать весь раздел. Я признаю, что это не касается изменений в размере диска (неизбежно, что новый диск больше, что упрощает вещи), но мне нравится техника именно по тем причинам, по которым вы беспокоитесь об использовании cpio: что-то может пойти не так. С использованием dd Техника, это все или ничего: либо новый диск загружается и все то же самое, либо диск не загружается. Там нет риска скрыться проблемы всплывают позже.

Теперь, конечно, есть проблема с разделом, который не заполняет новый диск, но я бы предпочел просто создать новый раздел, чтобы заполнить дополнительное пространство и полагаться на символические ссылки для перемещения каталогов. (Я уверен, что есть инструменты для изменения размера разделов, но я не использовал их.)

Другие вопросы по тегам