Мне нужно сделать копию работающей системы Linux, которая (содержащаяся в /, а новое место подготовлено в / mnt / sdb5), похоже, содержит значительное количество жестких, программных ссылок и специальных файлов в / dev; бы cpio
справиться с этой работой без применения дополнительной магии?
Известные в настоящее время гарантии:
root=/dev/sdb5
; перед удалением сделайте полную резервную копию раздела.Но все же, не собираюсь терять время только потому, что cpio пропустил какой-то флаг и искалечил разрешения / тип узла / мягкую или жесткую ссылку.
Какой инструмент использовать / каких подводных камней избегать?
Чтобы ответить на актуальный вопрос относительно 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
. Я рекомендую следующую процедуру:
mkdir /tmp/dev
mount --move /dev /tmp/dev
/dev
к /mnt/sdb5
используя одну из приведенных выше командmount --move /tmp/dev /dev
rmdir /tmp/dev
Как упоминалось в @Klox, при копировании разделов одинакового размера я соглашаюсь использовать dd
.
Но если вы хотите скопировать диск на другой раздел с другим размером, я бы предпочел rsync
. Смонтируйте новый раздел (скажем, / mnt / new) и:
# rsync -a --exclude=/proc --exclude=/dev --exclude=/sys / /mnt/new
Нет дополнительной магии для символических ссылок и нет необходимости в live cd (single user / init 1 подойдет).
Более оптимальный вариант dd
использует partimage
, копируется только используемый раздел раздела, что делает более целесообразным копирование больших неиспользуемых разделов.
Обратите внимание на важное предостережение:
Partimage НЕ поддерживает Ext4, который используется по умолчанию в новых установках Ubuntu.
Удобная копия находится на Компакт-диск аварийного восстановления системы распространение.
При перемещении установок Linux между жесткими дисками я всегда загружаюсь с Live CD и использую dd
чтобы скопировать весь раздел. Я понимаю, что это не касается изменений в размере диска (неизбежно новый диск больше, что упрощает ситуацию), но мне нравится техника именно по тем причинам, по которым вас беспокоит использование cpio
: что-то может пойти не так. Используя dd
Это все или ничего: либо новый диск загружается и все остается прежним, либо диск не загружается. Нет риска, что скрытые проблемы появятся позже.
Теперь, конечно, возникает проблема, связанная с тем, что раздел не заполняет новый диск, но я бы предпочел просто создать новый раздел, чтобы заполнить дополнительное пространство, и полагаться на символические ссылки для перемещения каталогов. (Я уверен, что есть инструменты для изменения размера разделов, но я ими не пользовался.)