Предыстория тут
Вкратце: достала нынешняя концепция с вечным отвалом то одного, то другого из-за зависимостей, хочется чтобы раз установленное приложение работало как можно дольше, десятилетия, вне зависимости от обновлений.
Касательно NixOS: _формально_ в ней есть то, чего мне хочется, но вместе с этим - куча всего на тему «как нам обустроить Линукс», причём сделано это как-то сумрачно, сопряжено с красноглазием, и мне трудно представить NixOS на среднем десктопе или ноуте, так что нужно что-то попроще.
Суть предложения: переделать FHS и немного пропатчить ядро, чтобы умело хардлинки для каталогов.
На самом верхнем уровне файловой иерархии, конечно, должны быть пользователи. Хотя бы потому, что это тупенько - требовать от юзера права root для установки приложухи. Да и вообще, у нас система для человека, а не наоборот.
Поэтому корневой каталог будет выглядеть как-то так:
/Alyssa
/Bob
/root
На втором уровне много чего можно разместить, но речь про управление пакетами, так что ограничимся очевидным /pkg:
/Alyssa
/pkg
/Bob
/pkg
/root
/pkg
Каждый пакет устанавливается в отдельный каталог:
/Alyssa
/pkg
/firefox:85.0.2
/firefox-developer-edition:127.0.0.1
/smplayer:28.6
/telegram-desktop:4.8.2
/Bob
/root
/pkg
/linux-ubuntu:6.3.9600
/linux-vanilla:6.3.9600
/systemd:666
/ubuntu-core:24.04
/ubuntu-core:25.17
Логика такова:
- Для каждого пакета разработчики/мантейнеры указывают зависимости (deps) пофайлово (чтобы отвязаться от названий пакетов, которые в каждом дистрибутиве свои).
- В репозиториях лежат данные, в каком пакете какие файлы содержатся.
- При установке пакета ПМ скачивает нужные deps-пакеты и устанавливает их в каталог пакета же.
- Но если такой deps-пакет уже где-то установлен - вместо каталога с новым экземпляром deps-пакета создаётся хардлинк на уже установленный экземпляр (можно менять политики поиска дубликатов - только у root или же у любого пользователя, ради пущей экономии места).
- Установка deps-пакета ничем не отличается от установки любого пакета. Т.е. всё вышеописанное выполняется рекурсивно вплоть до самого «нижнего» пакета (наверное, это ядро).
То есть:
/Alyssa
/pkg
/firefox:85.0.2
/deps - тут зависимости фаерфокса
/ffmpeg:5.8.12
/deps
/bzip2:2.4.8 --хардлинк------------
/lame:3.200 |
/deps |
/ncurses:10.20 --хардлинк-----|-----
/usr | |
/usr | |
/gtk:4.2 --хардлинк-------------- | |
/usr - файлы самого фаерфокса | | |
/root | | |
/pkg | | |
/ubuntu-core:24.04 - метапакет | | |
/deps | | |
/bzip2:2.4.8 <------------------|------ |
/gtk:4.2 <----------------------- |
/ncurses:10.20 <----------------------------
Привычное файловое окружение для программ (аля FHS) это некоторый срез файлового дерева, выбирающий пакеты нужных версий. Окружение можно создавать, например, передачей нужных переменных среды. По сути, у пакетов остаётся только одно общее место в деревьях зависимостей - ядро и systemd (уточните, нужно ли добавить сюда libc и прочие подобные штуки, или их тоже можно подхватывать динамически).
Далее:
- Обновления пакета как такового нет. Всегда идёт установка новой версии параллельно прежним.
- При установке новой версии пакета, ПМ может переключить зависящие от него пакеты на эту новую версию, если это явно указано мантейнерами.
- По умолчанию пакет остаётся с текущими версиями deps-пакетов и может так работать сколь угодно долго, пока в ядре что-нибудь не отломают.
- Чтобы перенести пакет на новую систему, достаточно скопировать его каталог - это вытянет рекурсивно все его зависимости, кроме самых общих (ядро и systemd).
- При удалении пакета полностью удаляется его каталог со всеми deps-пакетами. Если они где-то используются - они остаются там. Если больше нигде не используются - удаляются вместе с пакетом. Такая автоматическая сборка мусора без лишних сущностей.
В общем, суть такова. На мой взгляд, это хороший баланс между стабильностью, обновляемостью, экономией места и «ленивостью» сопровождения. Мантейнерам больше не придётся бежать в колесе, постоянно починяя отвалы программ из-за того, что A хочет B, а в репах уже B1 во все поля. Особенно это касается программ не из центральных репозиториев, а из всяких AUR и PPA. Ну а юзеры, в свою очередь, могут очень долго пользоваться необновляемыми программами при свежей системе.
Дискасс!