Скопируйте всю иерархию файловой системы с одного диска на другой


95

Я хотел бы скопировать всю иерархию файловой системы с одного диска на другой .. содержимое каждого каталога, а также обычные файлы на платформе Linux. Было бы полезно узнать лучший способ сделать это, возможно, с помощью встроенных функций Linux. Файловая система - это семейство ext.


1
Хм ... где любовь dd? dd if=/dev/sda1 of=/dev/sdb1 bs=4096
juniorRubyist

@juniorRubyist +1 для дд. Я всегда этим пользуюсь. Но какие флаги использовать? Я использую conv=notrunc,noerror,sync.
BeniBela

-1 по ddдвум причинам: во-первых, это плохая идея - выполнить копирование файловой системы, смонтированной (что имеет место /), на уровне блоков, а во-вторых dd, не будет копировать данные из источников, смонтированных в файловой системе, таких как /bootи /home.
Эрик

Ответы:


33

Я часто использую

> cp -ax / /mnt

Предполагается, что / mnt - это новый диск, смонтированный в / mnt, и нет никаких других монтировок в /.

-x хранит его в одной файловой системе.

Это, конечно, нужно сделать как root или с помощью sudo.

Эта ссылка имеет несколько вариантов, в том числе выше

http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html


в то время как это мертвый старый ответ он все еще стоит отметить , что вы обычно не хотите , чтобы скопировать весь материал представить в /, исключая то /dev, /sys, и /procт.д. Поэтому перед выпуском , что cpя предлагаю в поиски лучших подходов (также с помощью Rsync)
Марцин Орловского

2
@MarcinOrlowski Использование флага WolfJM -xозначает, что упомянутые вами синтетические файловые системы не будут скопированы.
Джим Л.

192

То, что вы хотите, это rsync .

Эта команда может использоваться для синхронизации папки, а также для возобновления копирования, когда она прервана на полпути. Команда для копирования одного диска:

rsync -avxHAX --progress / /new-disk/

Варианты:

-a  : all files, with permissions, etc..
-v  : verbose, mention files
-x  : stay on one file system
-H  : preserve hard links (not included with -a)
-A  : preserve ACLs/permissions (not included with -a)
-X  : preserve extended attributes (not included with -a)

Чтобы повысить скорость копирования, добавьте -W( --whole-file), чтобы избежать вычисления дельт / разностей файлов. Это значение по умолчанию, когда и источник, и адресат указываются в качестве локальных путей, поскольку реальным преимуществом алгоритма дельта-передачи rsync является снижение использования сети.

Также рассмотрите возможность добавления, --numeric-idsчтобы избежать сопоставления значений uid / gid по имени пользователя / группы.


1
Гений, спасибо. Кстати, я в конечном итоге использовать, rsync -avxHAWX --numeric-ids --progress / mnt/но я должен был сделать rsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out. Я подозреваю, что заливка вывода на терминал замедлила процесс. : D
Крис К

28
--info=progress2вместо этого --progressполезен для больших передач, так как он дает общий прогресс, а не (миллионы строк для) отдельных файлов.
Флориан

3
Мне пришлось заменить Xи Aна E, потому что расширенные атрибуты и ACL покрыты Eна моем Mac. Проверено:rsync version 2.6.9 protocol version 29
Джонатан Комар

1
Кроме того > ~/rsync.out, 2> ~/rsync.errсохранит все ошибки в отдельный файл.
Aneel

2
Если вы копируете из какой-то другой папки, кроме того /, обратите внимание, что наличие косой черты (или нет) в исходном каталоге имеет значение: rsync source/ dest/копирует все внутри source/в dest/, а rsync source dest/копирует папку sourceи все внутри в dest/.
полу-внешний

45

Ответ Майкла Аарона Сафяна не учитывает редкие файлы. -Sопция исправляет это.

Также этот вариант не спамит с каждым прогрессом файла и не выполняет дельта-синхронизацию, которая снижает производительность в не-сетевых случаях.

