Bug 56881 - grub-btrfs + snapper система не грузится в подтом по умолчанию после snapper rollback
Summary: grub-btrfs + snapper система не грузится в подтом по умолчанию после snapper ...
Status: ASSIGNED
Alias: None
Product: Sisyphus
Classification: Development
Component: grub (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Egor Ignatov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-11-17 14:43 MSK by Александр
Modified: 2025-11-25 12:10 MSK (History)
8 users (show)

See Also:


Attachments
статус grub-btrfsd (106.22 KB, image/jpeg)
2025-11-23 12:46 MSK, Александр
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Александр 2025-11-17 14:43:14 MSK
- Версии пакетов -
grub-btrfs-4.12
snapper-0.12.1

Тестирование проходит на ALT Server 11.1 (Mendelevium)


grub-btrfs не обновляет список снапшотов при создание или удаление их. В результате данная проблема, не позволяет воспользоваться функцией отката системы.
Происходит следующее:
1. создаем снапшот работающей системы, после перезагрузки, в списке он не обнаруживается.
2. загрузившись еще в работающей системе делаем update-grub, после перезагрузки снапшот виден в grub
3. удаляем fstab, система соответственно не загружается.
4. Загружаемся с снапшота сделанного в п1.
5. выполняем команду snapper rollback, в результате, которого создаются два снапшота, у одного из которых статус rw и с него мы должны, после перезагрузки загрузится уже в работающую систему, но тк список снапшотов в grub не обновляется, то их не обнаруживается и система продолжает грузится из состояния, когда был удален fstab в п3.

Вариант создания снапшота изначально в статусе rw не устраивает, тк нарушается безопасность.
Выполнение update-grub, при загрузке из снапшота невозможно, тк снапшот имеет статус ro.
Comment 1 Dmitry Maksimenkov 2025-11-20 09:54:24 MSK
По указанным шагам ошибка не воспроизвелась.

После установки пакета grub-btrfs нужно вызвать update-grub, чтобы добавить поддержку снимков в загрузчик. Убедитесь, что у Вас включен grub-btrfsd.service который отслеживает появление снимков и автоматически добавляет их.

В загруженном R/O снимке и не надо делать update-grub. Задача таких снимков заключается в том, что если у Вас перестала загружаться система - сделать snapper rollback который из выбранного снимка создает новый R/W и задает его по умолчанию.

## Версии:

- snapper-0.12.1-alt1
- grub-btrfs-4.13-alt3

## Системы:

- ALT Server 11.1

## Шаги воспроизведения:

1. Установить пакеты:
    # apt-get install -y snapper grub-btrfs
2. Обновить конфигурацию grub для добавления подменю снимков:
    # update-grub
3. Создать конфигурацию snapper для /:
    # snapper -c root create-config /
4. Добавить монтирование подтома @/.snapshots в /etc/fstab:
    # UUID=$(blkid | grep btrfs | cut -d '=' -f2 | cut -d ' ' -f1 | tr -d '"')
    # echo "UUID=$UUID /.snapshots btrfs nosuid,relatime,subvol=@/.snapshots 0 2" >> /etc/fstab
5. Включить сервис grub-btrfsd для автообновления списка снимков:
    # systemctl enable --now grub-btrfsd.service
6. Создать снимок snapper:
    # snapper create -d "snapshot test 1"
    После создания снимка подождать минуту, пока в фоне отработает автообновление списка снимков
7. Перезагрузиться в созданный снимок, в GNU GRUB выбрать:
    ALT snapshots → @/.snapshots/1/snapshot
8. Выполнить откат системы с помощью rollback:
   # snapper --ambit classic rollback 1

Результат:
Снимки автоматически добавляются в загрузчик при создании;
Rollback корректно работает создает новый снимок R/W и делает его основным при загрузке

Дополнительно:
- Также проверил на ALT Server 11.1 обновленном до Sisyphus результат аналогичный как и для p11.
Версии пакетов:
grub-btrfs-4.14-alt1
snapper-0.13.0-alt1
Comment 2 Александр 2025-11-23 00:05:49 MSK
Как пример, была создана ситуация, создаются два snapshot(pre/post) через команду:
snapper create --command "update-kernel" -d "kljj" (смотрим снапшоты создались),  перезагружаем сервер, в alt snapshot в меню выбора загрузки присутствует pre/post, загружаемся делаем echo 0 > /etc/hosts, перезагружаем сервер,
загружаемся со снапшота, делаем rollback перезагружаемся, в меню выбора снапшотов, снапошоты rollback отсутствуют, так же он не прописывает в загрузку по умолчанию.  (Ответ для Dmitry Maksimenkov на комментарий #1)
> По указанным шагам ошибка не воспроизвелась.
> 
> После установки пакета grub-btrfs нужно вызвать update-grub, чтобы добавить
> поддержку снимков в загрузчик. Убедитесь, что у Вас включен
> grub-btrfsd.service который отслеживает появление снимков и автоматически
> добавляет их.
> 
> В загруженном R/O снимке и не надо делать update-grub. Задача таких снимков
> заключается в том, что если у Вас перестала загружаться система - сделать
> snapper rollback который из выбранного снимка создает новый R/W и задает его
> по умолчанию.
> 
> ## Версии:
> 
> - snapper-0.12.1-alt1
> - grub-btrfs-4.13-alt3
> 
> ## Системы:
> 
> - ALT Server 11.1
> 
> ## Шаги воспроизведения:
> 
> 1. Установить пакеты:
>     # apt-get install -y snapper grub-btrfs
> 2. Обновить конфигурацию grub для добавления подменю снимков:
>     # update-grub
> 3. Создать конфигурацию snapper для /:
>     # snapper -c root create-config /
> 4. Добавить монтирование подтома @/.snapshots в /etc/fstab:
>     # UUID=$(blkid | grep btrfs | cut -d '=' -f2 | cut -d ' ' -f1 | tr -d
> '"')
>     # echo "UUID=$UUID /.snapshots btrfs nosuid,relatime,subvol=@/.snapshots
> 0 2" >> /etc/fstab
> 5. Включить сервис grub-btrfsd для автообновления списка снимков:
>     # systemctl enable --now grub-btrfsd.service
> 6. Создать снимок snapper:
>     # snapper create -d "snapshot test 1"
>     После создания снимка подождать минуту, пока в фоне отработает
> автообновление списка снимков
> 7. Перезагрузиться в созданный снимок, в GNU GRUB выбрать:
>     ALT snapshots → @/.snapshots/1/snapshot
> 8. Выполнить откат системы с помощью rollback:
>    # snapper --ambit classic rollback 1
> 
> Результат:
> Снимки автоматически добавляются в загрузчик при создании;
> Rollback корректно работает создает новый снимок R/W и делает его основным
> при загрузке
> 
> Дополнительно:
> - Также проверил на ALT Server 11.1 обновленном до Sisyphus результат
> аналогичный как и для p11.
> Версии пакетов:
> grub-btrfs-4.14-alt1
> snapper-0.13.0-alt1






Как пример, была создана ситуация, создаются два snapshot(pre/post) через команду:
snapper create --command "update-kernel" -d "kljj" (смотрим снапшоты создались),  перезагружаем сервер, в alt snapshot в меню выбора загрузки присутствует pre/post, загружаемся делаем echo 0 > /etc/hosts, перезагружаем сервер,
загружаемся со снапшота, делаем rollback перезагружаемся, в меню выбора снапшотов, снапошоты rollback отсутствуют, так же он не прописывает в загрузку по умолчанию.
Comment 3 Александр 2025-11-23 12:46:29 MSK
Created attachment 20150 [details]
статус grub-btrfsd

когда создаешь снап в нормальном режиме, то статус grub-btrfsd показывает, что у него происходит см(вл)
когда делаешь смотришь статус grub-btrfsd загрузившись со снапшота в ro и делаешь rollback или даже просто создаешь snapshot то этого вида я так и не дождался
Comment 4 Dmitry Maksimenkov 2025-11-25 11:15:01 MSK
Проверялось в Sisyphus, ошибка воспроизводится

Версии:

- grub-btrfs-4.14-alt1
- snapper-0.13.0-alt1

Система:

- ALT Server 11.1 (обновлено до Sisyphus)

Шаги воспроизведения:

1. Установить пакеты:
    # apt-get install -y snapper grub-btrfs
2. Обновить конфигурацию grub для добавления подменю снимков:
    # update-grub
3. Создать конфигурацию snapper для /:
    # snapper -c root create-config /
4. Добавить монтирование подтома @/.snapshots в /etc/fstab:
    # UUID=$(blkid | grep btrfs | cut -d '=' -f2 | cut -d ' ' -f1 | tr -d '"')
    # echo "UUID=$UUID /.snapshots btrfs nosuid,relatime,subvol=@/.snapshots 0 2" >> /etc/fstab
5. Включить сервис grub-btrfsd для автообновления списка снимков:
    # systemctl enable --now grub-btrfsd.service
6. Создать снимок snapper
    # snapper create --command "update-kernel" -d "kljj"
7. Повредить файл /etc/hosts
    # echo 0 > /etc/hosts
7. Перезагрузиться в созданный снимок, в GNU GRUB выбрать:
    ALT snapshots → @/.snapshots/1/snapshot
8. Выполнить откат системы с помощью rollback:
   # snapper --ambit classic rollback 1
9. Загрузиться в систему и выполнить
    # cat /etc/hosts
    # btrfs subvolume get-default /
    # cat /proc/cmdline

Реальный результат:

1. Файл /etc/hosts остался поврежденным
2. Система загружена с subvol=@ при том, что подтом по умолчанию задан @/.snapshots/4/snapshot

Ожидаемый результат: Загрузка системы с подтома @/.snapshots/4/snapshot, содержимое /etc/hosts до повреждения

Дополнительно:
* Воспроизводится в p11 на версиях grub-btrfs-4.13-alt3, snapper-0.12.1-alt1
* Если убрать rootflags=subvol=@ из параметров ядра при загрузке в GNU GRUB, система грузится с заданного подтома по умолчанию и ошибка не воспроизводится
Comment 5 Alexander Makeenkov 2025-11-25 11:28:53 MSK
(Ответ для Dmitry Maksimenkov на комментарий #4)
> * Если убрать rootflags=subvol=@ из параметров ядра при загрузке в GNU GRUB,
> система грузится с заданного подтома по умолчанию и ошибка не воспроизводится

# grep rootflags /etc/grub.d/10_linux 
            GRUB_CMDLINE_LINUX_DEFAULT="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX_DEFAULT}"
            GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"


Мне кажется, что правильнее будет перевесить на grub.
Comment 6 Dmitry Maksimenkov 2025-11-25 11:54:43 MSK
Посмотреть работу snapper в GNU GRUB можно у самих разработчиков snapper - OpenSUSE. У них в системе snapper тесно интегрирован в загрузчик, и если не ошибаюсь без использования grub-btrfs
Comment 7 Egor Ignatov 2025-11-25 12:10:14 MSK
(In reply to Dmitry Maksimenkov from comment #6)
> Посмотреть работу snapper в GNU GRUB можно у самих разработчиков snapper -
> OpenSUSE. У них в системе snapper тесно интегрирован в загрузчик, и если не
> ошибаюсь без использования grub-btrfs

Для полноценной поддержки snapper требуется набор патчей[1], который разработчки grub считают плохим[2].

System rollback в snapper реализован через усановку default subvolume, поэтому grub-btrfs и не нужен для его работы.

Как простое решение могу предложить добавить в /etc/sysconfig/grub2 переменную, например, GRUB_BTRFS_BOOT_FROM_DEFAULT_SUBVOL, при установки которой в значение true, /etc/grub.d/10_linux не будет добавлять "rootflags=subvol=${rootsubvol}" в cmdline.

Например вот так:

```diff
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index dd78b3309..42db69066 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -68,7 +68,9 @@ case x"$GRUB_FS" in
     xbtrfs)
        rootsubvol="`make_system_path_relative_to_its_root /`"
        rootsubvol="${rootsubvol#/}"
-       if [ "x${rootsubvol}" != x ]; then
+       if [ "x${rootsubvol}" != x ] \
+              && [ "x${GRUB_BTRFS_BOOT_FROM_DEFAULT_SUBVOL}" != "xtrue" ] \
+              && [ "x${GRUB_BTRFS_BOOT_FROM_DEFAULT_SUBVOL}" != "xyes" ]; then
            GRUB_CMDLINE_LINUX_DEFAULT="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX_DEFAULT}"
            GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
        fi;;
```



[1] https://lists.gnu.org/archive/html/grub-devel/2024-10/msg00351.html
[2] https://lists.gnu.org/archive/html/grub-devel/2024-11/msg00054.html