Перейти к содержимому

Снимки Btrfs

Давайте начнём с основ:

Снимки Btrfs являются частью функционала подтомов. Вы можете спросить, что такое подтом? Представьте подтом как отдельную файловую систему внутри файловой системы Btrfs. Это позволяет вам разделять данные на разные части. Именно поэтому, например, в CachyOS у нас есть разные подтома для:

  • Корневой файловой системы: (/)
  • Домашнего каталога суперпользователя: (/root)
  • Домашнего каталога пользователя: (/home)
  • Каталогов Var: (/var/cache, /var/tmp, /var/log)
  • Каталога Srv: (/srv)

Имея разные подтома для этих каталогов, мы можем управлять ими независимо, применять разные настройки и, что самое важное, создавать для них снимки.

Именно здесь и рождается снимок. Снимок — это, по сути, копия подтома (по умолчанию для чтения и записи или только для чтения) в определённый момент времени. Это означает, что вы можете зафиксировать состояние вашей файловой системы, включая все файлы и каталоги, на данный момент.

Таким образом, снимки становятся точкой отсчёта во времени. Это значит, что когда целевой файл изменяется по сравнению с данными в снимке, снимок сохраняет исходный файл, а целевой объект создаёт новый файл с изменениями, при этом снимок остаётся неизменным навсегда. Поэтому некоторые пользователи называют снимок «данными, застывшими во времени».

Представьте, что вы делаете фотографию вашей файловой системы в определённый момент, и вы всегда можете вернуться к этой фотографии, когда вам это понадобится.

Одним из ключевых преимуществ снимков является их высокая эффективность в плане использования дискового пространства, поскольку это всего лишь ссылка на исходные данные до тех пор, пока не будут внесены изменения.

Но именно здесь снимок отличается от традиционной резервной копии. Допустим, ваш диск вышел из строя. Если бы у вас была традиционная резервная копия, вы могли бы восстановить свои данные из неё. Однако, если у вас были только снимки на вышедшем из строя диске, вы потеряли бы к ним доступ, так как они хранятся на том же диске.

Случаи, когда снимки полезны и бесполезны для восстановления

Заголовок раздела «Случаи, когда снимки полезны и бесполезны для восстановления»

Они полезны для восстановления после:

  • Сбоев или повреждений после обновлений системы.
  • Неправильных конфигураций, которые мешают системе загрузиться.
  • Случайного удаления или изменения файлов.

Они бесполезны для восстановления после:

  • Проблем с загрузчиком.
  • Аппаратных сбоев (например, выхода из строя жёстких дисков).

Несколько моментов, которые следует учесть перед управлением снимками. Применимо как к CLI, так и к GUI методам.

  • Рекомендуется хранить не более 10 снимков. После этого снимки становятся слишком старыми и менее полезными. В худшем случае, восстановление из старого снимка может привести к проблемам совместимости с новыми версиями программного обеспечения.
  • В идеале снимки предназначены для восстановления. Хотя вы можете использовать их для отмены изменений в файлах без восстановления всего снимка.
  • Добавляйте осмысленное описание при создании снимков. Это поможет вам позже определить назначение каждого снимка.

Прежде чем продолжить, убедитесь, что у вас установлен btrfsmaintenance, чтобы воспользоваться функциями автоматического управления снимками.

Для тех, кто предпочитает управлять Btrfs, снимками и многим другим через графический интерфейс, Btrfs Assistant — это замечательный проект для новичков.

Настройка автоматической очистки снимков

Заголовок раздела «Настройка автоматической очистки снимков»

Мы настроим автоматическую очистку снимков с помощью Btrfs Assistant. Это поможет эффективно управлять вашими снимками без ручного вмешательства.

Выполните следующие шаги:

  1. Запустите Btrfs Assistant, открыв терминал и выполнив:

    Terminal window
    btrfs-assistant-launcher

    Как вариант:

    Terminal window
    sudo -E btrfs-assistant
  2. Перейдите на вкладку Snapper Settings (Настройки Snapper):

    Измените настройки Snapshot Retention (Хранение снимков) следующим образом:

    • Убедитесь, что выбрана конфигурация root
    • Введите значение 0 для Hourly (Ежечасно), Daily (Ежедневно), Weekly (Еженедельно), Monthly (Ежемесячно) и Yearly (Ежегодно).
    • Снимите флажок Enable timeline snapshots (Включить снимки по расписанию).
    • Введите значение 10 в поле Number (Количество).
    • Поставьте ✅ напротив Snapper cleanup enabled (Очистка Snapper включена).
    • Нажмите кнопку Save (Сохранить) в правом верхнем углу и Apply systemd changes (Применить изменения systemd) в правом нижнем. Теперь snapper-cleanup.timer будет включен для автоматической очистки старых снимков в соответствии с вашей конфигурацией.
  1. Откройте Btrfs Assistant:

    Terminal window
    btrfs-assistant-launcher

    Как вариант:

    Terminal window
    sudo -E btrfs-assistant
  2. Перейдите на вкладку Snapper:

  3. Выберите снимок(ки), который(е) вы хотите удалить из списка.

  4. Нажмите кнопку Delete (Удалить), расположенную в верхней части окна.

  5. Перегенерируйте записи вашего загрузчика, чтобы отразить изменения:

    systemd-boot
    Terminal window
    sudo sdboot-manage gen
    GRUB
    Terminal window
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    Limine
    Terminal window
    sudo limine-mkinitcpio

Ознакомьтесь с их Официальной Wiki для более подробного изучения того, что можно сделать.

Теперь, когда мы рассмотрели, что такое снимок Btrfs и его варианты использования, давайте поговорим о том, как управлять ими с помощью инструмента под названием Snapper, созданного Arvin Schnell из openSUSE.

CachyOS по умолчанию использует следующую конфигурацию Snapper:
# subvolume to snapshot
SUBVOLUME="/"
# filesystem type
FSTYPE="btrfs"
# btrfs qgroup for space aware cleanup algorithms
QGROUP=""
# fraction or absolute size of the filesystems space the snapshots may use
SPACE_LIMIT="0.5"
# fraction or absolute size of the filesystems space that should be free
FREE_LIMIT="0.2"
# users and groups allowed to work with config
ALLOW_USERS=""
ALLOW_GROUPS=""
# sync users and groups from ALLOW_USERS and ALLOW_GROUPS to .snapshots
# directory
SYNC_ACL="no"
# start comparing pre- and post-snapshot in background after creating
# post-snapshot
BACKGROUND_COMPARISON="yes"
# run daily number cleanup
NUMBER_CLEANUP="yes"
# limit for number cleanup
NUMBER_MIN_AGE="1800"
NUMBER_LIMIT="50"
NUMBER_LIMIT_IMPORTANT="15"
# create hourly snapshots
TIMELINE_CREATE="no"
# cleanup hourly snapshots after some time
TIMELINE_CLEANUP="yes"
# limits for timeline cleanup
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="5"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="0"
TIMELINE_LIMIT_YEARLY="0"
# cleanup empty pre-post-pairs
EMPTY_PRE_POST_CLEANUP="yes"
# limits for empty pre-post-pair cleanup
EMPTY_PRE_POST_MIN_AGE="1800"

Вот список наиболее распространенных команд Snapper.

Получить текущую конфигурацию:
Terminal window
sudo snapper get-config
Пример вывода:
Terminal window
snapper list-configs
Config Subvolume
───────┼──────────
root /
Список доступных снимков + детали:
Terminal window
sudo snapper list
Пример вывода:
Terminal window
# │ Type │ Pre # │ Date │ User │ Cleanup │ Description │ Userdata
────┼────────┼───────┼──────────────────────────┼──────┼─────────┼──────────────────────────────────────────────────────────────────────────┼─────────
0 single root current
715 pre Thu 22 Jan 2026 16:14:07 root number pacman -S -y -u --config /etc/pacman.conf --
716 post 715 Thu 22 Jan 2026 16:14:25 root number docker-buildx lilv sof-firmware zed
717 pre Sat 24 Jan 2026 11:19:48 root number pacman -S -y -u --config /etc/pacman.conf --
718 post 717 Sat 24 Jan 2026 11:20:19 root number bpf cachyos-hello cachyos-wallpapers cpupower jdk-openjdk ldb less libev
719 pre Sat 24 Jan 2026 11:20:31 root number pacman -U --config /etc/pacman.conf -- /home/mario/.cache/yay/visual-s
720 post 719 Sat 24 Jan 2026 11:20:36 root number visual-studio-code-bin
721 pre Sat 24 Jan 2026 20:46:40 root number pacman -Syu plasma-login-manager
722 post 721 Sat 24 Jan 2026 20:46:48 root number cmake fastfetch harfbuzz harfbuzz-icu jdk21-openjdk lib32-harfbuzz lib32
723 pre Sat 24 Jan 2026 20:46:53 root number pacman -R sddm-kcm cachyos-themes-sddm sddm
724 post 723 Sat 24 Jan 2026 20:46:56 root number cachyos-themes-sddm sddm sddm-kcm
725 pre Sun 25 Jan 2026 08:05:05 root number pacman -S -y -u --config /etc/pacman.conf --
726 post 725 Sun 25 Jan 2026 08:05:11 root number plasma-login-manager
727 pre Sun 25 Jan 2026 15:55:28 root number pacman -S --config /etc/pacman.conf -- cachyos-extra-znver4/caligula
728 post 727 Sun 25 Jan 2026 15:55:30 root number caligula
  • Вот краткое описание столбцов:
    • #: Указывает номер снимка, который используется в других командах.
    • Type: Указывает, является ли снимок одиночным или частью пары pre/post.
      • single: Эти снимки не имеют особого отношения к другим снимкам.
      • pre: Эти снимки предназначены для создания до какого-либо системного изменения (например, редактирования файла или установки пакета).
      • post: Как следует из названия, эти снимки относятся к снимкам, сделанным после системного изменения. Они связаны с соответствующим pre снимком.
    • Pre #: Для post снимков этот столбец указывает номер соответствующего pre снимка.
    • Date: Дата и время создания снимка.
    • User: Пользователь, создавший снимок.
    • Cleanup: Указывает алгоритм очистки, примененный к снимку.
      • В Snapper доступно несколько алгоритмов очистки, таких как number, timeline и empty-pre-post. В этом примере используется алгоритм number, что означает, что старые снимки будут удаляться на основе предопределенного лимита.
      • timeline: Снимки очищаются в зависимости от их возраста и частоты.
      • empty-pre-post: Удаляет пары снимков pre/post с пустыми различиями.
    • Description: Краткое описание снимка, часто указывающее на причину его создания.
    • Userdata: Дополнительные пользовательские данные, связанные со снимком. Для более подробной информации о столбцах вывода
Создать новый снимок:
Terminal window
sudo snapper create --type single --description "Мое описание снимка"
Изменить снимок:
Terminal window
sudo snapper modify <опция> <номер_снимка>
Доступные опции:
Terminal window
Options for 'modify' command:
--description, -d <description> Description for snapshot.
--cleanup-algorithm, -c <algo> Cleanup algorithm for snapshot.
--userdata, -u <userdata> Userdata for snapshot.
--read-only Set snapshot read-only.
--read-write Set snapshot read-write.
--default Set snapshot as default snapshot.
Пример: Изменение описания снимка 729:
Terminal window
sudo snapper modify 729 --description 'Мое новое описание снимка'
Удаление снимков:
Удалить один снимок:
Terminal window
sudo snapper delete <номер_снимка>
Удалить диапазон снимков:
Terminal window
sudo snapper delete 718-721

Снимки 718, 719, 720 и 721 будут удалены.

