Копирование между сжатыми lzo BtrFS: де / повторное сжатие?
Я копирую большое количество файлов между двумя сжатыми lzo файловыми системами BtrFS на разных дисках, смонтированных на одной машине. Похоже, что файлы де / повторно сжаты. Есть ли способ избежать этого?
2 ответа
Как хорошо показывает @sysadmin1138, эта проблема неизбежна при использовании cp
/rsync
/send
-receive
через файловые системы; но есть способ избежать этого при определенных обстоятельствах. Если вы используете начальное устройство, добавляете новое устройство (например, raid1), а затем удаляете начальное устройство, вы получите дубликат тома, который по сути совпадает с исходным. (Хотя UUID изменится.)
Как указано в списке разработчиков, "... дубликат тома по сути совпадает с исходным (процесс копирует фрагменты), что означает, что профиль фрагмента также сохраняется".
В качестве примечания, касающегося моего конкретного варианта использования, я мог бы использовать этот метод для копирования, выполнить установку сервера в подобъем, а затем просто mv
Я закончил файлы Это позволило бы сэкономить значительный объем работы.
Не совсем, и это сводится к системным вызовам. Есть пример:
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
(Это обычные данные, немного очищенные для ясности, сделанные при копировании файла.)
Чтобы скопировать файл из точки A в точку B, особенно через точки монтирования, Linux будет вызывать read
на файл, который будет скопирован, а затем позвоните write
на новый. Вы можете видеть это в приведенном выше следе.
- Откройте исходный файл, получив файл-описатель № 3.
- Откройте файл назначения, получив файл-описатель номер 4.
- Прочитайте из описания 3, исходный файл.
- Запишите данные, считанные из 3, в описатель 4, целевой файл.
- Закройте все.
read
syscall запрашивает файл для использования процессом, который запускает декомпрессию BTRFS. Эти восстановленные данные затем поступают в write
вызов, который вызовет сжатие BTRFS на цели. Такое поведение является фундаментальным для работы слоев файловой системы Linux.
Чтобы обойти это, не используйте cp
, Вам придется использовать специальный инструмент btrfs, который полностью обрабатывает движущиеся структуры данных в объеме btrfs. Проблема в том, что я не знаю, существуют ли такие инструменты.