Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.
Před 25 lety zaplavil celý svět virus ILOVEYOU. Virus se šířil e-mailem, jenž nesl přílohu s názvem I Love You. Příjemci, zvědavému, kdo se do něj zamiloval, pak program spuštěný otevřením přílohy načetl z adresáře e-mailové adresy a na ně pak „milostný vzkaz“ poslal dál. Škody vznikaly jak zahlcením e-mailových serverů, tak i druhou činností viru, kterou bylo přemazání souborů uložených v napadeném počítači.
Byla vydána nová major verze 5.0.0 svobodného multiplatformního nástroje BleachBit (GitHub, Wikipedie) určeného především k efektivnímu čištění disku od nepotřebných souborů.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za duben (YouTube).
Provozovatel čínské sociální sítě TikTok dostal v Evropské unii pokutu 530 milionů eur (13,2 miliardy Kč) za nedostatky při ochraně osobních údajů. Ve svém oznámení to dnes uvedla irská Komise pro ochranu údajů (DPC), která jedná jménem EU. Zároveň TikToku nařídila, že pokud správu dat neuvede do šesti měsíců do souladu s požadavky, musí přestat posílat data o unijních uživatelích do Číny. TikTok uvedl, že se proti rozhodnutí odvolá.
Společnost JetBrains uvolnila Mellum, tj. svůj velký jazykový model (LLM) pro vývojáře, jako open source. Mellum podporuje programovací jazyky Java, Kotlin, Python, Go, PHP, C, C++, C#, JavaScript, TypeScript, CSS, HTML, Rust a Ruby.
Vývojáři Kali Linuxu upozorňují na nový klíč pro podepisování balíčků. K původnímu klíči ztratili přístup.
V březnu loňského roku přestal být Redis svobodný. Společnost Redis Labs jej přelicencovala z licence BSD na nesvobodné licence Redis Source Available License (RSALv2) a Server Side Public License (SSPLv1). Hned o pár dní později vznikly svobodné forky Redisu s názvy Valkey a Redict. Dnes bylo oznámeno, že Redis je opět svobodný. S nejnovější verzí 8 je k dispozici také pod licencí AGPLv3.
Oficiální ceny Raspberry Pi Compute Modulů 4 klesly o 5 dolarů (4 GB varianty), respektive o 10 dolarů (8 GB varianty).
Byla vydána beta verze openSUSE Leap 16. Ve výchozím nastavení s novým instalátorem Agama.
Současné vývojové jádro 2.6 je stále 2.6.29-rc5 vydané 13. února. Obsahuje nějaké aktualizace ovladačů a spoustu oprav. Tak hurá a pořádně ho otestujte, protože já hodlám strávit třídenní víkend opilý na pláži. Protože někdo to udělat musí. Detaily vizte v kompletním changelogu.
Současné stabilní jádro 2.6 je 2.6.28.6 vydané (společně s 2.6.27.18) 17. února. Obě obsahují dlouhý seznam oprav různých problémů.
Před nimi byly 12. února vydány 2.6.28.5 a 2.6.27.16. 2.6.27.17 bylo urychleně vydáno těsně poté s opravou problému "okamžitého oops" na některých laptopech.
Článek o probouzecích zámcích z minulého týdne popsal rozhraní pro blokování uspávání, které pochází z projektu Android, a nepřátelskou reakci, kterou toto rozhraní obdrželo. Od té doby diskuze pokračovala ve dvou oddělených vláknech. Jaderní vývojáři, stejně jako všichni technici, řeší problémy, takže diskuze se rychle přesunula od kritiky probouzecích zámků k hledání akceptovatelného řešení. V době psaní tohoto článku toto řešení neexistuje, ale o problému jsme se dozvěděli nějaké zajímavé věci.
Donutit správu napájení fungovat v Linuxu byl dlouhý, vleklý proces, který z větší části znamenal opravovat ovladače zařízení jeden po druhém. Mnoho práce bylo věnováno tomu, aby se zajistilo, že CPU zůstane v klidovém stavu tak dlouho, jak je to jen možné. Jedním z důvodů, proč vývojáři jádra považují rozhraní probouzecích zámků za tak nepříjemné, je to, že vývojáři Androidu zvolili ke správě napájení jiný přístup. Místo toho, aby se snažili neustále minimalizovat spotřebu energie, se kód Androidu snaží zařízení uspat, kdykoliv je to možné. K tomuto přístupu je několik důvodů, k jednomu z nich se dostaneme níže.
Začneme nicméně velmi jednoduchým důvodem, proč Android používá řešení "uspat celý svět": protože může. Hardware, na kterém Android běží, byl podobně jako mnoho embedded systémů (a na rozdíl od většiny systémů založených na x86) navržen tak, aby se uspával a probouzel rychle. Vývojáři Androidu proto nevidí důvod, proč to dělat jinak. To ale vede ke komentářům, jako je tento od Matthewa Garretta:
Matthew také poznamenává, že je možné vyřešit problém správy napájení bez úplného uspání systému; jako příklad úspěšné implementace dává tablety Nokia, které při správě napájení používají jemnější dělení.
Zdá se, že je jasné, že přístup s kompletním uspáváním nezmizí; některý hardware je navržen tak, aby takto fungoval nejlépe, takže Linux potřebuje pro tento režim práce podporu. Proto se mluvilo o tom, jak probouzecí zámky navrhnout takovým způsobem, který lépe zapadne do jádra jako celku. Na straně jádra byly nějaké dohady o tom, jestli je vůbec mechanismus probouzecích zámků zapotřebí; ovladače již teď mohou zabránit jádru v pokusu uspat systém. Nicméně je opodstatněné tvrdit, že je lepší, když bude jádro vědět, že se nemůže uspat, aniž by se kvůli tomu muselo dotazovat všech ovladačů.
Jedno řešení, které navrhl Matthew, by byl jednoduchý pár funkcí: inhibit_suspend() a uninhibit_suspend(). Na produkčních systémech by to manipulovalo s atomickým čítačem; když by čítač obsahoval nulu, systém by bylo možné uspat. Tyto funkce by mohly přebírat strukturu device jako parametr; ladící verze by potom mohly zjišťovat, které zařízení v danou dobu blokuje uspání. Ekvivalent v uživatelském souboru by mohl být soubor jako /dev/inhibit_suspend; dokud bude mít alespoň jeden proces tento soubor otevřený, systém bude dál běžet. Shrnuto to vypadá jako jednoduché API, které nemá mnoho z problémů, jež jsou k vidění v kódu probouzecích zámků.
Na straně Androidu bylo několik stížností, ale nejproblematičtějším bodem jsou, zdá se, časové limity. API probouzecích zámků implementuje automatický časový limit, který způsobí, že se "zámek" po zadaném čase uvolní. Pro existenci těchto časových limitů je několik důvodů:
Vzhledem k tomu, že ne všechny ovladače používají API probouzecích zámků, jsou časové limity zapotřebí k tomu, aby se zabránilo v uspání systému, když tyto ovladače běží. Navrženým řešením této záležitosti je změnit všechny ovladače, které potřebují, aby systém běžel. Jakmile bude do jádra začleněno akceptovatelné API, ovladače je možné změnit podle potřeby.
Pokud proces držící probouzecí zámek neočekávaně zemře, časový limit udrží systém v provozu do doby, než kód watchdogu tento proces restartuje. Problém je zde v tom, že časové limity do jádra vkládají obnovující politiku a příliš se nestarají o to, jestli je toto fungování správné. Místo toho bylo navrženo, aby byla politika "zabránění uspání" v uživatelském prostoru uzavřena do odděleného démona, který by mohl rozhodovat o tom, jestli držet systém vzhůru.
Aplikace v uživatelském prostoru mohou být špatně napsané a neumožnit uspání systému.
Poslední možnost je také používána jako argument pro přístup ke správě napájení s kompletním uspáváním. I když se špatně chovající aplikace dostane do smyčky a odmítne se ukončit, systém se nakonec stejně uspí, aby šetřil baterii. To je argument, který se mnoha jaderným vývojářům moc nelíbí, protože říkají, že místo programování jádra, aby se chránilo proti špatným programům, by bylo lepší opravit ty programy. Arjan van de Ven upozorňuje na to, že od vzniku PowerTop byla opravena většina problémů v open-source aplikacích.
V tomto prostoru je nicméně těžší všechny tyto problémy ošetřit. Brian Swetland situaci popisuje takto:
Matthew také problém potvrzuje:
Jde o skutečný problém, ale stále není jasné, jestli jsou vhodné pokusy opravit takový problém v jádře - nebo jestli budou tyto pokusy úspěšné. Ben Herrenschmidt nabízí jiné řešení: démona, který by sledoval chování aplikací a varoval uživatele, že se zdá, že se daná aplikace chová špatně. To by aspoň dalo uživateli na srozuměnou, kde problém skutečně spočívá. To ovšem není žádná náhrada za skutečné řešení: spouštění open-source aplikací na telefonu tak, aby mohl špatné chování v případě potřeby opravit uživatel.
Platforma Androidu je nicméně explicitně navržena k tomu, aby podporovala proprietární aplikace. Může se ukázat, že je schopna tyto aplikace přitáhnout tak, jak se to standardnímu linuxovému desktopu nikdy docela nepovedlo. Bude tedy potřeba najít nějaké řešení problému správy paměti u špatně napsaných aplikací. Vývojářům Androidu se jako řešení líbí probouzecí zámky, ale také se zdá, že mají zájem na tom spolupracovat s komunitou na nalezení globálněji akceptovatelného řešení. Jak takové řešení bude vypadat však nebude jasné bez mnoha dalších diskuzí.
Jedna z méně známých funkcí podporovaných kódem jaderné správy paměti je ksize(); když je jí předán ukazatel na objekt alokovaný pomocí kmalloc(), ksize() vrátí velikost tohoto objektu. Tato funkce většinou není zapotřebí; ti, kdo volali kmalloc(), obvykle vědí, co alokovali. Může být ale užitečná v situacích, kdy funkce potřebuje znát velikost objektu a nemá tuto informaci po ruce. Jak se tak stává, ksize() má další potenciální uživatele, ale také jsou zde nějaké nástrahy.
Uživatelé ksize() jsou v hlavní řadě ojedinělí. Do roku 2008 byl hlavním uživatelem kód architektury nommu, o kterém se zjistilo, že používá ksize() v mnoha situacích, kde to není vhodné. Výsledkem bylo pročištění kódu nommu a zrušení exportování funkce ksize() ve snaze zabránit tomu, aby se tato situace opakovala.
Štěstí vydrželo donedávna; jádro 2.6.29-rc5 obsahuje patch crypto kódu, který používá ksize(), aby se ujistil, že jsou ze struktur crypto_tfm zcela vymazána citlivá data předtím, než je struktura vrácena systému. Nepřítomnost exportu ksize() způsobila, že kód selhal, pokud byl přeložen jako modul, takže Kirill Shutemov zaslal patch, který ji exportuje. Tady začala být diskuze zajímavá.
Proti obnovení exportu ksize() se objevil odpor; zdá se, že největším problémem je to, že tuto funkci je snadné použít nesprávně. Volání ksize() je v pořádku jedině tehdy, když se mu předává ukazatel získaný od kmalloc(), ale programátoři jsou často v pokušení používat ho i na jiné typy objektů. Situaci nepomáhá ani fakt, že paměťové alokátory SLAB a SLUB bez problému zafungují, pokud je ksize() předán jakýkoliv slab-alokovaný objekt. Pro SLOB alokátor to ale neplatí. Vysvětlení této situace vedlo ke stížnostem od Andrewa Mortona:
Zatím nebyla vymazána ani jedna z implementací; místo toho se zdá, že SLQB alokátor míří k začlenění do 2.6.30. Nápad omezit přístup ke ksize() se také daleko nedostal; export této funkce byl v 2.6.29-rc5 obnoven. Jádro je koneckonců plné nebezpečných funkcí - taková je povaha jaderného kódu - a není možné bránit se před všemi chybami, které by mohl vývojář jádra udělat. Jak řekl Matt Mackall, jde pouze o další základní chybu:
Existuje i další potenciální důvod, proč ponechat tuto funkci k dispozici: ksize() může ukázat, že má další využití kromě toho, že vývojáři díky ní nemusí sledovat velikost alokovaných objektů. Jedno veřejně známé tajemství o kmalloc() je to, že má tendence alokovat objekty, které jsou větší, než volající požaduje. Rychlý pohled na /proc/slabinfo (se správným paměťovým alokátorem) ukáže mnoho cachí se jmény jako kmalloc-256. Pokaždé, když je voláno kmalloc, se požadovaná velikost zaokrouhluje nahoru k nejbližší velikosti slabu a je vrácen objekt o této velikosti. (Opět - toto platí pro SLAB a SLUB alokátory; SLOB je zvláštní případ.)
Toto zaokrouhlování nahoru vede k jednoduššímu a rychlejšímu alokátoru, ale tyto zisky jsou získány za cenu plýtvání částí paměti. To je jeden z důvodů, proč má smysl vytvořit dedikovaný slab pro často alokované objekty. Je zde ale jedna zajímavá alokace, která musí používat kmalloc() z důvodů DMA kompatibility: alokace SKB (buffer pro paket ze sítě).
SKB má typicky velikost, která odpovídá maximální velikosti přenesených dat pro cílové síťové rozhraní. Ve světě, kterému vládne Ethernet, bývá tato velikost 1500 bytů. Objekt o velikosti 1500 bytů požadovaný od kmalloc() typicky vede na alokaci 2048 bytového kusu paměti; to znamená významné množství vyplýtvané paměti. Síťoví vývojáři nicméně skutečně potřebují, aby SKB buffer nepřekračoval hranice stránky, takže obecně není způsob, jak se tomuto plýtvání vyhnout.
Může ale existovat způsob, jak ho využít. Síťová vrstva příležitostně potřebuje navíc uložit nějaká s paketem spojená data; například se zdá, že IPSec velmi pravděpodobně takovou situaci vytvoří. Síťová vrstva by mohla pro tato data alokovat další paměť, ale také může použít krealloc(), který by rozšířil aktuálně alokovaný buffer, což by ale obojí zpomalilo velmi vyladěný kód síťování. Mnohem hezčí je využít nějaké místo navíc, které se povaluje po okolí. S bufferem od kmalloc() přitom toto místo může být k dispozici. A způsob, jakým to zjistit, je samozřejmě použít ksize(). A to je přesně to, co mají vývojáři síťování v úmyslu.
Ne všichni jsou přesvědčeni, že tento trik stojí za potíže. Někteří mají pocit, že by extra prostor měl být alokován explicitně, pokud bude později zapotřebí. Další by rádi viděli nějaké benchmarky, které ukazují, jaký zisk tato technika přináší ve skutečném světě. Jaderní vývojáři ale většinou ocení hezký trik, takže ksize() bude připraveno, pokud by se tento druh kódu v budoucnosti dostal do hlavní řady.
Projekt realtime preempce je dlouhotrvající snaha poskytnout deterministickou dobu odezvy ve všeobecném jádře. Během posledních pár let byla velká část této práce začleněna do hlavní řady jádra a mnoho výrobců dodává komerční produkty na ní založené. Během posledního roku se nicméně pokrok směrem k začlenění zbytku realtime práce do hlavní řady zpomalil.
11. února se realtime vývojáři Thomas Gleixner a Ingo Molnár znovu objevili s oznámením nového stromu realtime preempce a obnovené snahy o vývoj. Jon Corbet, autor tohoto článku, je požádal, jestli by zodpověděli několik otázek o této práci; jejich odpověď šla hodně za rámec povinností, dočtete se tedy velmi detailní informace o tom, kde strom realtime preempce stojí a co se pravděpodobně stane v blízké budoucnosti.
LWN: Oznámení 2.6.29-rc4-rt1 poznamenává, že se vracíte z rok a půl dlouhé dovolené. Proč jste se RT patchům nevěnovali tak dlouho; celou dobu jste se povalovali na pláži? :)
LWN: Co vás tedy tentokrát přitáhlo zpět k práci na realtime?
LWN: Jak dobře v současnosti funguje realtime kód? Co si myslíte, že jsou největší zbývající záležitosti, kterým je třeba se věnovat?
LWN: Jaké jsou v současnosti vaše myšlenky ohledně začlenění do hlavní řady?
LWN: Thomas mi jednou říkal o schématu, ve kterém by se rtmutexy patchovaly do/z běžícího jádra během bootu, což by distributorům umožnilo dodávat jediné jádro, které by mohlo běžet buď v realtimovém, nebo "normáním" režimu. Je to stále něco, na čem pracujete?
LWN: Kód RT-preempce se zdá být jednou z největších výjimek z pravidla "nejprve do upstreamu", které nabádá k tomu, aby byl kód nejprve začleněn do hlavní řady předtím, než je dodán zákazníkům. Jak to fungovalo v tomto případě? Jsou případy, kdy je dobré dodávat kód mimo hlavní řadu jádro po tak dlouhou dobu?
LWN: Kde je nejlepší počáteční bod pro vývojáře, který by k této snaze chtěl přispět?
git pull \ git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git \ core/kill-the-BKL
Mnohokrát děkuji Thomasovi i Ingovi za to, že si našli čas na (detailní!) zodpovězení tohoto dlouhého seznamu otázek.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
Když už, tak Hlava XXII, ne? Ale v článku je to zmíněno jako ustálený pojem označující nějakou absurdní skutečnost, nikoli jako název knihy, čili tam bych myslel, že si to každý může psát, jak je mu libo.