Byly zpracovány a na YouTube zveřejněny videozáznamy z konference LinuxDays 2025.
Na konferenci LinuxDays 2025 byl oficiálně představen nový router Turris Omnia NG.
Přímý přenos (YouTube) z konference LinuxDays 2025, jež probíhá tento víkend v Praze v prostorách FIT ČVUT. Na programu je spousta zajímavých přednášek.
V únoru loňského roku Úřad pro ochranu osobních údajů pravomocně uložil společnosti Avast Software pokutu 351 mil. Kč za porušení GDPR. Městský soud v Praze tuto pokutu na úterním jednání zrušil. Potvrdil ale, že společnost Avast porušila zákon, když skrze svůj zdarma dostupný antivirový program sledovala, které weby jeho uživatelé navštěvují, a tyto informace předávala dceřiné společnosti Jumpshot. Úřad pro ochranu osobních údajů
… více »Google Chrome 141 byl prohlášen za stabilní. Nejnovější stabilní verze 141.0.7390.54 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 21 bezpečnostních chyb. Za nejvážnější z nich (Heap buffer overflow in WebGPU) bylo vyplaceno 25 000 dolarů. Vylepšeny byly také nástroje pro vývojáře.
eDoklady mají kvůli vysoké zátěži technické potíže. Ministerstvo vnitra doporučuje vzít si sebou klasický občanský průkaz nebo pas.
Novým prezidentem Free Software Foundation (FSF) se stal Ian Kelling.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za září (YouTube).
Vyšla kniha Počítačové programy a autorské právo. Podle internetových stránek nakladatelství je v knize "Významný prostor věnován otevřenému a svobodnému softwaru, jeho licencím, důsledkům jejich porušení a rizikům „nakažení“ proprietárního kódu režimem open source."
Red Hat řeší bezpečnostní incident, při kterém došlo k neoprávněnému přístupu do GitLab instance používané svým konzultačním týmem.
Aktuální vývojová verze jádra je 3.9-rc5 vydaná 31. března. Linus k ní řekl: Z řady nevyčnívá nic zvláštního. Aktualizace Exynos DRM, aktualizace ovladače IBM Ram San jsou trochu větší, aktualizace l2tp... Zbytek jsou malé patche rozprostřené napříč jádrem. Většinou jde o ovladače (block, net, media, tty, usb), síťování a nějaké aktualizace systémů souborů (btrfs, nfs). Pak nějaké aktualizace architektur (x86, arc). Postupně se to uklidňuje a k vydání verze 3.9 za pár týdnů se blížíme podle plánu.
Stabilní aktualizace: verze 3.8.5, 3.4.38 a 3.0.71 vyšly 28. března s obvyklou várkou oprav. 28. března vyšla i verze 3.5.7.9. Na 4. dubna se chysta jiná velká dávka oprav v podobě 3.8.6, 3.4.39 a 3.0.72.
Bylo by pěkné vyhnout se kroku feature-removal.txt (odstranění-funkcí.txt). Když jsem kurzorem vybral tento soubor, tak jsem jednou zaslechl jakési bolestné nářky. Místo otevření tohoto souboru jsem pak okamžitě zavřel celý adresář. Nikdy předtím jsem o tom nikomu neřekl, tohle je poprvé. Také jsem se doslechl, že do tohoto souboru někdo přidal položku, že se má soubor odstranit? Tohle je nějaká černá magie.
< systém je v jediném stavu: každý vidí kočka = naživu > vlož_kočku_do_krabice(kočka); < systém je ve dvojím stavu: nová volání vidí kočka == mrtvá, ale současná volání vidí kočka == naživu > otevři_krabici(); < systém je opět v jediném stavu : všichni vidí kočka = mrtvá > pohřeb(kočka);
-- Steven Rostedt vysvětlující RCU
Jménem projektu ZFS-on-Linux Brian Behlendorf ohlásil dostupnost verze 0.6.1 tohoto systému souborů s původem na Solarisu. To, že je ZoL používáno skutečnými uživateli už více než dva roky, nás přesvědčilo, že je ZoL vhodné pro rozsáhlé nasazení od desktopů po superpočítače. Domovská stránka projektu nabízí binární moduly pro celou řadu distribucí. (Pro postoj tohoto projektu k licenčním problémům čtěte toto FAQ).
Dave Jones pokračuje ve zkoušení svého Trinity fuzz testeru a daří se mu v jaderném kódu odhalovat zajímavé chyby. Nedávno se mu povedlo odhalit starý bug v implementaci síťových jmenných prostorů.
Diskuze o chybě začala, když Dave na mailing list linux-kernel zaslal zprávu ukazující deadlock v kódu VFS. Toto hlášení dohnalo Ala Vira k úvahám, jak se instanci Trinity mohlo podařit viset na dvou zámcích (což je situace, která by neměla nikdy nastat), což bylo vidět na výstupu lockdep (klíčové části jsou zvýrazněné):
Showing all locks held in the system: 4 locks on stack by trinity-child2/7669: #0: blocked: (sb_writers#4){.+.+.+}, instance: ffff8801292d17d8, at: [<ffffffff811df134>] mnt_want_write+0x24/0x50 #1: held: (&type->s_vfs_rename_key){+.+.+.}, instance: ffff8801292d1928, at: [<ffffffff811c6f5e>] lock_rename+0x3e/0x120 #2: held: (&type->i_mutex_dir_key#2/1){+.+.+.}, instance: ffff880110b3a858, at: [<ffffffff811c701e>] lock_rename+0xfe/0x120 #3: blocked: (&type->i_mutex_dir_key#2/2){+.+.+.}, instance: ffff880110b3a858, at: [<ffffffff811c7034>] lock_rename+0x114/0x120
Al také poznamenal, že výstup ukazuje, že inode adresáře byl v inode cache mapován pomocí dvou různých dentries, protože lockdep ukázal dva zámky i_mutex_dir_key na stejné adrese. Dentry (directory entry; položka adresáře) je datová struktura představující název souboru v jaderné cachi adresářových položek (dcache); krátký přehled o dentries a dcache lze najít v tomto článku. Jak bude všem brzy jasné, nikdy by se nemělo přihodit, že je inode adresáře mapována v dcache dvakrát.
Některé návrhy se týkaly přidání vhodných ladících výstupů do jaderné funkce lock_rename(), aby bylo možné problém dále analyzovat. Hlavně kvůli držení dvou zámků nad stejnou adresou inodu chtěl Linus vidět názvy souborů tohoto inode a Ala zajímal název systému souborů, kde se tyto inody nacházejí.
Další spuštění Trinity s dodatečným ladícím výstupem odhalilo, že se tyto zámky objevují u různých položek ve stromu /proc. V ten moment Linus upřesnil, že se dotyčné položky nacházejí jen v /proc/net, ale stejně jako Al byl zmatený z toho, jak se něco takového může dít.
Zde se sluší vysvětlit některé okolnosti. Bylo nebylo, /proc/net existovalo jen jako jediný adresář. Jenže s vynálezem síťových jmenných prostorů jde nyní o symbolický odkaz do adresáře /proc/self/net; jinými slovy, každý proces teď má svůj vlastní pohled na síťové informace pod /proc specifický pro síťový jmenný prostor.
S ladícím výstupem se rychle podařilo pochopit souvislosti. Dave si uvědomil, že začal selhání Trinity vídat po povolení síťových jmenných prostorů po nedávné opravě chyby od Erica Biedermana. Al se blíže podíval na některé podadresáře v adresáři /proc/PID/net a odhalil neveselou skutečnost:
al <at> duke:~/linux/trees/vfs$ ls -lid /proc/{1,2}/net/stat 4026531842 dr-xr-xr-x 2 root root 0 Mar 21 19:33 /proc/1/net/stat 4026531842 dr-xr-xr-x 2 root root 0 Mar 21 19:33 /proc/2/net/stat
Toto odhalení vedlo k malému výbuchu:
NĚMŮŽEME MÍT NĚKOLIK DENTRIES NA STEJNÉM INODE ADRESÁŘE. [...] Ach jo... Jmenné prostory – mělo se zůstat jen u jediného...
Ti z vás, kteří máte dobrou paměť, nebo jste u nedávného článku na LWN dávali pozor, se možná usmíváte kvůli tomu, že od počátku a mnoho let poté byl jen jediný typ jmenných prostorů – jmenné prostory připojovacích bodů, které implementoval nějaký Al Viro.
Srandičky stranou, byl to právě Al, kdo odhalil podstatu problému. Výpis adresáře, který můžete vidět výše, ukazuje dvě adresářové položky vedoucí k jedinému inode. Obecně řečeno všechny procesy sdílející jediný síťový jmenný prostor mají své /proc/PID/net implementováno jako pevný odkaz na stejný (virtuální) soubor v /proc.
Implementace příslušných položek v /proc jako pevné odkazy na stejný inode je při implementaci jmenných prostorů technika používaná na různých místech. Povolování více pevných odkazů na jediný soubor je samozřejmě běžná funkce unixových systémů. Až na jeden případ: Linux, stejně jako ostatní unixové systémy, zakazuje vícero pevných odkazů na adresář. Spolehlivost různého kódu v jádře i mimo něj stojí na tomto předpokladu. Patch v Linuxu 2.6.25 začleněný v počátcích implementace síťových jmenných prostorů tento předpoklad pro adresáře pod /proc/PID/net potají rozbil.
Jakmile se podařilo najít příčinu problému, museli vývojáři vymyslet vhodnou opravu. V tento moment se muselo k věci přistupovat pragmaticky, protože cílem bylo opravit nejen budoucí jádra, ale i ta minulá. Jinými slovy by idelání opravou byl patch, který by šel aplikovat nejen na současná jádra, ale i na starší stabilní řady. To vedlo Linuse ke spekulacím, zda nepovolit výjimku v jinak přísném pravidlu, že na adresáře nemůže být více pevných odkazů. Protože jsou tyto zámky umisťovány na úrovni inode, proč nezměnit kontrolu v lock_rename() tak, aby se ověřovalo, zda se nepracuje se stejnými inody místo dentries?
Al ale rychle upozornil, že takto by se sice odstranil tento konkrétní deadlock, ale ostatní problémy by zůstaly nedotčeny. Jaderný kód pracující s těmito zámky závisí na topologickém řazení na bázi hierarchických vztahů mezi položkami v dcache; přítomnost více adresářových položek odkazujících na stejný inode činí toto řazení nespolehlivým.
Al pak popsal, co by považoval za úplné a řádné řešení: vytvoření souborů /proc/PID/net jako symbolické odkazy na adresáře konkrétních jmenných prostorů v podobě /proc/nents-ID/net, kde netns-ID je identifikátorem daného jmenného prostoru. Alternativou by bylo zachovat stávající stromy /proc/PID/net, akorát by podadresáře byly vytvořeny jako duplicitní podstromy místo odkazování na jediný adresářový podstrom. Al si ale nebyl jistý, zda by toto šlo implementovat jako backportovatelný patch.
Mezitím přišel Linus s jiným návrhem. proc_get_inode(), jaderná funkce pro alokaci inodů v systému souborů /proc, má tuto podobu:
struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) { struct inode *inode = iget_locked(sb, de->low_ino); if (inode && (inode->i_state & I_NEW)) { ... /* Populate fields in newly allocated cache entry pointed to by 'inode' */ ... unlock_new_inode(inode); } else pde_put(de); return inode; }
Funkce iget_locked() prohledává jadernou inode cache, aby našla inode, jehož číslo odpovídá číslu ve struktuře dentry de. Vrátí buď ukazatel na existující položku, nebo novou neinicializovanou položku v cache v případě, že tam ještě taková není. Funkce proc_get_inode() pak naplní pole nově vytvořené položky v inode cache pomocí údajů z dentry.
Problém s deadlockem je důsledkem toho, že kvůli mapování více dentries na jediný inode může být vícero zámků umístěno k té samé položce v inode cache. Deadlockům by se mohlo zabránit tím, že by se zabraňovalo umisťování více zámků na položky inode vracené z cache. Jak Linus poznamenal, v případě /proc není skutečně nutné hledat existující položku v cache, neboť soubory v /proc neexistují na žádném fyzickém disku. Místo toho by proc_get_inode() mohlo vždy vytvořit novou položku cache pomocí new_inode_pseudo() a naplnit ji. Protože by vždy docházelo k vytváření nové položky, nebyla by viditelná jiným procesům a nemohlo by tedy docházet ke konfliktům zámků nebo k deadlockům. Jinými slovy by logika v proc_get_inode() mohla být upravena takto:
struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) { struct inode *inode = new_inode_pseudo(sb); if (inode) { inode->i_ino = de->low_ino; ... /* Populate fields in newly allocated cache entry pointed to by 'inode' */ ... } else pde_put(de); return inode; }
Zde je vhodné upozornit na existenci dvou různých schémat alokace pro inody pod /proc: první schéma se obvykle používá pro inody pod adresáři /proc/PID a to druhé ve zbytku /proc. Linusův patch ovlivňuje jen alokace inodů pro položky ve druhé skupině. Z historických důvodů, kdy /proc/net bylo přesunuto do /proc/PID/net, jsou inody pod /proc/PID/net alokovány stejně jako inody mimo /proc/PID a tento patch proto má dopad i na ně.
V komentáři u následného commitu Linus řekl, že by patch mohl být poladěn tak, aby se nové chování týkalo jen položek adresářů a ne tedy všeho v /proc. V zájmu zachování jednoduchosti to tak ale uděláno nebylo.
Důsledkem Linusova patche je zabránění vzniku více zámků (a tedy deadlocků) na stejném inodu. Al souhlasil, že tato změna by z hlediska správnosti neměla představovat problém. Na druhou stranu má tato změna za důsledek odstranění předností cachování inodů v /proc mimo /proc/PID. Al se zabýval výkonnostními dopady této změny. Nahodilé testování ukázalo. že přednosti cachování inodů v /proc jsou tak jako tak velmi malé. Dave navíc oznámil, že po aplikaci opravy už běh Trinity deadlockem nekončil.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej: