Prehistorie unixu
Co se dozvíte v článku
Některé věci v našem světě vznikly z nouze, nedopatřením nebo čistě náhodou. Tady to bylo zrovna tak, ale to musíme začít opravdu od začátku. Když pánové Ken Thompson a Dennis Ritchie vytvářeli první unixový operační systém, bylo to na přelomu 60. a 70. let. Začali na počítači PDP-7 a v roce 1971 pak systém portovali na pokročilejší PDP-11.
Tento stroj měl dvě disková úložiště, každé z nich umožňovalo uložit 1,5 MB dat. Operační systém byl pochopitelně uložen na jednom z nich a kořenový souborový systém postupně rostl. Tak se stalo, že na prvním disku začalo docházet místo.
Proto se oba tvůrci rozhodli začít využívat i druhý disk a přemístili na něj uživatelská data. Obsah druhého souborového systému pak připojili do adresáře /usr
jako user, tedy uživatel. Tam založili podadresáře se stejnými názvy, jaké používali na prvním disku: /bin
, /sbin
, /lib
a další. Tam pak pokračovaly další práce na vývoji.
Později ke svému počítači dostali třetí disk a rozhodli se udělat další změnu. Založili adresář /home
, připojili do něj novou kapacitu a přesunuli tam opět uživatelská data. V tu chvíli došlo teprve k oddělení uživatelského prostoru, ve kterém se data nemíchají se spustitelnými programy v operačním systému.
Kam s ním?
Vznikl tím ovšem nový problém: kam budeme dávat nové soubory? Co přijde do původního kořenového disku a co šoupnout do /usr
? Ten už teď sice měl úplně jinou funkci, neobsahoval uživatelská data, ale stále se jmenoval „user“. Byl ale vlastně jakýmsi rozšířeným úložištěm pro operační systém, takže bylo potřeba vymyslet pro něj nějaká pravidla.
Rámec byl celkem jasný a jednoznačný. Systém startuje z hlavního souborového systému a musí být schopen v nějakou chvíli připojit druhý souborový systém do /usr
. Zásadní soubory důležité pro boot tedy nesmějí být v tomto rozšířeném úložišti. Příkaz mount
tam například nesmíte dát, jinak start systému nikdy nedokončíte a skončíte na tom, že se brejle bez brejlí špatně hledají.
Později byla vymýšlena různá umělá pravidla a kritéria, podle kterých sem patří to a jinam zase ono. Neoficiálně se říká, že „nezbytné“ systémové soubory patří na hlavní disk a „zbytek“ na ten druhý do /usr
. Tohle oddělení ale nebylo nikdy striktně dodržováno, takže se postupně rozmělnilo tak, že přestalo dávat jakýkoliv smysl.
Tahle schizofrenie adresářů /bin
a /usr/bin
tedy vznikla před desetiletími jako jakýsi implementační detail a je udržována lidmi, kteří se nikdy nezeptali, proč takovou věc vlastně děláme. Je to klasické schéma, které známe i z mnoha jiných oblastí: něco se naučíme, pokračujeme v tom a nakonec to děláme ze setrvačnosti, přestože svět kolem se změnil a nedává to smysl.
Už to není potřeba
Potřeba odděleného souborového systému pro start operačního systému pominula vlastně dávno předtím, než vznikl Linux. V první řadě vznikl startovací ramdisk (initrd a initramfs), který je načítán do paměti už v raných fázích startu a obsahuje vše potřebné k rozběhu zbytku systému. Nepotřebujeme tedy mít na disku další dočasný souborový systém pro boot.
Příslovečné vidle do rozdělení unixového disku hodily sdílené knihovny a jejich zavádění v polovině 80. let. Všimněte si, že jsme stále daleko před nějakým Linuxem. Koncept sdílených knihoven neumožňuje odděleně udržovat a provozovat obsah adresářů /lib
a /usr/bin
. Jejich obsah musí být synchronní, jinak to nebude fungovat. Před zavedením sdílených knihoven to problém nebyl, protože všechny binárky byly sestaveny staticky.
Samozřejmě také narostly disky, takže původní problém s místem také pominul. V 90. letech jsme se pohybovali ve stovkách megabajtů, na přelomu tisíciletí v gigabajtech a dnes v terabajtech. Dnešní unixový operační systém zabírá zlomek kapacity jednoho disku a mnohem více místa potřebují uživatelská data. Oddělit část systému na jiný disk tedy už nepotřebujeme.
Další pravidla
V průběhu této spletité historie vznikl Linux, který rozdělení souborového systému jednoduše převzal a pokračoval v něm. Protože tak se to přece vždycky dělalo. Nadto pak vznikl Filesystem Hierarchy Standard, který celý stav formalizoval a tím vlastně ještě pevněji ukotvil.
Ovšem ještě tu máme jednotlivé distribuce, tedy konkrétní operační systémy vyvíjené konkrétními skupinami lidí. Ty si k již stanoveným pravidlům přidávají svá vlastní, takže celá věc se stává ještě složitější. Například obsah adresáře /tmp
se při rebootu maže, ale /usr/tmp
už ne. Některé distribuce ale /usr/tmp
vůbec nemají a některé jej mají jako link do /var/tmp
. Snaží se totiž dodržovat jiné pravidlo, že adresář /usr
je určen ke čtení, kdežto /var
je naopak silně zapisovací.
Pak vás může napadnout, že i samotné /
je vlastně jen ke čtení. Tedy až na výjimku v podobě /etc
, takže z byrokratického hlediska by vlastně dávalo smysl nalinkovat /etc
do /var
. Takhle bychom mohli pokračovat donekonečna a vršit další divoká pravidla komplikující provoz. V praxi k tomu ale není důvod, podstatné je si uvědomit, že původní rozdělování světa vzniklo jen proto, že někomu kdysi došlo místo na disku.
Kompatibilnější se zbytkem světa
Linuxové distribuce už před časem začaly se sjednocujícím procesem. Cílem je zbavit se samostatného obsahu v adresářích /bin
, /sbin
, /lib
a /lib64
a všechno sjednotit v /usr
. Odpadne tím jednak spousta umělých pravidel, ale také se linuxové distribuce stanou kompatibilnějšími se zbytkem světa.
Skripty a programy napsané pro jiné unixy nebude potřeba upravovat pro specifické cesty v té či oné linuxové distribuci. Cesty /usr/bin
a /bin
si budou rovny a nebude třeba řešit, které soubory najdeme ve které z nich.
Lépe na tom bude i kompatibilita distribucí mezi sebou. Většina linuxového softwaru je sestavována pomocí GNU autoconf/automake z GNU autotools, které neřeší rozdělení /usr
specifické pro Linux. Zachování rozdělení /usr
vyžaduje netriviální ošetření specifické pro daný projekt v sestavovacím systému a v balíčcích každé distribuce. Se sloučením /usr
se tato práce stává zbytečnou a portování balíčků na Linux bude jednodušší.
Možná vás napadlo, že by bylo logičtější se naopak zbavit adresáře /usr
, který vznikl později, a zachovat jen původní a prosté /bin
a jeho kolegy v kořenovém adresáři. Problém tohoto řešení je opět daný historickým zvykem. Řada současných build systémů je rozbitá a nepočítá s možností, že by prefix pro cestu k instalaci byl nastaven jednoduše na /
či prázdný řetězec.
Někde to jde rychle, jinde pomaleji
Tohle celé povídání je vlastně jen takovou historickou zajímavostí s přesahem do současnosti. Vlastně je to celkem banální technická změna, která spočívá s přehozením nějakých souborů mezi adresáři. Distribuce s tím neměly větší problém, prostě se věci postupně změnily. Většina uživatelů si asi ničeho nevšimla, protože jim všechno funguje jako dřív.
Téma je to pořád ještě proto, že ne u všech distribucí proběhla změna hladce. Například Debian s tím stále bojuje a ani připravovaná verze 12 s kódovým jménem Bookworm nemá sloučení adresářů hotové. Některé distribuce se rozhodly vše provést naráz, během času mezi vydáními. Jedna verze to měla postaru a další už adresáře sloučila. Debian je opatrnější a rozložil potřebné kroky přes několik verzí.
Pokud se pozorně podíváte na čerstvou instalaci Debianu 11 Bullseye nebo připravovanou verzi 12 „Bookworm“, zjistíte, že adresáře jako /bin
a /lib
existují pouze jako symbolické odkazy na ekvivalentní adresáře v /usr
. Zdá se tedy, že proces slučování je dokončen a není co dál řešit. Bohužel jsou tu nejrůznější ostré hrany, které je třeba ohladit.
Většina problémů je způsobena tím, že velká část přechodu byla provedena mimo dpkg
. To má za následek situaci, kdy správce balíčků nemá plnou představu o struktuře souborového systému. Symbolické odkazy v nejvyšším patře struktury souborového systému tak vytvářejí vícenásobné cesty k souborům, kterým balíčkovací systém nerozumí. Pokud tak dojde k přejmenování a přesunu souborů mezi balíčky, může se stát, že balíčkovací systém odstraní soubory patřící jinému balíku. To povede k poškození systému.
Podobné problémy jsou důvodem, proč dpkg vypisuje v systémech se sloučeným /usr
ošklivá varování. Celý přechod zahrnuje přesun souborů do jejich nových umístění. Například balíček s Bashem je upraven tak, aby binárku místo do /bin
umístil nově do /usr/bin
. Jenže takových balíčků je spousta a když k tomu přičtete fakt, že přesouvání souborů mezi balíčky je poměrně běžná věc, roste šance chyby do nepříjemných rozměrů.
Poškozené systémy po aktualizaci uživatelé rozhodně nechtějí a Debian nic podobného nechce připustit. Proto tato chyba představuje významný problém. Je to také důvod, proč projekt udržuje moratorium na přesun souborů do jejich nových umístění.
Problémů je ale daleko více, například při instalaci systému během bootstrapingu celý proces selže, protože balíčkům při zpracování instalačních skriptů chybí odkazy na interpretery. Ty totiž za normálních okolností vznikají až v závěrečné fázi instalace, ale při boostrapu je potřebujeme hned na začátku.
Vývojáři samozřejmě debatují nad různými návrhy řešení a úpravami sestavovacího procesu, které by potíže zmírnily. Ono se to nakonec podaří, ale ukazuje to, jak může být někdy obtížné a zdlouhavé řešit problém, který vznikl náhodou před padesáti lety. Půl století je ale dostatečně dlouhá doba, aby i taková banalita dosti napevno zakořenila do našich životů.