Pull to refresh

Comments 119

Непрерывная интеграция или почему Guix может работать без мейнтейнеров пакетов: благодаря воспроизводимым сборкам и поддержке частичных обновлений, если пакет работает в Guix, то он будет работать «всегда» и не сломается при следующем обновлении какой-то зависимости (точнее, если зависимость ломает пакет, то это тривиально исправляется, чтобы использовать правильную версию библиотеки). Таким образом, работу с пакетами можно перенести на «фермы сборки» (одна на Hydra из проекта Nix, другая на Cuirass). Сравните это с большинством других сообществ GNU/Linux, которым для обновления тысяч пакетов требуются десятки мейнтейнеров. Такой подход не масштабируется: в итоге эти дистрибутивы стагнируют на паре тысяч пакетов. В Guix количество пакетов может спокойно расти, не опасаясь краха. В то же время контрибуторов можно использовать более эффективно.

А как это работает? Ну вот вы берете пакет X, который зависит от пакета A версии 1.0, берете пакет Y, который зависит от пакета A версии 2.0, которая не совместима с версией 1.0.


У вас есть три варианта:


  1. Обновить код пакета Y для версии 2.0, для этого нужны мейнтейнеры.
  2. Даунгрейднуть пакет X до версии, которая работала с 1.0, для этого так же нужны мейнтейнеры, что бы перенести фиксы.
  3. Статическая линковка, которая в рамках десктопных систем недопустима, потому что системе будет весит чертовы террабайты.

Чем Guix лучше? Тем, что может в простых случаях собрать валидный сабсет пакетов? Ну, такое можно в большом количестве систем.

Есть ещё вариант. Динамическая линковка X и Y к нужным версиям. т.е. будет в системы два пакета A версии 1.0 и 2.0, до тех пор пока разрабы X-а не обновят зависимости до 2.0 и можно будет старую версию автоматом почистить.

На самом деле это только часть проблемы. Если речь про обновление пакета, особенно до очередной мажорной версии, то кроме обновления зависимостей может потребоваться обновление самой процедуры сборки, и также, вероятно, окружения и конфигурации, а для этого опять-таки нужны мейнтейнеры… Ну или мириться с тем что пакет древний, в лучшем случае с обновлениями безопасности.
Кстати еще интереснее что например делать если:
— если пакет A в версии 1.0 — зависит от пакета K версии 4.3.1 и только так. в K версии 4.4.0 — убрана какая то нужная вещь. При этом две версии K одновременно — запущены быть не могут никак. Потому что это ядро.
— если пакет A в версии 1.0 — имеет удаленно-эксплуатируемую дыру и при этом обновление A — все же сломает частично пакет Y (и без этого — либо никак либо очень долго и сложно). Кто должен принять решение что да — мы частично ломаем функционал пакета Y но спасаем пользователей. Сам пользователь? Сисадмин?
— если пакет А в версии 1.0 имеет какой то функционал который разработчикам пришлось вырезать в версии 2.0 потому что выяснилось что патенты. Как быть тем кто поддерживает репозитории — выносить A в non-free-репозиторий не смотря на то что поправлено? Рисковать что на них наедут с теми же патентами?
— если у нас стоит задача запустить вот это вот — на системе где то что должно быть пакетом K — вот конкретно этой фиксированной версии (для которой даже пакета то не сделали) и изменить это — нельзя. Например...K это ядро а задача стоит — запустить систему под Linux-on-DeX ну или — внутри контейнера той же Virtuozzo (про докер даже не говорю пока).

В Guix в описанном случае в описании пакета X может быть указано явное использование A версии 1.0, и пакет продолжит собираться и работать так же, как и раньше (в том числе со всеми ошибками и проблемами безопасности, присутствовавшими в A 1.0). Теоретически такое возможно и в обычном rpm-based или deb-based дистрибутиве, если мантейнер пакета A вместо простого обновления пакета A с версии 1.0 до 2.0 создаст отдельные пакеты A1 и A2 (и к ним, скорее всего, A1-devel и A2-devel), однако в Guix подобное «размножение» пакетов происходит само собой — при любом изменении в исходных текстах, скриптах сборки или других используемых при сборке пакетах меняется и хеш собираемого пакета, в результате новая сборка помещается в отдельный каталог в /gnu/store, где может существовать одновременно с любым количеством предыдущих сборок того же пакета. В бинарных файлах пакетов X и Y при их сборке прописываются конкретные пути в /gnu/store, указывающие на точную версию их зависимостей, в результате они могут использовать разные версии пакета A, даже если разделяемые библиотеки в этих версиях по каким-то причинам имеют одинаковые soname (в обычных дистрибутивах такое возможно только при различных soname).

