Portál AbcLinuxu, 30. dubna 2025 09:02
William Jon McCann [reporter] [developer] 2013-07-08 18:18:50 UTC There is a new emerging FHS that recommends storing writable state/configuration data into /var/lib/<id> instead of /etc/<id>. It would be nice for NetworkManager to do that as well and to leave /etc empty by default. Or even better, just read system defaults from /usr/lib/NetworkManager/* or compile them in and not need a configuration file at all by default.V tuhle chvíli nehodnotím návrh samotný. Spíš mi přijde, že kluci tak nějak zkouší znovu protlačit nový standard (změnu standardu) tou cestou, že se před implementátory tváří, že je to jasná věc a doufají, že ho pak protlačí na základě existujících implementací nebo tak něco. Pokud jde konkrétně o NetworkManager, tak na něm je zajímavé to, že skutečně na základě administrátorských požadavků konfiguraci jednotlivých spojení běžně zapisuje a poskytuje plné prostředky pro její zapsání skrze API NetworkManageru. Přesun konfigurací spojení do /var/lib by tak mohl za určitých dávat smysl i beze změn FHS. Já ale požadavek chápu tak, že by měly zmizet i věci jako /etc/NetworkManager/NetworkManager.conf. Tedy cokoliv změníte v tom souboru, tak by se mělo dít až po nakopírování do /etc. Z mého pohledu je to práce navíc a bordel, ale třeba mě časem někdo přesvědčí, že je to skvělý nápad. Já jsem byl odkojený na takových těch podrobně komentovaných konfiguračních souborech, kdy člověk nemusel otevírat ani dokumentaci a měl jsem za to, že podobnou cestou se bude ubírat serverová konfigurace NetworkManageru (aspoň to vyplývalo z toho, co Danové diskutovali na IRC). Co dodat, snad jen... Let the flame begin!
Tiskni
Sdílej:
a proto by kazdy zapis softwarem mel byt jasne explicitni z uzivatelskeho pohledu (osobne bych to tedy omezil spis jen na ty explicitni 'save configuration' z menu nez na pripady, kdy k ukladani konfigurace dochazi soubezne se zmenou chovani).Zde ti musí být jasné, že to můžeš vůbec zkoušet jen u software, který má oddělenou běhovou a uloženou konfiguraci, tedy až u příštího vydání. Na druhou stranu i tam se může frontend chovat různě. Například může ukládat implicitně a runtime-only konfigurace se může řešit zvláštním přepínačem. Na druhou stranu vždy je možnost si udělat frontend vlastní, pokud ten existující nevyhovuje.
Zde ti musí být jasné, že to můžeš vůbec zkoušet jen u software, který má oddělenou běhovou a uloženou konfiguraci, tedy až u příštího vydání.Ano. Pokud software tohle nema rozlisene a kazda uzivatelska zmena se automaticky zapisuje na disk, tak mi mnohem spis dava smysl vyuzit na to /var/lib .
Lahudky typu slucovani /usr/(bin|sbin) s /(bin|sbin), zavadeni /run nebo presouvani systemove konfigurace z /etc nekam do p*ele musi pochazet od retarda bez hlubsich znalosti a souvislosti nebo systematickyho sabotera. Jinak si to vysvetlit nedokazu.
Já jsem byl odkojený na takových těch podrobně komentovaných konfiguračních souborech, kdy člověk nemusel otevírat ani dokumentaciTextovú konfiguráciu som si zamiloval od začiatku používania Linuxu, čo nastavenie, to riadok, alebo viac popisu, nech idú s tými XML, databázovými a binárnymi sprostosťami. do hája. Ja ich nepotrebujem a budem im to mazať! A s radosťou :)
To taky, ale XML1 by zpříjemnilo používání a možná by to autory víc trklo a donutilo navrhnout formát líp. I když i v XML jsem viděl dost nešťastně navržené formáty…
[1] nebo jiný formát, kde lze strojově čitelně specifikovat formát a existuje infrastruktura pro validace a transformace
GOTO 22
Je mi celkem jedno, jestli to bude XML nebo něco jiného, ale opravdu bych uvítal…
Psal jsem, že se jiným jazykům nebráním – jde mi o funkcionalitu, ne o konkrétní implementaci.
# Focus windows by clicking # ClickToFocus=1 # 0/1 # Focus windows when application requests to raise # FocusOnAppRaise=0 # 0/1 # Request focus (flashing in taskbar) when application requests raise # RequestFocusOnAppRaise=1 # 0/1 # Raise windows when focused # RaiseOnFocus=1 # 0/1 # Multiple click time # MultiClickTime=400 # [0-5000]Aké jednoduché, že? Komu chceš cpať to svoje XML
Dokud je ta struktura takhle plochá (klíč-hodnota), tak je to jakž takž použitelné, ale jakmile se tam objeví vnořené struktury nebo vícepoložkové hodnoty (seznamy, množiny), tak narazíš na limity těchto „jednoduchých“ formátů.
Další věc je, že i tady by se mohlo hodit schéma (XSD, RelaxNG atd.), protože pak si můžeš pomocí nástroje zkontrolovat, že jsi nenapsal třeba true
místo 1
(nebo yes
, ano
, TRUE
, enabled
, on
atd.). Tady tu informaci můžeš vyčíst z komentářů (pokud tam jsou a jsou aktuální), ale není to strojově čitelné, nedá se to automaticky zpracovávat.
A do třetice: dokumentace oddělená od konkrétní instance1 konfiguračního souboru a umístěná ve schématu se může aktualizovat2 společně s programem a zobrazovat se při editaci – můžeš tak mít vždy aktuální dokumentaci od autorů softwaru + vlastní poznámky si připíšeš do komentářů v konfiguráku.
Je mi celkem jedno, jestli to bude XML3 nebo něco jiného4, ale opravdu bych uvítal:
[1] která může pocházet třeba z nějaké historické verze daného programu, prošla rukama mnoha správců a možná i nějakými automatickými konverzemi/upgrady
[2]opravy chyb, upřesněný význam voleb v nové verzi programu, nové hodnoty výčtových typů, upravené rozsahy hodnot…
[3] zatím se jeví jako nejvhodnější kandidát
[4] vedle psal třeba Bystroushaak něco o Lispu, i když nevím, jestli je to to pravé pro konfiguraci – může to být třeba i něco na bázi INI souborů
XML – zatím se jeví jako nejvhodnější kandidátUž se těším až v konfiguraci místo
2 * x + 3
objevím
<sum>nebo místo regulárního výrazu zapsaného jako
<prod>
<const>2</const>
<var>x</var>
</prod>
<const>3</const>
</sum>
[A-Za-z][A-Za-z0-9]*
najdu třeba
<concat>
<union>
<range from="A" to="Z" />
<range from="a" to="z" />
<union>
<star>
<union>
<range from="A" to="Z" />
<range from="a" to="z" />
<range from="0" to="9" />
<union>
</star>
</concat>
Už se těším až v konfiguraci místo 2 * x + 3 objevím …
To je podobně absurdní a vykonstruovaný příklad jako v tom článku1 odkázaném vedle v blogu. Ukazovat nevýhody značkovacího jazyka na tom, že se v něm pokusíš psát program nebo sčítat, je přitažené za vlasy. Asi jako kdybych chtěl voláním céčkových funkcí poskládat HTML stránku nebo nějaký složitý strukturovaný dokument – ano, jde to, ale blbě se to čte i píše a nevidíš v tom na první pohled ten výsledek. I když někdy mohou mít taková využití smysl…
Jak moc do hloubky půjdeš a kolik toho popíšeš XML elementy a atributy a kolik toho už necháš uvnitř textu je na tobě – XML tě v tom nijak neomezuje a každému se může hodit něco jiného – někdo třeba napíše <jméno>Jméno</jméno><příjmení>Příjmení</příjmení>
a někdo jiný <jméno-příjmení>Jméno Příjmení</jméno-příjmení>
.
BTW: když chceš matematiku, v příští verzi Antu by mělo jít zapsat třeba:
<param name="p3" expression="64 * 64 div 128 + 10" type="xpath:number"/>
nebo místo regulárního výrazu zapsaného jako [A-Za-z][A-Za-z0-9]*
najdu třeba
To samé. Běžně se píše např.
<xsd:pattern value="[A-Za-z][A-Za-z0-9]*"/>
BTW: co takhle regulární výraz pro kontrolu regulárních výrazů?
[1] který se tu mimochodem už párkrát objevil
Jak moc do hloubky půjdeš a kolik toho popíšeš XML elementy a atributy a kolik toho už necháš uvnitř textu je na toběJenže pak to nebude splňovat váš požadavek:
formát pro konfiguráky s jednotnou syntaxí napříč různými programy (viz výše zápis booleovských hodnot + řetězce, escapování, kódování, stromové struktury, seznamy atd.)
To je podobně absurdní a vykonstruovaný příklad jako v tom článku1 odkázaném vedle v blogu. Ukazovat nevýhody značkovacího jazyka na tom, že se v něm pokusíš psát program nebo sčítat, je přitažené za vlasy.To není absurdní. Když bych použil vhodnější značkovací jazyk – třeba (něco jako) Prolog, tak první výraz mohu zapsat normálně a druhý třeba takto:
[A-Z,a-z],[A-Z,a-z,0-9]*když dodefinuji operátor
*
jako postfixový příkazem
op(100, xf, *)
BTW: co takhle regulární výraz pro kontrolu regulárních výrazů?Pokud se v zápisu regulárního výrazu mohou objevit podvýrazy v závorkách a není omezeno jejich vnořování, tak je třeba silnější prostředek (za předpokladu, že regulární výrazy rozpoznávají regulární jazyky).
['A'-'Z',a-z],['A'-'Z',a-z,0-9]*
Když bych použil vhodnější značkovací jazyk – třeba (něco jako) Prolog … když dodefinuji operátor * jako postfixový příkazem
Jenže to už se dostáváme za hranice značkovacích jazyků a přesouváme se k programování. A to je právě ta otázka (kterou už jsme tu asi taky kdysi řešili), jestli konfigurák má být neživým dokumentem, který je zpracováván, nebo jestli má být programem/skriptem, který sám něco dělá.
Nicméně přeskočil jsi to hlavní, co jsem se snažil říct – je jedno, jestli to bude XML nebo něco jiného, důležité je, jestli to nabídne ty možnosti: strojově čitelný popis formátu, validace a další, viz výše.
Jenže to už se dostáváme za hranice značkovacích jazyků a přesouváme se k programování.Můžete to chápat jako deklarativní popis vstupu.
Jenže pak to nebude splňovat váš požadavekRegulární výraz by se psal jako regulární výraz (text) ve všech konfigurácích – stejně jako desítku bychom psali jako
10
a ne třeba X
nebo 1010
.
Regulární výraz by se psal jako regulární výraz (text) ve všech konfigurácíchA jak bude probíhat kontrola syntaxe a validace pro regulární výrazy? Případně, jak to bude probíhat pro aritmetické výrazy? Případně pro nějaké jiné výrazy?
Zhruba stejně, jako třeba kontrola doménových jmen, IP adres nebo názvů měst – syntaxi domény zkontrolovat můžeš, odhalíš nesmysly typu example..com
, nebo example,com
, ale už nezjistíš, zda daná doména skutečně existuje (musel bys použít DNS), v případě IP adresy taky nezkontroluješ, zda takový stroj je připojený k síti a je dostupný (musel bys použít ping), v případě města můžeš odmítnout netisknutelné znaky, konce řádků, nebo vyžadovat nějakou omezenou abecedu (např. tam nebudeš chtít ty ikony/symboly, kterých je v unicodu plno, ale jen písmena/čísla různých národních abeced), ale opět nezkontroluješ, jestli existuje město Praaha
(musel bys mít databázi všech měst).
Že se nedá zvalidovat úplně všechno (alespoň ve fázi parsování/načítání konfigurace) je zřejmé – ale to přece neznamená, že bychom měli rezignovat na validaci toho, co se zkontrolovat dá a celkem snadno (strojově čitelně deklarovat a pak automaticky zkontrolovat).
ale to přece neznamená, že bychom měli rezignovat na validaci toho, co se zkontrolovat dá a celkem snadno (strojově čitelně deklarovat a pak automaticky zkontrolovat).S tím souhlasím, a proto jsem se ptal, jak se zařídí validace regulárních výrazů, aritmetických výrazů apod. To je přeci něco, co jde strojově čitelně deklarovat a pak automaticky zkontrolovat, ne?
Zvalidovat regulární výraz je snadné, stačí ho zkompilovat. Akorát je potíž v tom, že existuje víc odrůd a to, co bude fungovat v Perlu, nemusí fungovat v Javě, grepu nebo naopak. S aritmetickými výrazy to bude ještě horší. XSDčko můžeš doplnit Schematronem a přidat další pravidla – a v nich by se dala zavolat funkce, která zkompiluje regulární nebo aritmetický výraz v určitém dialektu. Jazyk pro popis schémat by taky mohl umožnit zapsat libovolnou gramatiku a tou pak umožnit validovat textové uzly. Případně by mohl podporovat vkládání skriptů (třeba ECMAScript) a pomocí nich provádět libovolné kontroly (takže bys v tom skriptovacím jazyce mohl napsat třeba parser perlovských regulárních výrazů, matematických výrazů pro Octave nebo SQL dotazů pro PostgreSQL). Ale tohle je typické dilema mezi složitostí a funkcionalitou.
To že niekto neprepíše nápovedu vedľa voľby ktorú zmenil v programe, určite to spraví v dokumentácií.
Ono to nepřepíše, protože ani nemůže – ta nápověda se nachází v komentáři v konfiguráku, který se nakopíroval na tvůj disk při instalaci verze 0.8 a ve verzi 0.9 tam přidali nové možnosti – třeba místo true
/false
tam jde napsat i inherit
– ale to ty nevíš, protože do těch tvých komentářů upgradovací proces nezasahuje – ale může upravit XSDčko někde v /usr/share
…
To čo by si uvítal sa dá realizovať aj v texťáku a dlho tomu aj tak bolo, teda neexistuje nejaké zjednotenie.
Bohužel neexistuje – už třeba taková banalita jako komentáře. Obvykle jsou uvozené # (nechme teď stranou, že někde se používá //, /*/, --, ; atd.), ale někde ten komentovací # musí být na začátku řádku a někde můžeš zakomentovat i něco od prostředka – což je celkem šikovné, ale na druhou stranu: co když budeš chtít zapsat skutečný # …
Pri upgrade sa ťa spýta, či chceš config v /usr/share...
V /usr/share
právě žádné konfiguráky nejsou, tam jsou statické soubory, součásti programu, které nemáš co měnit – např. ty XML schémata – takže je to prostě přepíše a na nic se tě to ptát nemusí.
Kernelu to stačí, tak to musí stačiť každémuMáš väčší projekt?
Jádro je sice rozsáhlé, ale ty volby jsou dost jednoduché – obvykle jen zapnout/vypnout případně vybrat jednu z několika hodnot. V aplikacích bývají o dost složitější struktury, hierarchie, třeba nastavení e-mailového klienta: několik účtů, účty různých typů, každý účet může mít víc identit (jméno, příjmení, e-mail, patička atd.), můžou tam být vazby na jiné části konfigurace (např. pomocí kterého SMTP účtu se má odesílat), seznam odebíraných složek…
Nepchaj mriežky do konfiguráku ako hodnoty a máš po starostiach
Ano, většina problémů v IT se dá vyřešit jednoduše – přestat používat počítač.
Nielen IceWM tu má defaultný konfig /usr/share/icewm/, to isté samozrejme platí aj pre /etc/...
Snažím se tu vysvětlit, že v XML je možné oddělit data (vlastní konfigurák) a jejich popis (schéma – XSD, DTD…), který obsahuje jak dokumentaci, tak strukturu, datové typy… Data dáš do /etc
, popis do /usr/share
a díky tomu si uživatel může upravovat a verzovat data a při upgradu mu pošleš aktuální popis (přepíše se v /usr/share
) a díky tomu má uživatel nejnovější dokumentaci a má k dispozici nové volby/položky, aniž by musel něco někam kopírovat nebo dělat nějaké diff
y.
Hierarchia sa dá veľmi dobre vyriešiť adresárovou štruktúrov konfigurákov.
To je jedna z možností, v podstatě využiješ souborový systém jako formát. Pak stačí adresáře a v nich jeden nebo víc souborů s plochou strukturou klíč=hodnota nebo klíčem bude název souboru a hodnotou jeho obsah. Akorát tu není standardní způsob, jak to zvalidovat nebo jak by ti editor napovídal možnosti, ale dalo by se to vymyslet… Vazby mezi položkami se dají udělat pomocí symbolických odkazů. A je to i docela unixové: „všechno je soubor“
vo väčšine prípadov je vhodný plaintext
A co je to vlastně „plaintext“? Takové INI soubory nebo běžné konfiguráky, které mají nějakou syntaxi1 nejsou o nic víc „plaintext“ než XML, které má taky nějakou syntaxi.
[1] přiřazování = nebo :, struktury pomocí {}, odsazování, uvozovky nebo apostrofy pro zápis textových hodnot, zpětné lomítko pro escapování, křížek nebo // pro komentáře atd. atd.
Vetsinu tvych pozadavku splnuji napriklad Windowsi registry.
Mají schéma? Windows nepoužívám, ale když jsem to viděl posledně, tak tam bylo možné nacpat cokoli (vytvořit si další atributy a přihrádky nebo jak se to jmenuje). Dále mi pak vadí ta centralizace a nemožnost pořádného verzování. Oproti XML mi to přijde hodně slabé a nenabízí to snad žádné výhody.
Otazka je jestli je potreba na kazdyho vrabce potreba ten nejvetsi kanon.
Souhlas. Někdy by stačil třeba javovský properties soubor, někdy INI případně YAML… Ale zase když se jednou naučíš obsluhovat kanón, je najednou jednodušší ho používat na všechno, než používat třeba praky, které jsou jednoduché, ale každý se obsluhuje jinak a má svoje specifika (což je ve výsledku složitější, než všechno řešit tím kanónem).
cast konfigurace skonci v nejaky databazi
To je celkem rozumné řešení, relační databáze – takové databáze mívají schéma, můžeš v nich dělat různé struktury (formou propojených tabulek), máš tam datové typy, API… Jedna z mála nevýhod bude, že se to špatně verzuje – obvykle je to binární soubor (ale dají se verzovat třeba SQL dumpy)
XSD a DTD je hezka vec ale kdo to doopravdy pouziva?
Řada aplikací je asi tolerantní (až moc) a naběhnou i když konfigurák neodpovídá schématu, takže validaci si musí udělat uživatel ručně. Nicméně vytvořit schéma (ať už v jakémkoli formátu), když definuji nějaký XML formát, je samozřejmost (může chybět u nějakého prototypu nebo alfa verze, kde se ještě neví, jak to všechno bude vypadat).
snad nejsilenejsi konfigurak (z pohledu parseru) ma bindC-style bloky mi zrovna náramně vyhovují a konfigurák bindu mi tím pádem přijde jako jeden z nejsrozumitelnějších.
Na XML je sileny to, ze do nej klidne muzes napsat nejaky tagy, ktery bude aplikace vesele ignorovat.To platí u všech formátů stejně.
To platí u všech formátů stejně.
Stejně ne – spíš bych řekl, že se to bude dost lišit. Parser může fungovat tak, že načte konfigurák do nějaké hashmapy a z ní si to pak zbytek programu podle potřeby tahá (tudíž přebytečné položky jsou ignorovány). Ale taky to může fungovat tak, že parser prochází konfigurák a na základě každé jeho položky volá nějakou metodu a když narazí na neočekávanou položku, vyhodí výjimku nebo vypíše varování. Konfigurák taky může mít nějak hezky popsanou gramatiku a nepodporované volby nebudou této gramatice odpovídat a nepůjde to vůbec načíst. A nebo to může být XML parser a ty mu prostě jen nastavíš cestu ke schématu a řekneš, aby už během parsování validoval. Chybnou konfiguraci to opět (jako u té gramatiky) odmítne načíst a opět ti to vypíše, na kterém řádku a na kterém slovu/znaku máš chybu.
Vymýšlíš si neexistující problém.Smím se zeptat jaký? A pokud možno zkus reagovat výše na santiaga, který se k rozdílu mezi stavem a konfigurací přímo vyjadřoval, narozdíl ode mě.
Já ale požadavek chápu tak, že by měly zmizet i věci jako /etc/NetworkManager/NetworkManager.confJá tohle chápu jako vymyšlený důvod k nadávání, ten ticket se nejmenoval "úplné zrušení /etc". Santiago to popsal výborně a není moc co k tomu dodat. V
NetworkManager.conf
nejsou žádné stavové informace nebo konfigurace kterou by bylo nutné často měnit.
Výchozí konfigurace v /usr/lib je imo pro většinu balíků overkill a zbytečná práce ale ničemu to neškodí – gentoo podobným způsobem slučuje konfiguraci v portage se systémovou. Ale třetí bod opravdu implikuje úplný přesun všeho co není potřeba k nabootování do /var/lib. Jsou tam i rozumně znějící věci (balíčkovací systém se opravdu nemusí srát do /boot) a nějaké bezúčelné přestavování nábytku a mezi tím jeden detailíček podle kterého mi svitlo – spojování bin a sbin. Ano, modří už vědí – je pod tím podepsán Kay Sievers. Takže asi tak.
- Should only be used for components required to bring up a running system or for legacy components that cannot be modified
- Default configuration files deployed in rpm packages should live in /usr/lib/<id> or be compiled in.
- Host specific configuration and data files should live in /var/lib/<id>.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.