Как хорошо видно из @ sysadmin1138, эта проблема неизбежна при использовании cp
/ rsync
/ send
- получить
по файловым системам; но есть способ избежать этого при определенных обстоятельствах. Если вы используете семенное устройство, добавьте новое устройство (как 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
(Это данные strace, немного очищенные для ясности, сделанные при копировании файла.)
Чтобы скопировать файл из точки A в точку B, особенно через точки монтирования, Linux вызовет считывают
в файле, который нужно скопировать, а затем вызывают записывают
для нового. Вы можете увидеть это на приведенном выше графике.
Системный вызов read
запрашивает файл для использования процессом, который запускает распаковку BTRFS. Эти извлеченные данные затем передаются в вызов write
, который запускает сжатие BTRFS на цели. Это поведение является фундаментальным для того, как работают уровни файловой системы Linux.
Чтобы обойти это, не используйте cp
. Вам придется использовать специальный инструмент для btrfs, который полностью обрабатывает перемещение структур данных внутри тома btrfs. Проблема в том, что я не знаю, существуют ли такие инструменты.