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