Ничего апгрейдить/даунгрейдить не нужно, нужные версии пакетов можно просто указать в зависимостях. Т.е. если пакет был однажды написан — он будет работать, пока исходники не удалят.

Статическая линковка, которая в рамках десктопных систем недопустима, потому что системе будет весит чертовы террабайты.

Это уже произошло в JavaScript и постепенно происходит в десктопе (например, winsxs). Игры вообще испокон веков распространялись вместе со своим рантаймом: vcc redist, DirectX, не говоря уже о middleware.

P.S. Терабайт не имеет ничего общего с землёй.
DirectX хотя бы ставится не с каждой игрой, а один раз на систему.
В свое время был целый вал «месячных» обновлений DX, штук пять разных, так что практически каждая игра таки что-то доустанавливала.
Я о том, что в системе, как правило, не требовалось иметь сразу 100500 копий одной и той же библиотеки (что как раз и наблюдается при работе с тем же npm).
Это да. Но примеров обратного тоже полно, так что ситуация, аналогичная npm не является чем-то новым даже на десктопе.
Роб Пайк принял деятельное участие в разработке Plan9 в BellLabs, последней инкарнации Unix, революционной, пересматривающей основопологающее. Система не нашла массового пользователя, в основном по причинам маркетингового характера. Однако большинство заложенных идей подхвачено и реализовано разрозненно в user space. В упомянутом докладе Pike, как архитектор действительно новационной системы, сетует на отсутствие новизны в идеологии массовых операционных систем и прорывных исследований. Так, Nix — пусть и очень достойный, но всего лишь менеджер пакетов решающий один аспект управления системой.

NixOS решает очень много аспектов управления системой.

Есть огромное множество проектов на доморощенных или слишком ограниченных языках:

Повторное изобретение колеса, обычно, не самая хорошая идея.

А что нужно использовать вместо SQL, Octave, JSON или LaTeX? Может, стоило вообще остановиться на Fortran, чтоб не изобретать колесо?

самое интересное что они Lisp и Scheme записали в "доморощенные или слишком ограниченные языки" в то время как сами продвигают свой Guile.

Переводчику надо оторвать руки. Оригинал:


Octave, R, PARI/GP, most scientific programs (better ideas: Common Lisp, Racket and other Scheme)

Правильный перевод:


Octave, R, PARI/GP, большинство научных программ (более лучшая альтернатива им: Common Lisp, Racket и другие реализации Scheme)

Совершенно другой смысл.

Если позволите, если мы делаем правильный перевод, то «более хорошая», а не «более лучшая» :) Если вы использовали такую конструкцию сознательно, прошу прощения, просто, как во многих других случаях до этого, над ней вначале смеялись, но смеялись так долго, что глаз за неё цепляться у людей перестаёт.

Главная цель перевода — передать исходную идею. Это и есть критерий правильности. А если я вдруг надумаю переводить в массовом масштабе, то назначу вас моим редактором, видимо у вас куча свободного времени и въедливые глаза.

К сожалению важна не только идея, но и форма ее подачи…
В любом случае — сообщество (включая меня) готово Вам помочь сделать все красиво и аккуратно )
Да нет, всего лишь любовь к родному языку) Впрочем, я рад, что вы осознаёте собственные недостатки (у кого же их нет?) и нужду в редактуре)

Масляное масло передает смысл более лучшее?

И «более хорошая» и «более лучшая» - звучит отвратительно, если уж хочется то "Еще лучше использовать бла, бла "

Есть ваше личное мнение, а есть правила русского языка. "Более лучшая" нарушает правила русского языка, "более хорошая" – нет. "Ещё лучше" вообще имеет несколько другой оттенок, и напрямую "более хорошая" не заменяет.

Есть ваше личное мнение, а есть правила русского языка. 

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

Вот хорошая статья на эту тему: https://sysblok.ru/blog/pravilnost-v-jazyke-a-sudi-kto/

UFO just landed and posted this here
А как они сейчас запускаются на GNU/kFreeBSD или GNU Hurd? То что собрали под платформу, то и будет доступно. Ну и конечно сравнение с BolgenOS мне кажется перебором.
Очередной БолгенОС с нескучными пакетами?

Нет. Тут принципиально новый подход к управлению пакетами и системой в целом.
Через настраиваемый слой совместимости, с трансляцией системных вызовов?

Почему бы и нет? Скажем, ZFS во FreeBSD работает через opensolaris.ko

Благородное начинание, гарантированное на умирание (жизнь в своей нише). Причина? Выбор schema как языка. Никто не будет учить новый тьюринг-полный язык, чтобы чуть сделать пакет.


