Reflinks в pacman: что такое reflink и зачем он нужен
Если в двух словах: reflink это механизм быстрого копирования файлов, при котором файловая система не копирует данные, а создаёт вторую ссылку на те же блоки. Данные при этом дублируются только в момент изменения одной из копий. Это называется copy-on-write (CoW). pacman использует reflink при распаковке пакетов и работе с кэшем, если корневой раздел на btrfs или XFS. На других файловых системах, например на ext4, pacman просто делает обычную копию.
Что такое reflink
Reflink (от англ. reference link) это операция файловой системы, которая создаёт копию файла почти мгновенно, какого бы размера он ни был. Вместо чтения и записи всех байтов ФС добавляет в метаданные ещё одну запись, указывающую на те же блоки. Обе копии выглядят как полноценные независимые файлы: у каждой свой inode, свои права доступа и свой владелец.
Технически reflink реализован через системный вызов ioctl с кодом FICLONE. Ядро передаёт файловой системе запрос «склонируй этот файл», и ФС сама решает, как это сделать. Для btrfs и XFS это означает создание новой записи в метаданных с указанием на существующие экстенты. Время операции не зависит от размера файла: гигабайтный образ и файл в десять килобайт клонируются одинаково быстро.
Ключевая особенность: copy-on-write. Пока ты не меняешь ни одну из копий, они делят одни и те же блоки на диске. Как только ты записываешь данные в одну из них, ФС выделяет новые блоки только для изменённой части. Остальные блоки остаются общими.
Поддерживают reflink две распространённые файловые системы: btrfs и XFS (начиная с ядра 4.9). На ext4 reflink нет, там копирование всегда физическое, с реальным переносом байтов.
Зачем pacman использует reflink
Пакеты Arch Linux это сжатые архивы в формате tar.zst. При установке pacman распаковывает их в корневую файловую систему, при обновлении перезаписывает старые файлы. Обе операции выигрывают от reflink.
Во-первых, скорость. Распаковка пакета с reflink не тратит время на повторное чтение и запись, ФС просто создаёт ссылки на блоки. Обновление большого пакета, например ядра или браузера, проходит заметно быстрее.
Поддержка reflink появилась в pacman 6.0. До этого распаковка всегда шла через обычное копирование, и установка большого пакета на btrfs занимала заметно больше времени. Сейчас механизм встроен в libalpm (библиотеку, на которой работает pacman) и включается автоматически.
Во-вторых, экономия места. Файлы в /var/cache/pacman/pkg и установленные файлы в корне делят одни и те же блоки, пока ты их не меняешь. Скачанный пакет лежит в кэше, и при установке pacman распаковывает его в корень, файлы из архива и файлы в кэше ссылаются на одни блоки, поэтому кэш перестаёт быть двойным расходом места. Раньше на btrfs приходилось выбирать: либо чистить кэш и терять возможность отката, либо мириться с двойным местом. Теперь компромисс не нужен.
В-третьих, надёжность. При обновлении pacman создаёт новую версию файла рядом со старой и переключает ссылку. Если процесс прервётся, старый файл останется целым. Что делать, если обновление всё-таки зависло, разобрано в статье «pacman -Syu завис: как прервать».
Reflink работает автоматически: отдельной настройки в /etc/pacman.conf нет. Если хочешь убедиться, что в конфиге ничего лишнего, выполни:
grep reflink /etc/pacman.conf
В стандартном конфиге вывод будет пустым, это нормально. Рефлинки включаются сами, когда файловая система их поддерживает.
Как проверить, что файловая система поддерживает reflink
Сначала посмотри, какая ФС на корневом разделе:
findmnt -o fstype /
Если в выводе btrfs или xfs, reflink доступен. Если ext4, нет, pacman будет делать обычные копии.
Проверить, что pacman реально использует reflink, можно через отладочный вывод:
pacman -Sp --debug linux 2>&1 | grep -i reflink
В выводе появится строка вроде using reflink, если ФС поддерживает механизм. На ext4 такой строки не будет.
Как проверить, что reflink применился
Самый простой способ: сравнить занятое место. Если файл в кэше и установленный файл делят блоки, суммарное место на диске меньше, чем сумма размеров файлов.
ls -la /var/cache/pacman/pkg/ | head
du -sh /var/cache/pacman/pkg
df -h /
ls показывает логические размеры файлов, du показывает реально занятые блоки, а df показывает общее занятое место на разделе. На btrfs расхождение между этими числами и есть эффект reflink.
Для btrfs есть более точная проверка, команда filefrag:
filefrag -v /var/cache/pacman/pkg/linux-*.pkg.tar.zst
Если у файла несколько физических экстентов, общих с другими файлами, reflink на месте.
На btrfs есть и более наглядный способ, команда btrfs filesystem du:
btrfs filesystem du /var/cache/pacman/pkg/linux-*.pkg.tar.zst
Она показывает и логический размер файла, и реально занятые блоки. Если второе число заметно меньше первого, файл делит блоки с другими файлами.
Подробнее про устройство кэша pacman читай в статье «Где лежат базы pacman».
Чем reflink отличается от hardlink, symlink и обычной копии
Hardlink это две записи в каталогах, указывающие на один и тот же inode. Изменение одного файла сразу видно в другом, удаление одной записи не трогает данные. У reflink же у каждой копии свой inode, и изменения не пересекаются.
Symlink это отдельный файл, который хранит путь к цели. Если цель удалить, ссылка повиснет. Reflink не зависит от исходного файла: обе копии живут своей жизнью.
Обычная копия это физическое копирование всех байтов. Быстро для маленьких файлов, медленно для больших, и всегда занимает двойное место. Reflink мгновенный и почти не занимает места, пока содержимое не меняется.
Проще всего запомнить так: reflink даёт независимость обычной копии, но со скоростью и экономией hardlink.
Как reflink связан с overlayfs и контейнерами
Overlayfs это механизм объединения каталогов, на котором работают контейнеры. Образ OCI состоит из слоёв: каждый слой это набор файлов, а при запуске контейнера слои накладываются друг на друга через overlayfs. Нижние слои read-only, верхний read-write.
Когда контейнер хочет изменить файл из нижнего слоя, рантайм копирует его в верхний слой. Это называется copy-up. Если файловая система поддерживает reflink, такое копирование мгновенное и не тратит место. На btrfs контейнерные хранилища, например у Podman, используют это напрямую.
Кстати, поэтому контейнеры на btrfs так быстро стартуют: образы не распаковываются целиком, а слои клонируются через reflink при первом запуске. На ext4 тот же Podman вынужден копировать файлы физически, и первый запуск контейнера занимает заметно больше времени.
Тот же принцип работает и вне контейнеров: команда cp --reflink=auto использует reflink, когда это возможно, и откатывается к обычной копии, когда нет.
Какие ограничения у reflink
Главное ограничение: файловая система. Reflink работает только на btrfs и XFS. На ext4, F2FS и большинстве других ФС pacman делает обычные копии, это не ошибка, а отсутствие поддержки.
Второе ограничение: reflink работает в пределах одной файловой системы. Скопировать файл с reflink между разными разделами нельзя: если источник и приёмник на разных ФС, будет обычная копия.
Третье: экономия места не вечная. Стоит изменить файл, и ФС выделит под него новые блоки. Чем больше файлов меняется, тем меньше выгода. Для кэша pacman это не проблема: пакеты в кэше не меняются, а при обновлении старые версии просто удаляются.
Ещё один нюанс: на XFS reflink не всегда сочетается со сжатием. На btrfs сжатие и клонирование работают вместе без проблем, а вот на XFS сжатие включается отдельно и может мешать эффективному клонированию. Если тебе важна экономия места, btrfs здесь удобнее.
И ещё: reflink не защищает от потери данных. Если диск умрёт, общие блоки исчезнут вместе с ним. Для резервных копий reflink не подходит, там нужна реальная копия на другом носителе.
Частые вопросы
Нужно ли включать reflink в pacman.conf?
Нет. Отдельной опции нет, reflink работает автоматически на поддерживающих файловых системах. grep reflink /etc/pacman.conf в стандартном конфиге ничего не покажет, это нормально.
Reflink и снапшоты btrfs это одно и то же?
Нет. Снапшот это снимок всего подтома, а reflink копия одного файла. Но механизм общий: обе технологии используют copy-on-write. Про снапшоты btrfs в Arch Linux читай в статье «Установка Arch на btrfs со снапшотами».
Почему на ext4 pacman не использует reflink?
Потому что ext4 не поддерживает reflink. Это ограничение файловой системы, а не pacman. На ext4 pacman делает обычные копии, медленнее и с двойным расходом места.
Как почистить кэш pacman, если он разросся?
Используй paccache, он удаляет старые версии пакетов, оставляя последние три. Подробная инструкция есть в статье «Чистка кэша пакетов: paccache».
Влияет ли reflink на целостность пакетов?
Нет. Проверка целостности работает по контрольным суммам и не зависит от того, как файл попал на диск. Как проверить установленные пакеты, читай в статье «Проверка целостности пакетов: pacman -Qkk».
Полезные ресурсы
- Pacman, ArchWiki: основная документация по пакетному менеджеру.
- Btrfs, ArchWiki: про файловую систему, где reflink работает лучше всего.
Заключение
Reflink это copy-on-write копирование: мгновенное, экономное и с независимыми копиями. pacman использует его автоматически на btrfs и XFS при распаковке пакетов и работе с кэшем. Проверить поддержку можно через findmnt -o fstype /, а эффект через du и ls. На ext4 reflink нет, и это нормально: pacman просто сделает обычную копию. Если твой корень на btrfs или XFS, ты уже получаешь выгоду, ничего не настраивая.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии