Копирование между сжатыми lzo файловыми системами BtrFS: де / повторное сжатие?

Я копирую большое количество файлов между двумя файловыми системами BtrFS, сжатыми lzo, на разных дисках, установленных на одной машине. Похоже, что файлы де / повторно сжимаются. Есть ли способ избежать этого?

1
задан 8 January 2016 в 22:38
2 ответа

Как хорошо видно из @ sysadmin1138, эта проблема неизбежна при использовании cp / rsync / send - получить по файловым системам; но есть способ избежать этого при определенных обстоятельствах. Если вы используете семенное устройство, добавьте новое устройство (как raid1), а затем удалите семя, вы получите дублированный том, который по существу совпадает с исходным. (Хотя UUID изменится.)

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

В качестве примечания относительно моего конкретного варианта использования, я мог бы использовать этот метод для копирования, выполнить установку моего сервера в подобтоме, а затем просто mv перезагрузить файлы. Это позволило бы сэкономить значительный объем работы.

0
ответ дан 3 December 2019 в 18:36

Не совсем, все сводится к системным вызовам. Приведите пример:

open  ("tuppence", O_RDONLY)                           = 3
fstat (3, {st_mode=S_IFREG|0644, st_size=15, ...})     = 0
open  ("/tmp/tuppence", O_WRONLY|O_CREAT|O_EXCL, 0644) = 4
fstat (4, {st_mode=S_IFREG|0644, st_size=0, ...})      = 0
read  (3, "I have cheese.\n", 32768)                   = 15
write (4, "I have cheese.\n", 15)                      = 15

(Это данные strace, немного очищенные для ясности, сделанные при копировании файла.)

Чтобы скопировать файл из точки A в точку B, особенно через точки монтирования, Linux вызовет считывают в файле, который нужно скопировать, а затем вызывают записывают для нового. Вы можете увидеть это на приведенном выше графике.

  1. Откройте исходный файл, получив номер описателя файла 3.
  2. Откройте файл назначения, получив номер описателя файла 4.
  3. Считайте из дескриптора 3, исходный файл.
  4. Запишите прочитанные данные из 3 в описатель 4, целевой файл.
  5. Закройте все.

Системный вызов read запрашивает файл для использования процессом, который запускает распаковку BTRFS. Эти извлеченные данные затем передаются в вызов write , который запускает сжатие BTRFS на цели. Это поведение является фундаментальным для того, как работают уровни файловой системы Linux.

Чтобы обойти это, не используйте cp . Вам придется использовать специальный инструмент для btrfs, который полностью обрабатывает перемещение структур данных внутри тома btrfs. Проблема в том, что я не знаю, существуют ли такие инструменты.

3
ответ дан 3 December 2019 в 18:36

Теги

Похожие вопросы