В целом — идея интересная, и вот вам несколько простеньких задачек для решения:


  • dpkg-divert --local --divert /etc/ansible/ansible.cfg.dist --no-rename /etc/ansible/ansible.cfg
  • update-initramfs при установке нового компонента (например, dm-crypt) для обработки initramfs хука (надо же добавить программу для расшифровки диска на этап до расшифровки диска, ha.ha).
  • update-alternatives (например, editor -> /usr/bin/vim)
  • apt-mark hold libfoobar-3.2-3-nmu3
  • Package: *
    Pin: origin private.example.com
    Pin-Priority: 600


Если для каждого из них покажете пример в этой самой schema-driven package management, то тогда я его перестану считать CS-экспериментом.


(Upd: это перевод… мдя, извините за энтузиазм).

Никто не будет учить новый тьюринг-полный язык, чтобы чуть сделать пакет.

repology.org
Most packages: nixpkgs unstable
Ну никто, да-да-да.

Извините, на Scheme не можу, буду на nix.


  • dpkg-divert --local --divert /etc/ansible/ansible.cfg.dist --no-rename /etc/ansible/ansible.cfg
    Просто перетаскивание файлика пакета в другое место — легко через override. Если нужно файлики конфигурации перетаскивать — элементарно в NixOS через environment.etc или в home-manager через home.file


  • update-initramfs при установке нового компонента (например, dm-crypt) для обработки initramfs хука (надо же добавить программу для расшифровки диска на этап до расшифровки диска, ha.ha).
    Реализовано в NixOS. Просто выставляете опцию шифрования диска, всё остальное — автоматически.


  • update-alternatives (например, editor -> /usr/bin/vim)


    stdenv.mkDerivation {
    name = "editor";
    buildPhase = ''
    mkdir -p $out/bin
    ln -s ${pkgs.vim}/bin/vim $out/bin/editor
    '';
    }

    Как пример. Можно сделать через alias, или ещё кучей способов, если мы на NixOS.


  • apt-mark hold libfoobar-3.2-3-nmu3
    nixpkgs pinning для одного пакета. Известная техника. Суть такая:


    let nixpkgs_pin = import (builtins.fetchGit {url = "https://github.com/nixos/nixpkgs"; rev="commit-with-needed-package-version";}) {};
    pinned_libfoobar = nixpkgs_pin.libfoobar;
    in pinned_libfoobar;

  • Package: *
    Pin: origin private.example.com
    Pin-Priority: 600

    Что это такое?


Package: *
Pin: origin private.example.com
Pin-Priority: 600

Что это такое?

Это /etc/apt/preferences.d/ — приоритеты для реп в apt

Тогда можно провести прямую аналогию с каналами в Nix. Только в nix всегда явно указывается канал, так что проблем с приоритетом каналов нет.

Тогда у меня вопрос, а как сделать, вот это:
```
Package: *
Pin: origin private.example.com
Pin-Priority: 600

Package: *
Pin: origin private.example.net
Pin-Priority: 600

```
Т.е. указать два репозитория с одинаковым приоритетом?

Еще раз повторяю, мы каждый раз явно выбираем, откуда ставить пакет. (Всё немного сложнее на самом деле, мы выбираем не репозиторий, мы выбираем нужный package set, а собственно репозиторий в смысле место хранения бинарного файла выбирается автоматически)

Извините за задержку с ответом.


Итак, у нас декларативный язык, который решает проблему update-alternatives… исполнением mkdir и ln. Это точно, guile, а не bash?


Дальше, я написал простое: apt-mark hold libfoobar-3.2-3-nmu3. Вы написали


let nixpkgs_pin = import (builtins.fetchGit {url = "https://github.com/nixos/nixpkgs"; rev="commit-with-needed-package-version";}) {};
pinned_libfoobar = nixpkgs_pin.libfoobar;
in pinned_libfoobar;

Т.е. вы мне, как оператору, предлагаете писать ЭТО? Можно я сразу забракую всю конструкцию за невыразимую антиэстетичность?

