Portál AbcLinuxu, 13. května 2025 00:49
schoda teda ale, ze nezminil Nix(OS), resp. Guix (ktery Nix vevnitr pouziva), ktery vypada jako dost zajmavy a pokud vim jediny fundamentalne prehodnoceny pohled na to jak distribuovat a nasazovat softwareTak na to je asi dost brzo, zvlášť pro Jirku, který se zabývá současností a velmi blízkou budoucností. Pokud si dobře pamatuju, tak jsme slyšeli o tomto systému poprvé na FOSDEMu a nejsem si jistý, zda je známo něco mimo tu únorovou přednášku.
nedavno se trochu rozepsal jeden ze spravcu Nixu: Why Puppet/Chef/Ansible aren't good enough (and we can do better), to vyvolalo zajmavou diskuzi na HN a ReddituJak to tak čtu, tak mi přijde, že je to z pohledu dnešních distribucí trošku hardcore. Už jsem pár takových experimentů viděl a slyšel jsem spoustu lidí snít, ale jak často se počáteční nadšení promění v hromadné nasazení?
Už jsem pár takových experimentů viděl a slyšel jsem spoustu lidí snítto zni zajmave, ja totiz zatim slysel jen o Nixu a Guixu (a jeste GNU Stow), co mas na mysli?
musim ale dodat, ze treba takovy OSTree, ac ne tak hardcore jako Nix, na me nepusobi jako uplna tuctovka. posle me ma bliz k "ukrutne inovativnosti"Pokud jde o ostree/continuous od Colina Walterse, tak to vnímám jako nástroj na značně jiné účely než package manager.
jinak NixOS neni pohopouhy teoreticky konstukt, je to skutecna fungujici distribuce, kterou pouzivaji skutecni lide, a kterou si mouho vyzkouset i ctenari abicka, napr ve VirtualBoxu. v pripade Guixu to jde v QEMUJenže pořád zústává nezodpovězená otázka, proč by to měli zkoušet, tedy co je na tom tak úžasného, aby to stálo za zkoušku.
jeden z dalsich "vystrednich" projektu na ktery jsem si ted vzpomel, je GoboLinux -- distribuce, ktera provozuje system "kazda aplikace ve svem adresari". tento projekt byl dlouha leta byl v komatu, ale v posledni dobe opet ozil.I tady bych se rád dozvěděl proč, s výjimkou MS-DOS nostalgie, by to měl člověk chtít používat.
Napriklad chci otestovat novou verzi nejakeho projektu, ktera ma ale hrozne moc (build) zavislosti. Takto se mi vsechny nainstalujou na jedno misto a nezase*u si tim kompletne system.Něco podobného dělá mock, akorát je ukrutně pomalý, ale v tom by teoreticky mohl pomoci docker.
S Nix nainstalujes python3 na jeden prikaz do systemu ciste (a poresi ti to i (build) zavisloti (takze pak neskoncis s pythonem, kde treba nefunguje https v urllib).Nevěřím na magii v lennartovském smyslu. Znám zhruba reálné problémy s přípravou a instalací software balíků od autotools a alternativ přes ebuild a rpm až po konflikty v instalaci. Znám současná řešení v RPM distribucích (a tím pádem i ve značně podobných .deb distribucích) a v Gentoo. Jsi schopný mi přesně říct, v čem se Nix liší a jak v RHEL6 magicky vyřeší všechny problémy distribuce software, aniž bych pro to musel hnout prstem? Narážím na limitace jak RPM tak i ebuildů, jsou věci, které se dají jednoznačně vylepšit, jsou věci, kde je potřeba se rozhodnout mezi více možnostmi s různými výhodami. Ale zatím si nejsem vědom toho, že bych mohl vzít nějaký kus software a od zítra tvrdit, že se všechno udělá samo.
v čem se Nix liší a jak v RHEL6 magicky vyřeší všechny problémy distribuce softwareIf only
Napriklad chci otestovat novou verzi nejakeho projektu, ktera ma ale hrozne moc (build) zavislosti. Takto se mi vsechny nainstalujou na jedno misto a nezase*u si tim kompletne system.
Dospělé balíčkovací systémy umožňují instalaci mimo /.
A stejne tak na jeden prikaz muzu vsechno vycistit.
Dospělé balíčkovací systémy poznají, že implicitně nainstalovaný balíček už není potřeba, a odinstalují ho.
nikdo nema cas to delat ciste
Od práce tě nezachrání žádný balíčkovací systém. Pokud software nikdo ještě nezabalil, tak někdo tu práci první udělat musí. Jinak to bude vždy špinavé.
Nix je dost prakticky a resi realny problem s deploymentem software na dnesnich linuxovych distribucich.
Řeší jeden problém a naopak vytváří jiný.
Dělá to, že po instalaci balíčku jeho obsah nelze přímo použít. Takže nezase*u si tim kompletne system
. Jenže naopak to znamená, že každý program, který ho chce použít, musí v metadatech deklarovat, že ho potřebuje, aby systém mohl potřebné závislosti explicitně zapnout.
Díval jsem se do manálu i na zdrojáky Nixu a třeba u perlových skriptů dělá to, že přepisuje shebangy, aby v nich zpřístupnil požadované perlové moduly. Podobně při build-requires přidává překladači parametry s vyhledávácími cestami k závislým hlavičkovým souborům.
Tipuji, že u programů a knihoven přidává cesty to PATH a LD_LIBRARY_PATH.
V podstatě se jedná o složitější environment modules.
Co je novátorské, je identifikace zkompilovaných balíků přes hashe, což (nějakým způsobem?) umožňuje poskládat řetězec build-time závislostí a jednoznačně na něj odkazovat (třeba při replikaci instalací). Ostatně stejně to dělá OS-Tree nebo Docker.
Jenže přesně tahle novátorská vlastnost je dvousečná – jedná se efektivně o bundlování. (Pravda v podání Nixu je prostorově účinné, protože jednotlivé balíky se instalují jen jednou, ale zapínají se jakožto závislost u mnohokrát. Tedy zachovává se myšlenka sdílených knihoven.) Efektivně, protože se fixuje konkrétní build závislosti skrze hash. Takže když distribuce změní (například opraví bezpečnostní chybu) balík, tak balíčkovací systém potichu nechá původní verzi. A pokud distributor reverzní závislosti tohle nesleduje a nevydává rebuildy s aktuálními hashi, tak uživatelé budou používat rozbitý balík nadosmrti.
Což je přesně to, proti čemu jsou klasické balíčkovací systémy navržené.
Jirka Eischmann v přednášce řekl něco moc důležitého: Distributor nemá kapacitu všechno zabalit a vývojáři třetích stran nic balit nechtějí. Než se vypustí džin bundlování z lahve, je třeba zařídit izolaci programů, jinak se uživatelé v hnoji, který jim budou vývojáři třetích stran nabízejí, utopí.
Já nejsem v principu proti Nixu nebo podobným věcem. Někdo tu potřebu má, tak proč mu ji zakazovat. Ale vždy je to o tom, jak se takový nástroj použije a jestli se domyslí všechny důsledky a jestli s nimi budou všichni srozuměni. Tady se obávám, že k zamyšlení nedošlo.
Ještě jsem se na to díval.
Hashe se při překladů balíků nepoužívají. Používají se jen pro identifikaci binárních balíků, pro jejich stahování ze sítě a pro správu běhového prostředí.
PATH a jiné vyhledávací proměnné se neupravují. Místo toho ukazují do adresáře plného symlinků na spustitelné programy, dynamické knihovny a podobně. Když se „aktivuje nainstalovaný balík“, tak se adresář symlinků zkopíruje, přidají se odkazy na soubory z aktivovaného balíku a nakonec se adresáře atomicky přes rename(2) prohodí. Tím je docílena atomicita aktualizací i přes více balíků na jednou.
Návrat k předešlé verzi běhové prostředí se řeší tak, že adresáře symlinků se nemažou, ale pojmenovávají jakýmsi lokálně platným rostoucím číslem (něco jako revize v SVN), takže rollback je o jen o použití stejně pojmenovaného adresáře). (Ve skutečnosti i tohle je implementované přes symlinky.) Balíky v podstatě odinstalovat nelze. Pouze lze zavolat garbage collector, který smaže balíky, které již nejsou dostupné ze žádné verze běhového prostředí. To samozřejmě znamená, že není radno skladovat celou historii prostředí, ale s jistým zpožděním ji zametat (jako logově orientované souborové systémy).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.