Идеально подходит для копирования файловой системы с одного локального диска на другой локальный диск.

rsync -axHAWXS --numeric-ids --info=progress2

1
Удивительно. Это действительно делает хорошую работу
Гилдас

1
Это должен быть принятый ответ, прекрасно работает. Пример55,431,669,792 57% 97.47MB/s 0:06:56 xfr#2888, ir-chk=5593/8534)
Дрю

1
<3 это прекрасно
Тим Страйдхорст

6

Я полагаю, что для локальной копии одного кадра с одного диска на другой достаточно cp, как описано выше в Wolfmann.

Для больших работ, таких как локальное или удаленное резервное копирование, лучше всего использовать rsync .

Конечно, rsync значительно сложнее в использовании.

Почему Rsync:

  • это позволяет вам копировать (синхронизированное копирование) весь или часть вашего диска A на диск B, используя множество опций, например, исключение некоторых каталогов из копии (например, исключая / proc).

  • Другим большим преимуществом является то, что этот собственный инструмент контролирует передачу файлов: например, для массивных передач, если соединение прерывается, оно будет продолжаться с точки останова.

  • И последнее, но не менее важное: rsync использует ssh-соединение, что позволяет вам получать удаленные синхронизированные защищенные «копии». Загляните на страницу справочника, а также здесь несколько примеров .


4

Как предлагает Майкл Сафян выше, я использовал rsyncдля этой цели. Я предлагаю использовать некоторые дополнительные параметры, чтобы исключить каталоги, которые вы, вероятно, не хотите копировать.

Эта версия довольно специфична для систем на основе Gnome и Debian / Ubuntu, поскольку она включает в себя подкаталоги домашних каталогов пользователей, которые являются специфическими для Gnome, а также кеш пакета APT.

Последняя строка исключит любой каталог с именем cache / Cache / .cache, который может быть слишком агрессивным для некоторых целей:

rsync -WavxHAX --delete-excluded --progress \
  /mnt/from/ /mnt/to/
  --exclude='/home/*/.gvfs' \
  --exclude='/home/*/.local/share/Trash' \
  --exclude='/var/run/*' \
  --exclude='/var/lock/*' \
  --exclude='/lib/modules/*/volatile/.mounted' \
  --exclude='/var/cache/apt/archives/*' \
  --exclude='/home/*/.mozilla/firefox/*/Cache' \
  --exclude='/home/*/.cache/chromium'
  --exclude='home/*/.thumbnails' \
  --exclude=.cache --exclude Cache --exclude cache

2

Добавив два полезных бита к потоку re rsync: изменение шифра и использование --update:

Согласно посту Вольфмана, cp -axон элегантен и хорош для местных вещей.

Впрочем, rsyncэто тоже круто. В дополнение к ответу Михаэля -W, изменение шифра также может ускорить процесс (хотя читайте о любых последствиях для безопасности).

rsync --progress --rsh="ssh -c blowfish" / /mnt/dest -auvx

Существует некоторое обсуждение (и эталонные тесты) о том, что медленный процессор является фактическим узким местом, но, похоже, он помогает мне, когда машина загружается, делая другие параллельные вещи.

Одна из других серьезных причин для использования rsync в большой рекурсивной копии, подобной этой, заключается в ключе -u (или --update ). Если во время копирования возникнет проблема, вы можете исправить ее, и rsync определит, где она остановилась (я не думаю, что у scp есть это). Делая это локально, cp также имеет ключ -u.

(Я не уверен, каково значение --update и --whole-file вместе, но они всегда, кажется, работают разумно для меня в этом типе задачи)

Я понимаю, что это не тема о функциях rsync, но некоторые из наиболее распространенных, которые я использую для этого:

  • --delete-after и т. д. (как Майкл упомянул в последующей статье ), если вы хотите синхронизировать новую систему обратно в исходное место или что-то в этом роде. А также,
  • --exclude - для пропуска каталогов / файлов, например, для копирования / создания новой системы в новом месте, пропуска домашних каталогов пользователей и т. д. (либо вы монтируете дома откуда-то еще, либо создаете новых пользователей и т. д.).