Итак, у нас декларативный язык, который решает проблему update-alternatives… исполнением mkdir и ln. Это точно, guile, а не bash?

  1. Это не guile, это nix
  2. Если мы не ограничены присутствием другого пакетного менеджера в системе (т.е. мы находимся на nixos/guixsd), у нас есть куча других способов добавить в PATH бинарник с нужным именем, указывающий на другой бинарник. (А мне лично удобнее пользоваться alias'ами, которые у меня декларативно указывают на нужное мне приложение, например e -> emacsclient)
  3. Не вижу ничего плохого в использовании UNIX-утилит. Те, кто видят в этом плохое, используют guix и пишут установочные скрипты на scheme.

Дальше, я написал простое: apt-mark hold libfoobar-3.2-3-nmu3

И через пару апдейтов всё сломалось, а у меня будет работать (условно) всегда, пока github.com онлайн и старая версия libfoobar с зависимостями не удалена из интернетов. Ну и я забыл упомянуть, что pin можно сделать один на всю конфигурацию, и потом писать просто [ pin.libfoobar pin.bash pin.hello ].

Не сломается. Максимум, мне скажут, что апдейт не возможен. Обычно это выглядит как отказ обновлять программы, которые будут ломать зависимости на холде. Именно для этого холд и нужен.
А у меня остальную систему (включая всякие glib и прочие системные вещи) можно обновлять отдельно от libfoobar с его зависимостями (скорее всего, пинить нужно не libfoobar, а приложения, которым он нужен. Тогда libfoobar автоматически запинится для этих приложений). В этом прелесть чистых ПМ — можно держать сколько угодно версий чего угодно одновременно в системе, и они не будут друг другу мешать.

Хотите эстетики?


let 
  nixpkgs_pin = import (
    builtins.fetchGit 
    {
      url = "https://github.com/nixos/nixpkgs"; 
      rev = "commit-with-needed-package-version";
    }
  ) {};
  pinned_libfoobar = nixpkgs_pin.libfoobar;
in pinned_libfoobar;

Это как я бы написал у себя в конфиге.
Теперь к настоящей красоте nix: оверрайдам. Хочу, чтобы compton с анимациями!


    compton = old.compton.overrideAttrs (oldAttrs: {
      src = builtins.fetchGit {
        url = "https://github.com/BlackCapCoder/compton";
        ref = "master";
      };
    });

И мне не нужно заботится о процессе сборки compton.
Хочу телеграм с wide-baloons!


tdesktop = old.tdesktop.overrideAttrs (oldAttrs: {
        patches =
        [
          ("${builtins.fetchGit
          {
            url = "https://github.com/msva/mva-overlay";
            rev = "7b61558a20a92920c1594d46a68f713e199957ad";
          }}/net-im/telegram-desktop/files/patches/1.5.8/conditional/wide-baloons/0001_baloons-follows-text-width-on-adaptive-layout.patch"
          )
        ] ++ oldAttrs.patches;
    });

Ещё одно преимущество, вытекающее из повторяемости — хорошая "оффлайновость." Нужно поставить пакет на компьютер без интернета?


nix-store --export $(nix-store -qR $(nix-build 'nixpkgs-version-on-offline-pc' -A firefox)) > out

out кидаем на флешку, переносим на компьютер без интернета,


nix-store --import < out

Получаем нужную софтину, которая гарантированно работает (ибо все зависимости идут вместе с ней).

Мне вот интересно. Вот этот чудесный nix-build — он же берет среду для компиляции самую свежую из системы? А если программа собирается только каким-нибудь древним autotools + древний gcc? Как Вы скажете системе, что нужно так делать? Это тогда получается минимум два блока зависимостей (один — для сборки, второй — для запуска)

В nixpkgs есть древние версии gcc и средств сборки специально для таких случаев. Даже пинить ничего не надо — просто выбираем версию постарше в buildInputs.

Пример покажите, пожалуйста.
Вообще пока что я вижу, что хоть и nixpkgs гибче, но бинарные ПМ типа rpm/deb при условии верного прописывания версий зависимостей в манифестах (это на самом деле очень важно!) работают как-то попроще. Для пользователя.

Предположим, что для сборки cmake-проекта foobar нужен gcc версии 4 и утилиты, которые идут с этим gcc. Пишем


stdenv.mkDerivation {
    name = "foobar";
    src = ./.; # Сырцы там же, где и default.nix
    nativeBuildInputs = [ gcc49 cmake pkgconfig ]; 
    buildInputs = [ libfoo libbar libbaz ]; # Используемые библиотеки
}

И получаем именно то, что нам нужно.

Спасибо за пример, но я так понимаю, что в этом примере только выбрана одна конкретная версия gcc 4.9, а остальные пакеты — отданы на откуп самому менеджеру пакетов.
Ну, и вообще хочется понять насколько это годная история, поэтому задаю такие вопросы.
Здорово, что есть возможность руками выбрать, но все-таки, как мне кажется, это задача мейнтейнера задавать вот эти вот ключи для правильной сборки.

Именно мейнтейнеры nixpkgs и занимаются выбором правильных ключей сборки и зависимостей так, чтобы пользователь набрал просто nix-env -iA nixos.foobar и получил нужную программу, не задумываясь о ключах сборки и зависимостях. Когда мы пишем пакет сами, вполне логично, что мы должны выполнять работу мейнтейнера.

Выбор schema как языка. Никто не будет учить новый тьюринг-полный язык, чтобы чуть сделать пакет

Lisp/scheme "учится" за полчаса и на всю жизнь. Хотя соглашусь, что тонны скобок могут напрягать.

Да, он действительно несложный, но меня очень напрягает читаемость и неявные сайд-эффекты. Я бы предпочёл, чтобы условный guix был написан на условном Haskell.

amarao, тебя не устраивают мои решения? Или вопрос был только к scheme и в nix ты и так не сомневаешься?
UFO just landed and posted this here
Сидел на NixOS где-то год, ощущения двойственные, с одной стороны декларативная конфигурация в одном месте и возможность откатиться в любой момент радовали, с другой система для меня выглядела как черный ящик, слишком много отличий от привычного гну/линукса. Подумываю попробовать ещё раз, поставить core crux и на него nix, возможно в таком варианте будет проще освоиться. А про GuixSD (в заголовке ошибка — нет ОС Guix) слышал что оно пока не готово.
Идея этих дистрбутивов всегда мне казалась верной — иммутабельность это единственный способ убрать все грабли, но я како-то не уверен, что лисп лучше специального DSL.

В использовании DSL и есть идеология Unix. Но как только вам нужно выйти за рамки специального DSL, то начинается ад, начиная с выбора инструмента, на котором вы будете это делать и заканчивая установкой всех необходимых для этого зависимостей. Количество новых проблем начинает расти экспоненциально. Хотите расширить что-то работой другого разработчика, а он принял другие решения, использует другие инструменты, тянет очередные зависимости. В итоге получаем Linux с его зоопарком дистрибутивов, конфликтами зависимостей и отсутствием общеупотребимых инструментов автоматизации. О чем и написано в статье.


Ничто не мешает создать подмножество Lisp/Guile для конфигурационных файлов с урезанным функционалом.

В основном в использовании Scheme вместо Nix. Ещё тут очень много пакетов бутстрапятся, а инструментарий внезапно поудобнее, чем у nix. Но я не очень много пользовался GuixSD, возможно, есть ещё преимущества. Пока что Nixos выглядит получше из-за обилия модулей и пакетов.
Кроме того, Portage страдает от той же проблемы с отсутствием надлежащей поддержки нескольких версий


Да ладно? А слоты?
почитайте багрепорт о nodejs, слотами не решается.

nvm это решение вне плоскости системного пакетного менеджера
lua вообще батхерт — посмотрите какой маскарад развели чтобы система собиралась (хотя тут сама луа тоже отличилась)

Это прекрасно, что Guix так развился.
Да apt, portage и подобные обросли, но у них нет будущего.
Надеюсь, Guix и Nix вытеснят уже архаичные костыли apt, yum и им подобное.
Скажем, последний mpv требует нового ffmpeg, но обновление ffmpeg ломает большинство других программ. Мы застряли перед дилеммой: либо ломаем некоторые пакеты, либо сохраняем старые версии.

Если авторы mpv не умеют правильно собрать пакет под конкретную версию дистрибутива, или вы пытаетесь воткнуть в систему пакет собранный для другой версии, то вы, очевидно, сами себе ищете приключений.
И опять те же грабли изолированности…
Да всем(подавляющей части обычных юзеров планеты) плевать на открытость, какие-то там решения по настройке\сборке пакетов и прочее подобное.

А ведь рецепт(вкратце) убийцы винды\осх прост — красивенький и понятный, никаких hrenznaet4tozademon.conf на 100500 строчек ui + запуск пакета адоба + MS Office + всякие автокады в 1 очередь. Остальное и так почти все уже кроссплатформенное или умеет в wine. И никаких заменителей никому нахрен не нужен например опенофис на самом деле. Все -профит :)

Я до сих пор искренне не понимаю почему какой-нить дистр на Linux до этого не дошел — все пляшут на одних и тех же граблях и пытаются переизобрести свое колесо
Зря вы так про опенофис. Уже как лет 5-6 пользуюсь без какого либо неудобства. Особенно после того как МС перешел на табы в менюшках. Так что тут вопрос скорее вкуса.

Периодически смотрю, но он, к сожалению, как умирал на средненькой портянке 400x8000, так и умирает.

К сожалению, и в LibreOffice, и в MS Office for Mac регулярно едет форматирование и появляются странные непечатаемые символы.
Получается, что совместимость на уровне форматов есть (docx, odt etc.), но фактически юзеры как раньше страдали, так и страдают раньше.
Может дело в том, что форматам не следует MS Office?
(просто предположение)
Ваше предположение — предположение Шредингера :)
1) Оно верно
2) Whocares

Тут была цитата, правда к другой теме, но все же она идеально подходит и сюда —
стандарт — это то, что используют, а не то, что написано на бумагах, но не поддерживается почти никем…

Нет, я предлагаю смотреть с чуть другой стороны. Насколько помню, формат doc опубликован, «от доброты душевной». Не имеет смысла с точки зрения открытых инструментов этому формату следовать плохо, зато имеет огромный смысл с точки зрения Microsoft следовать формату «лучше». Например, я сталкивался с ситуацией: границы независимых таблиц были выровнены в MSWord, но отображаются с малюсеньким таким сдвигом в Libre. Я предполагаю, что в самом файле координаты границ в этих таблицах не равны, и Libre честно это отображает, а вот MSWord достаточно умён, чтобы «угадать» намерение пользователя и применить там дополнительное форматирование, хотя формально здесь они не следуют ими же опубликованному стандарту. Это, разумеется, только спекуляции, и вообще, надо на шапочку ещё слой намотать, а то блеск уже не тот.

А отношение про «стандарт — это то, что [только] мы используем» — очень полезное с точки зрения vendor lock-in, но крайне вредное для кооперации B2B, конкуренции в сфере услуг, и с точки зрения антимонопольных законов тоже.
UFO just landed and posted this here
Ну, а чего тогда они вечн удивляются в стиле *а чойто к нам с венды не уходят* ?)

Кстати, это касается даже корп. серверов(если это не веб офк) — например та же почта.
Сколько надо времени(утрированно, но не сильно) настроить всю обвязку почтовика на лине с клиентами на аутглюке с доменной аутентификацией? А маштабировать это все?

А теперь берем, ну например hMail или, даже, Exchange — поменяется только кол-во доступных фишек: далее-далее-далее-%мастер настройки фичи%-ок.
Все. Все уже работает и через 15 мин в продакшене и может поддерживаться джуниор-помошником админа. Профит.
Вот пока в линуксе не будет чегонить подобного(есть конечно зимбра, но при ее аппетитах — шилонамыло) у линукса шансов объективно примерно чуть ниже нуля.
UFO just landed and posted this here
А маштабировать это все?

Как раз на лине масштабируется легко, в отличие от Win. Времени на настройку уходит не сильно больше (в пределах одного порядка, по личному опыту), а вот квалификация требуется сильно повыше. Так что если нужна надёжная система с высокой масштабируемостью — берут линукс и нанимают профессионала, если нужно просто вот сейчас сервачок — то берут сына ген. директора и win.

Если обновление что-то сломает, всегда можно откатить.
Объясните мне на пальцах, как это спасёт от
rm -rf /usr /share/...
UFO just landed and posted this here
Только в процессе обновления таких команд быть не может.
ORLY?
UFO just landed and posted this here
Это было в коде драйвера (скрипт апдейта), ничто не мешает там быть
rm -rf /nix
nixpkgs съест и получится то, что получится.
UFO just landed and posted this here
UFO just landed and posted this here
3 раз пишу: это код приложения, внутри пакета, а не debian postinstall/installscript/scheme/etc, откатить никак не получится если вы не делаете снапшоты ФС на каждое обновление (:
UFO just landed and posted this here
В функциональных менеджерах нет императивного удаления.
Если надо обновить версию драйвера — прописываете его в конфиг и делаете операцию «привести систему в соответствие с конфигом» — и он сам удалит всё что не нужно.

типичное заблуждение касательно любых SCM (ansible, puppet etc.). Они действительно должны так работать, но под капотом все равно императивщина (а как еще назвать инструкции вроде «удали файл такой-то», «перезапусти сервис» и пр.). Даже хуже — некоторые вещи в парадигме «хочу что-то» (т.е. описываем желаемый конфиг) не работают, что и приводит к необходимости написанию своих модулей для SCM и модулей типа «kubernetes operator» для k8s.

ну так не надо левые приложения запускать под рутом. А если такого сорта баг в ядре (т.е. в основе системы, не обязательно kernel), тогда спасут только бэкапы на сервер расположенный в другой пожарной зоне :)

То есть, можно просто grep-нуть исходники пакета, и если в нём есть rm -rf — то нафиг такой пакет?
Можно? Да, конечно.
Будет ли это кто-то делать, когда мы тут за bleeding edge и git clone в качестве первого шага установки, указанный мной инцидент прекрасно продемонстрировал.
Можно каждую установку пакета запускать в чруте, что на выходе получилось — уже устанавливать.
UFO just landed and posted this here
потому что способов навредить системе, вообще говоря, счётное число,

