более быстрая альтернатива cp -a


9

Для простого переноса / home на другой диск я использую, cp -aчто мне кажется очень медленным способом. Хотелось бы узнать более эффективный способ выполнения задачи. Я / home смонтирован как логический том, но целевой диск не является системой LVM


4
Если cpэто медленно, другие методы тоже будут медленными. Если только это не файлово-ориентированное копирование
маргаритка

Попробуйте диагностировать узкое место, которое зависит от вашей конкретной настройки. Вы можете попробовать noatimeопцию монтирования, чтобы уменьшить ненужные записи, особенно в исходную файловую систему.
Элиас Торрес Арройо

Ответы:


16

Попробуйте tar, pax, cpio, с чем - то буферизацией.

(cd /home && bsdtar cf - .) |
  pv -trab -B 500M |
  (cd /dest && bsdtar xpSf -)

Я предлагаю bsdtarвместо того, чтобы, tarпо крайней мере, в некоторых дистрибутивах Linux tarесть GNU tar, который в отличие от bsdtar(from libarchive) не обрабатывает сохранение расширенных атрибутов, ACL или атрибутов linux.

pvбуферизует до 500 МБ данных, так что может лучше учитывать колебания скорости чтения и записи в двух файловых системах (хотя в действительности у вас, вероятно, будет диск медленнее, чем другая, и механизм обратной записи ОС будет выполнять эту буферизацию как ну, так что это, вероятно, не будет иметь большого значения). Старые версии pvне поддерживают -a(для отчетов о средней скорости), вы можете использовать их pv -B 200Mтам в одиночку.

В любом случае, у тех не будет ограничений cp, что делает чтение и запись последовательно. Здесь у нас есть два tarработающих одновременно, поэтому один может прочитать одну ФС, а другая занята, ожидая, пока другая ФС завершит запись.

Для ext4, и если вы копируете на раздел, который по крайней мере такой же большой, как и исходный, посмотрите также, как clone2fsэто работает ntfsclone, то есть копирует только выделенные блоки и последовательно, поэтому ротационное хранение, вероятно, будет наиболее эффективным.

Partclone обобщает это на несколько разных файловых систем.

Теперь несколько вещей, которые необходимо учитывать при клонировании файловой системы.

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

  • ссылки: символические ссылки и жесткие ссылки. Иногда нам нужно подумать, что делать с абсолютными символическими ссылками или символическими ссылками, которые указывают на клонирование файловой системы / каталога
  • время последнего изменения, доступа и изменения: только первые два могут быть скопированы с помощью API файловой системы (cp, tar, rsync ...)
  • Разреженность: у вас есть тот разреженный файл объемом 2 ТБ, который представляет собой образ диска виртуальной машины, который занимает всего 3 ГБ дискового пространства, в остальном, разреженный, создание простой копии заполнит целевой диск.

Тогда, если вы рассмотрите ext4и большинство файловых систем Linux, вам придется рассмотреть:

  • ACL и другие расширенные атрибуты (например, используемые для SELinux)
  • Атрибуты Linux, такие как неизменяемые или только добавляемые флаги

Не все инструменты поддерживают все это, или когда они делают, вы должны включить его явно, как --sparse, --acls... параметры rsync, tar... И при копировании в другие файловые системы, вы должны рассмотреть случай, когда они не делают Поддержите тот же набор функций.

Возможно, вам также придется учитывать атрибуты файловой системы, такие как UUID, зарезервированное пространство для root, частота fsck, поведение журналирования, формат каталогов ...

Кроме того, существуют более сложные файловые системы, в которых невозможно скопировать данные путем копирования файлов. Рассмотрим, к примеру, zfsили btrfsкогда вы можете сделать снимки подразделов и разветвить их ... У них будут свои собственные специальные инструменты для копирования данных.

Байт-байтовая копия блочного устройства (или, по крайней мере, выделенных блоков, когда это возможно) часто является наиболее безопасной, если вы хотите убедиться, что вы копируете все. Но остерегайтесь проблемы коллизии UUID, и это подразумевает, что вы копируете на что-то большее (хотя вы можете изменить размер копии снимка источника перед копированием).


1
У GNU tar есть --aclsопция для сохранения ACL в архиве. И я был бы удивлен, если бы инопланетный (своего рода) инструмент, вроде бы, bsdtarсправлялся с этим лучше, чем (по сути) родной ...
vonbrand

@vonbrand. Ваш tar должен быть исправлен для этого (я думаю, что RedHat имеет исправление для GNU tar для ACL), потому что последняя версия GNU tar не поддерживает такую ​​опцию. Там существует ряд реализаций tarдля Linux ( star, bsdtar, tar), я не знаю , что GNU деготь лучше , чем другие. Выбор инструментов GNU обычно более политический, чем технический (см., Например bash).
Стефан Шазелас

1
Использование инструментов GNU может быть политическим выбором, но, тем не менее, это выбор по умолчанию. И поскольку они намного более популярны, чем альтернативы, за ними также стоит больше разработчиков (и других).
vonbrand

спасибо, в следующий раз я буду использовать pv и tar вместо cp
Yurij73

@ StéphaneChazelas В настоящее время GNU tar поддерживает--acls
Ploni

4

Я рекомендую rsync, например:

rsync -av --progress --stats dest orig

Или передать со сжатием:

rsync -avz --progress --stats dest orig

1
rsyncкак правило, намного медленнее, чем cpилиtar|tar
Стефан Шазелас

Спасибо за эту информацию :), но я никогда не сравнивал эти два ...
Виктор Аурелио


Я бы не стал доверять этой статье слишком сильно. Я использую rsync довольно часто и регулярно копирую со скоростью 130-170 МБ / с.
laebshade

9
rsyncнаиболее эффективен, если у вас уже частично есть исходные данные, доступные на томе назначения, потому что он будет передавать только отсутствующие / измененные данные. Я бы не стал использовать его для быстрой «первой копии».
Тотор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.