Между прочим, если мне когда-либо придется использовать windows, я использую rsync из cygwin для создания больших рекурсивных копий, потому что исследователь с легким головокружением хочет начать с самого начала (хотя я считаю, что Finder - это OS X еще хуже)


2

Rsync

«Этот подход считается лучше, чем клонирование дисков с помощью dd, поскольку он позволяет использовать другой размер, таблицу разделов и файловую систему, а также лучше, чем копирование с помощью cp -a, поскольку он обеспечивает больший контроль над разрешениями файлов, атрибутами , Списки контроля доступа (ACL) и расширенные атрибуты. "

Из:

https://wiki.archlinux.org/index.php/Full_system_backup_with_rsync

Страница человека здесь


2

Как упомянуто в комментариях juniorRubyist, предпочтительным подходом здесь должно быть использование dd. Основная причина - производительность, это блок-за-копией, а не файл за файлом.

Клонирование раздела

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress

Клонирование всего диска

# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress

Рекомендации

  1. https://wiki.archlinux.org/index.php/disk_cloning

ddэто очень плохая идея по двум причинам: во-первых, выполнение копии файловой системы, смонтированной (что имеет место /), на уровне блоков, скорее всего, приведет к ошибкам целевой файловой системы, а во-вторых dd, не будет копировать данные из источников, смонтированных в файловая система, как /bootи /home. Ваша ссылка действительна для клонирования диска, а не клонирования "файловой иерархии"
Эрик

1

'dd' - это круто, но ddrescue (apt install gddrescue) еще лучше. Если dd прерван, перезапуск невозможен (еще одна веская причина использовать rsync). Когда вы используете ddrescue с файлом журнала, он отслеживает, какие блоки были скопированы.

При резервном копировании системы Windows / Linux с двойной загрузкой я использую ntfsclone для разделов Windows и ddrescue для раздела Linux и dd для MBR. (Я не пытался создать резервную копию системы с двойной загрузкой, используя GPT / UEFI.)

Я бы хотел увидеть инструмент ddrescue, который может создавать файлы, такие как ntfsclone, где незанятое пространство помечается управляющими символами. Это делает изображение не монтируемым напрямую, но позволяет ему быть только такого размера, как содержащиеся данные.

Кто-то, пожалуйста, придумайте ntfsclone "специальный формат изображения" для ddrescue ...


0

rsync это идеальное решение, как описано выше.

Я бы просто добавил, -Sчтобы « эффективно обрабатывать разреженные файлы » на случай, если будет скопирован том устройства сопоставления устройств Docker или аналогичный том.


0

Я попробовал команды rsync, предложенные здесь, но в итоге я получил намного чище и быстрее результаты partclone. Размонтируйте исходный и целевой разделы, а затем выполните следующее:

partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
e2fsck -f /dev/sd(target)
resize2fs /dev/sd(target)

Это выполняет следующие шаги:

  1. Клон (только используемые части) раздела
  2. убедитесь, что с файловой системой все в порядке (resize2fs применяет этот шаг)
  3. изменить размер раздела на новую файловую систему

Вышеуказанное работает в том случае, если целевой раздел имеет такой же размер или больше исходного. Если ваша цель меньше источника (но подходит для всех данных), сделайте следующее:

e2fsck -f /dev/sd(target)
resize2fs -M /dev/sd(target)
partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
resize2fs /dev/sd(target)

resize2fs -M сжимает файловую систему до минимального размера перед клонированием данных.

Обратите внимание, что partcloneпо умолчанию не устанавливается в большинстве систем. Используйте живой дистрибутив, такой как clonezilla, или установите partclone из диспетчера пакетов дистрибутива ( apt-get install partcloneв системах на основе debian).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.