Или, может — несчетное, все-таки?
UFO just landed and posted this here

Не съест. Прав у nix-builder-0 не хватит на удаление этой папки, в "худшем" случае удалится только $out, т.е. сам пакет.

По умолчанию используется sandbox сборка. Этот каталог не будет виден билдеру

UFO just landed and posted this here
Специально проверил свой /usr — симлинки конечно присутствуют, но в основном лежат реальные файлы. Предлагаю снести /usr/bin /usr/sbin и посмотреть выйдет ли вообще после этого систему обновить.
UFO just landed and posted this here
Предлагаю снести /usr/bin

Готов прям сейчас. У меня там только env, и тот — симлинк для совместимости с shebangs.

Да никак вам не смогут ответить, потому что «современные» ОС из 90 годов скорее не ОС общего назначения, а технические ОС. Настоящие современные ОС — это android и ios. Самое главное отличие: приложения не могут сломать систему, они работают в своей песочнице, контейнере. Конечно, есть исключения, но то такое.
Пока что десктопные ОС похожи на какой-то зоопарк который пытаются решить костылями типа докера, хоть и весьма изящными, но костылями.
Так в nix/guix вся сборка и установка происходит на 100% изолированно, и сделать какую-либо операцию (даже чтение) вне собственного каталога сборщик попросту не может. Ну а если поверх довесить firejail, то изоляция будет и на уровне рантайма. Вот вам и изоляция полная.
Это хорошо что есть подвижки, а вообще говорю про остальные ОС с общей долей 99.99% рынка.
Изменения всегда приходят медленно.

В nix/guix сборщик очень ограничен в своих действиях. Я могу попытаться собрать даже rm -rf /, но nix-builder-0 просто не имеет прав на что-либо, кроме своей папки в tmp (rwxrwxrwx) и buildInputs (r-xr-xr-x). Т.е. читать он может только свою маленькую директорию и директории входных пакетов, а писать может только в свою директорию.

Все это красиво и я всеми руками ЗА! за развитие NixOS и GuiX.
Но — NixOS, я пробывал, но этот DSL что то с чем то *непереводимая игра слов*. Прикрутить туда тоже VScode заставило меня достать пылившийся бубен.
Guix — ребят, ну зачем эта излишняя фриварщина? Покупать новое железо под ОСь с неизвестными будущем? и кричать я весь такой фриварный… нет зондам. Emacs? — это прям вообще убер фича? Мое мнение — прикрутить отдельную репу проприетарщины, кому надо то поставит, прикрутить туда IDE из каробки помимо Emacs и VIM. Сделать как Manjaro — Community Release с разными DE. И проект взлетит!
Прикрутить туда тоже VScode заставило меня достать пылившийся бубен.

Одна строка в конфиге — это пылящийся бубен? Серьёзно?


Мое мнение — прикрутить отдельную репу проприетарщины, кому надо то поставит, прикрутить туда IDE из каробки помимо Emacs и VIM.

В nixos по-сути так и сделано. Выставляем опцию nixpkgs.config.allowUnfree = true; и ставим несвободные пакеты в своё удовольствие.

Одна строка в конфиге — это пылящийся бубен? Серьёзно?

Я «курил» NixOS, когда VScode еще не было в pkgs.

Статья написана так, будто guix сам сын автора создавал)

UFO just landed and posted this here
 Что я могу сказать. Действительно, текущая парадигма пакетных менеджеров изжила себя. Иначе бы не появлялись статьи подобно настоящей или этой: habr.com/ru/post/433052
Но решение приведенное в статье выглядит как академические изыскания, а не как реальное решение проблемы. К тому же, я, как и многие другие, скорее готов изучить YAML/JSON/TOML или любой другой человеко-читаемый формат описания манифестов пакетов, чем генерировать код на Scheme, который может все. К тому же, раз код манифестов в GuiX по сути написан на Scheme и обладает бесконечными возможностями расширения, то это очередная Тьюринг-полная машина, в которой можно насоздавать бесконечное количество уязвимостей. Как это все аудировать? Ответа нет.

Для серверов будущее очевидно. Оно в ОС, изменяющихся атомарно (CoreOS Container Linux и клоны). Программы — в контейнерах типа docker («все свое ношу с собой»). Если заглядывать дальше, то вообще переход на serverless (aka lambda).
Самый шикарный случай rm -R на моей памяти, это когда достался 486, с мизером оперативки, куцым хардом — удавалось поставить w98, (в одном офисе было веселее — ХПя требовала памяти, но в пк стока не было., но в кабинете было ещо 3 таких же пк — собирались плашки по всем машинам, и поочереди с донорской памятью накатывалсь ось, потом органы раздавались благотетялям, после запуска винда офигивала, что так жостко обошли системные требования, но почта вроде работала) но когда захотелось поиграть — места на нжмд не хватало, выход — удалялись все файлы, не запущенные в данный момент. некоторые игрушки устанавливались, и запускались. После ребута — новый накат системы…

