cleanup и LibreOffice: исправить очистку пакетов из Live при установке и удалить LibreOffice-still
Исправление выбора софта в установщике после перехода с live-installer-pkg на live-installer. Данный MR решает проблему с очисткой LIVE пакетов и удаляет LibreOffice-still, которого уже давно нет в Сизифе (если он вообще был).
Что делает этот MR?
Проблема: Прежняя переменная CLEANUP_AUTO_PACKAGES работала только с LIVE_PACKAGES, но приложения для Live-образа (Telegram, LibreOffice, браузер и т.д.) указываются через LIVE_LISTS. В результате эти пакеты оставались в установленной системе, даже если пользователь снимал галочки в установщике.
Решение:
Были добавлены две переменные: CLEANUP_AUTOMARK_PACKAGES и CLEANUP_AUTOMARK_LISTS. В первом указывается список пакетов (LIVE_PACKAGES), во втором список листов (LIVE_LISTS).
Что происходит в features.in/cleanup?
Этап 1 — сборка образа:
generate.mk читает файлы списков из CLEANUP_AUTOMARK_LISTS (например, etersoft/base/office/libreoffice-latest), извлекает имена пакетов и дописывает их в CLEANUP_AUTOMARK_PACKAGES в distcfg.mk. Таким образом, к моменту создания Live-образа все пакеты из LIVE_PACKAGES и LIVE_LISTS собраны в одной переменной.
Этап 2 — создание Live-образа (image-scripts.d):
89-cleanup-live-preinstall создаёт preinstall хук (pkg-preinstall.d/01-mark-live-packages-auto), который выполняется перед pkg-install. Хук вызывает apt-mark auto для всех пакетов из CLEANUP_AUTOMARK_PACKAGES. Виртуальные пакеты (например, LibreOffice) игнорируются apt-mark — это, к сожалению, баг самого apt-mark. Из-за этого бага мы должны обрабатывать отдельно и виртуальные пакеты:
90-cleanup-live-install-pkgs создаёт postinstall скрипт (postinstall.d/01-remove-pkgs), который:
- Читает выбранные пользователем группы из
/var/lib/installer-alterator-pkg/pkg-list - Резолвит выбранные пакеты в реальные имена (через
rpmquery/rpmquery --whatprovides) - Фильтрует из
CLEANUP_AUTOMARKтолько виртуальные пакеты (реальные пропускаются — они уже обработаны в89-cleanup-live-preinstall) - Резолвит виртуальные в реальные имена и сравнивает с выбранными пользователем — невыбранные помечает как auto
- Вызывает
apt-get autoremove
Используется именно apt-mark auto + autoremove, а не apt-get remove, потому что autoremove безопаснее: он удалит пакет только если от него не зависит ни один manual-пакет. При прямом apt-get remove можно случайно сломать зависимости, если пакет нужен чему-то ещё.
Итого на этапе установки:
-
pkg-preinstall.d/01-mark-live-packages-auto— помечает реальные LIVE-пакеты как auto - Установщик (
installer-alterator-pkg) — помечает.baseи выбранные пользователем пакеты как manual -
postinstall.d/00-remove-installer-pkgs.sh— удаляет installer-пакеты, вызываетautoremove(удаляются невыбранные реальные auto-пакеты) -
postinstall.d/01-remove-pkgs— обрабатывает виртуальные пакеты, удаляет CLEANUP_PACKAGES, финальныйautoremove
Именование: Переменная названа CLEANUP_AUTOMARK_* (вместо прежней CLEANUP_AUTO_*), потому что механизм использует apt-mark auto для пометки пакетов. Название отражает суть: пакеты помечаются (mark) как автоматически установленные (auto).
Код слишком сложный!!
Этот код мог быть очень простым, если бы не наличие виртуальных пакетов. Вся трудность в том, что apt-mark не умеет работать с виртуальными пакетами — apt-mark auto LibreOffice-still говорит "can not be marked as it is not installed", хотя apt-get install LibreOffice-still работает нормально. Установщик при вызове apt-mark manual тоже передаёт виртуальные имена — и они также игнорируются.
Была и другая проблема с виртуальными пакетами. На Live стоял libreoffice (виртуальный LibreOffice). Пользователь выбирал LibreOffice-still (тоже виртуальный libreoffice). Оба резолвятся в один реальный пакет libreoffice. Но скрипт сравнивал виртуальные имена: LibreOffice-still ≠ LibreOffice → помечал libreoffice как auto → удалялся. Пришлось резолвить оба множества (automark и selected) в реальные имена перед сравнением.
В LIVE_LISTS попадают и системно важные пакеты (grub, su и прочие). Если бы мы их обрабатывали в postinstall, то они бы удалялись у нас. А так они помечаются альтератором в момент установки, поэтому apt-mark auto мы делаем в preinstall, то есть перед установкой.
Другая проблема была в том, что в postinstall срабатывает 00-remove-installer-pkgs.sh, вызывая autoremove раньше нашего 01-remove-pkgs. Это одна из причин, почему я не резолвил виртуальные пакеты в 89-cleanup-live-preinstall.
В будущем от большого пласта кода в 90-cleanup-live-install-pkgs можно будет избавиться, если:
- В
apt-markпоявится поддержка виртуальных пакетов (я завёл соответствующий баг-репорт: BZ#57789) - Мы добавим какую-то проверку на наличие виртуальных пакетов в pkg.in/lists.
Это точно надёжно?
Я много тестировал, проверял и да, это должно быть надёжно. Все пакеты, которые должны быть в целевой системе, помечаются самим альтератором как manual:
-
installer-alterator-pkg/alterator-pkg/backend3/pkg-install:154:xargs apt-mark manual < "$base_tmpfile"— помечает.baseкак manual -
installer-alterator-pkg/alterator-pkg/backend3/pkg-install:165:xargs apt-mark manual < "$rest_tmpfile"— помечает выбранные пользователем группы
Если что, .base формируется в features.in/metadata/lib/50-metadata.mk из:
- Пакеты:
SYSTEM_PACKAGES,COMMON_PACKAGES,THE_PACKAGES,BASE_PACKAGES - Содержимое списков:
COMMON_LISTS,THE_LISTS,BASE_LISTS
Таким образом, альтератор помечает как manual всё, что должно остаться в системе. Наш preinstall хук (apt-mark auto) срабатывает до альтератора, а альтератор перезаписывает auto на manual для нужных пакетов.
Какие идеи были до этого?
Было предложено несколько решений проблемы:
- lav/mkimage-profiles@fae95ee8b4bf16af3810181022fcb59735ab26f7 — данное решение отлично работало с пакетами, но не учитывало LIVE_LISTS, вследствие чего все приложения из Live оставались.
-
lav/mkimage-profiles@bf07e5127c34e768ad2245d4ff15ce5e7cbada2c — это решение не сработало, так как файл
.baseформируется внутри pkg-install (installer-alterator-pkg). А preinstall хук выполняется до pkg-install. Но сам по себе код выглядит довольно трудным для понимания.
Удаление LibreOffice-still
Этот пакет есть только в P11, в Сизифе его нет, и он является виртуальным с провайдом на libreoffice. Поэтому я:
- Удалил из
LIVE_LISTS,pkg.in/lists/иpkg.in/groups - В установщике изменил название на «Офисный пакет LibreOffice», сделал его активным по умолчанию и удалил конфликт
- В листе
libreoffice-latestвиртуальные пакеты заменил на реальные-
LibreOffice→libreoffice -
LibreOffice-langpack-ru→libreoffice-langpack-ru -
LibreOffice-gtk3→libreoffice-gtk3 - Удалён
LibreOffice-common(провайдится в libreoffice)
-
Тестирование
- Отсутствие программ и пакетов, специфичных для Live, при установке системы со всеми снятыми галочками в сборке (GNOME)
- Отсутствие программ и пакетов, специфичных для Live, при установке системы со всеми снятыми галочками в сборке (Hyprland)
- Корректная установка программ, в том числе тех, которые присутствуют или отсутствуют в Live в сборке с GNOME
- Корректная установка программ, в том числе тех, которые присутствуют или отсутствуют в Live в сборке с Hyprland
- Проверка, не помечены ли как auto системно-важные пакеты в сборке с GNOME
- Проверка, не помечены ли как auto системно-важные пакеты в сборке с Hyprland