Официальная man-страница команд Snapper:

Руководство по конфигурационному файлу Snapper:

Руководство Arch Wiki:

Настройка отображения снимков в загрузчике Limine

Заголовок раздела «Настройка отображения снимков в загрузчике Limine»
  • Ограничьте количество снимков, отображаемых в меню загрузчика Limine, чтобы избежать беспорядка:
  1. Создайте резервную копию файла конфигурации limine-snapper-sync:
    Terminal window
    sudo cp /etc/limine-snapper-sync.conf /etc/limine-snapper-sync.conf.orig
  2. Отредактируйте файл конфигурации limine-snapper-sync:
    Terminal window
    sudo nano /etc/limine-snapper-sync.conf
    Ожидаемый фрагмент вывода:
    Terminal window
    ### Max Snapshot Entries
    ### Sets the limit for how many snapshot entries show up in the boot menu.
    ### This depends on the size of your FAT32 boot partition and how many different kernel and module versions you want to keep.
    ### A larger FAT32 boot partition allows more snapshot entries.
    MAX_SNAPSHOT_ENTRIES=10
    При желании можно настроить формат имени снимка:
    Terminal window
    ### Snapshot Name Format
    ### Choose a format for how snapshot entries look in the Limine bootloader:
    ### 0. ID=111 2023-12-20 10:59:59 (default)
    ### 1. 111│2023-12-20 10:59:59
    ### 2. 111 │ 2023-12-20 10:59:59
    ### 3. 2023-12-20 10:59:59│111
    ### 4. 2023-12-20 10:59:59 │ 111
    ### 5. 2023-12-20 10:59:59
    ### 6. 111
    ### 7. 111│snapshot description
    ### 8. 2023-12-20 10:59:59│snapshot description
    ### 9. │snapshot description
    SNAPSHOT_FORMAT_CHOICE=8
    8 — хороший выбор, так как он показывает дату и время вместе с описанием снимка.
  3. Сохраните файл и выйдите, нажав CTRL+O, Enter, CTRL+X.
Limine
  1. В меню загрузчика Limine перейдите в меню Snapshots (Снимки):
  2. Выберите снимок и ядро, из которых вы хотите восстановиться:
    /_astro/limine-snapshotMenu-2.CH75QBQf.jpg/_astro/limine-snapshotMenu-3.CIT-qChw.jpg
  3. Ваша система теперь находится в режиме read-only mode (только для чтения). Должно появиться всплывающее уведомление, указывающее на обнаружение снимка и предлагающее восстановиться из него:
  4. Нажмите Restore now (Восстановить сейчас). Откроется окно терминала с запросом и попросит несколько подтверждений:
    Пример запроса на восстановление
    Snapshot ID : 2
    Date : 2026-01-26 11:19:14
    Description : nc-git
    Restore method : replace
    Confirm restore of snapshot 2 using the "replace" method?
    Type [y]es to restore, [l]ist to display all snapshots, or [c]ancel to abort.
    Your input: yes
    Enter a description for the "backup" of the subvolume: @
    Your input: @
  5. Введите yes и, при желании, добавьте описание для резервного снимка.
  6. Начнется процесс восстановления. По завершении снова введите yes в новом запросе, чтобы перезагрузить систему:
    Terminal window
    The restore is complete. Please reboot now:
    Type [y]es to reboot, [n]o or [c]ancel to abort rebooting.
    Your input: yes
GRUB
  1. В меню загрузчика GRUB загрузитесь в желаемый снимок и ядро, из которых вы хотите восстановиться.

  2. После загрузки откройте Btrfs Assistant:

    Terminal window
    btrfs-assistant-launcher

    Как вариант:

    Terminal window
    sudo -E btrfs-assistant
  3. Перейдите на вкладку Snapper → вкладку “Browse/Restore” (Обзор/Восстановление) и выберите снимок, из которого вы загрузились:

  4. Нажмите кнопку Restore (Восстановить) и перезагрузите систему, чтобы применить изменения.