А по мне джента ничего так — если ставятся пакеты, которые скоро удалятся — emerge undelete xxx в системе после depcleana останется, будет в 2х слотах… про зависимости — а кто мешает в \etc\portage\use написать для проги yyy use python2 для проги zzz python3… правда заморочки с версиями ruby достают надо явно писать use ruby 5.2 <<-4.8 Также — про «одну актуальную версию» — гугль в помощь, как правило лежат нестабильные версии, актуальная и 5-6 предыдущих — никто не запрещает скачать исходники в локальный портаж, было-бы желание можно и 2.26 ядро собрать, с gcc и linux-headers…
На счет хороших конфигов в линуксе и плохого реестра винды.

Как-то на raspberry pi настраивал сеть, сам я не админ, поэтому многое было в новинку. Дело осложняло то что версий малины за 5 лет накопилось много и часто гайды были устаревшими. По итогу пришлось настраивать сразу 2 компонента из-за того что новый не работал во всех случаях.

Другой случай был с rtx 2080 fe на убунте. Эта видеокарта не работала должным образом из-за отсутствия драйверов, можно было разве что довольствоваться разрешением ~600х600. После установки дев-версий драйверов, разрешение удалось выставить в 1440p, но необходимую частоту — нет. После нескольки часов гугления и работы с разными конфигами удалось все же выставить частоту обновления 165гц. Так же пока что нет сборки хрома с поддержкой 165гц для линукса, только хроминум который не может стабильно выдавать такую частоту и выдает 80fps с просадками до 40.
Что в винде? В винде через 5 минут скачался и установился драйвер, через 1 минуту была выставлена настройка 165гц обновления, хром сразу перешел на нужную частоту.
При корявости винды все заработало за условные 6 минут, в линуксе за 2-3 часа и не полностью.
Есть же разные atomic OS, есть modular Fedora. Есть snap, flatpack, appimage.
Есть докер и k8s, наконец, где вообще не так важно, какая там у тебя операционная система под капотом и где пакеты вообще не особо нужны.
Ниша у «полностью программируемой OS» наверняка есть, но тратить месяц на настройку, чтобы потом держать 100 человек на поддержке — очень специфичный use case.
Ехать же надо, а не шашечки. Если для каждой поездки надо месяц готовить машину, в большинстве случаев такое не взлетит.

Nixos/guixsd очень хорош, когда машин больше десяти. Тогда ты пишешь один раз конфиг (да, это может занять пару дней или даже неделю), а потом просто раскатываешь его по всем машинам. Если всё правильно сделать, то изменения настроек можно делать просто редактированием конфига и после этого nixos-rebuild switch --target-host .... Когда машина одна, преимущества тоже есть (атомарность + декларативность + rollbacks + изолированность + повторяемость + легкость оверрайдов a-la gentoo, только эти оверрайды ещё и аддитивны, и т.д.)


не так важно, какая там у тебя операционная система под капотом

nix тоже запускается на всём POSIX-совместимом.


А вообще — относитесь ко мне с подозрением, ведь я уже потратил месяц на написание конфига и теперь ни за что не признаю ошибки :)

но тратить месяц на настройку, чтобы потом держать 100 человек на поддержке — очень специфичный use case.

Около 400. + NixOps. И да, rollback. Месяц, хм, Вы не поверите…
Невероятно интересный проект, аж захотелось попробовать в качестве основной системы. Есть вопрос: много ли геморроя с проприетарными пакетами? Например, хочу поставить Skype, какая (хотя бы в общих чертах) должна быть последовательность действий?

Если нужно много проприетарщины, то лучше попробовать NixOS. Там достаточно nixpkgs.config.allowUnfree = true и можно ставить скайпы и прочую проприетарщину прямо из бинарных репозитариев. В guix с проприетарщиной гораздо хуже отношения (GNU как-никак).

Понятно, спасибо, буду иметь в виду. NixOS как раз-таки не так интересен по причинам, указанным в посте (свой доморощенный ЯП для конфигурации вместо уже существующего).

По сравнение с арч в nixos не так оперативно выкатывают обновления на новые версии.

Обновления — лучше всего в alpine :-) не удивлен, учитывая направленность дистрибутива ))))
Sign up to leave a comment.

Articles

Change theme settings