22.
Soubory a adresáře
1. Úvod
Tato kapitola se zabývá prací s adresáři a jejich položkami (soubory, podadresáři apod.), včetně jejich velikosti, vlastnictví, přístupových práv, příznaků a datových položek. Nepokrývá však zacházení s konkrétním obsahem souborů (analýzu, kopírování, zálohování apod.).
Příkazy chmod, find, stat a některé další jsou vyvíjeny v rámci projektu GNU.
2. Definice
- Adresářová položka je jednoznačně pojmenovaná položka v adresáři; obvykle je to soubor (přesněji – pevný odkaz na soubor), další adresář či symbolický odkaz, méně často zařízení (např. „/dev/null“), pojmenovaná roura apod. Adresářové položky se v daném adresáři identifikují svým názvem, který může obsahovat jakékoliv znaky UTF-8 kromě nulového bajtu a znaku „/“. V každém adresáři se nacházejí dva zvláštní adresářové odkazy „.“ (na sebe) a „..“ (na nadřazený adresář), které se ale nepočítají a většina nástojů je ignoruje (bohužel ne všechny).
- Adresářová položka je skrytá, pokud její název začíná znakem „.“.
- Přístupová práva jsou nastavení souboru či adresáře, která určují, kteří uživatelé budou moci s daným souborem či adresářem zacházet. Nastavení přístupových práv se dělí na tři základní nastavení, která jsou přítomna vždy, a rozšířená nastavení (ACL, access control list), která lze přidávat či odebírat. (Vedle toho existují ještě „výchozí“ nastavení, ale těmi se pro jejich neintuitivnost a zřídkavé využití budu zabývat jen okrajově.)
- Zvláštní příznaky jsou příznaky, které mohou být nastaveny souborům a adresářům a mají na ně zvláštní účinky; dělí se na tři základní zvláštní příznaky (u+s, g+s, +t) a mnoho rozšířených zvláštních příznaků. Zatímco ty základní jsou podporované na všech nativně linuxových typech souborových systémů, podpora těch rozšířených se liší.
- Mód (mode) je standardizované číselné vyjádření základních přístupových práv a základních zvláštních příznaků v osmičkové soustavě.
- Uživatelské datové položky (user xattrs, user extended attributes) umožňují k souborům a adresářům ukládat další obecná data v podobě dvojic klíč–hodnota. Nejčastěji se používají k uložení krátkých čísel či textových řetězců, např. URL, ze kterého byl daný soubor stažen. Mají řadu nevýhod – jsou před uživatelem poměrně skryté (příkazy „ls“ ani „find“ s nimi neumí pracovat), při kopírování či zálohování se obvykle ztratí a nejsou příliš využívány. Proto doporučuji se jim raději vyhýbat a dodatečná data ukládat do samostatných, skrytých souborů.
2/1 Přístupová práva
V linuxu se u souborů a adresářů povolují či zakazují tři přístupová práva:
Právo čtení (r, číselná hodnota „4“, read) znamená:
- U souboru právo otevřít soubor pro čtení a přečíst jeho obsah, a to jak sekvenčně, tak na přeskáčku.
- U adresáře právo přečíst seznam názvů položek v adresáři včetně jejich typu (soubor či adresář), ale už bez dalších údajů.
Právo zápisu (w, číselná hodnota „2“, write) znamená:
- U souboru právo otevřít daný soubor pro zápis, zkrátit ho (i na nulovou velikost), přepisovat existující bajty souboru a zapisovat nové na jeho konec.
- U adresáře právo vytvářet nové adresářové položky, měnit názvy stávajících a stávající mazat.
Právo spouštění (x, číselná hodnota „1“, execute) znamená:
- U souboru právo daný soubor spustit jako proces. Toto právo stačí, pokud se jedná o program v přímo spustitelném binárním formátu; jde-li ve skutečnosti o interpretovaný skript, je potřeba také právo „r“, aby ho příslušný interpret mohl číst.
- U adresáře právo do daného adresáře vstoupit, zjistit podrobnější informace o jeho položkách (např. přístupová práva) a dál k nim přistupovat. Nezahrnuje však možnost přečíst seznam názvů položek, takže pokud máte k adresáři samotné právo „x“, musíte znát názvy jeho položek, abyste s nimi mohli zacházet. (Samotné právo „r“ bez práva „x“ zase umožní programu vypsat seznam položek v adresáři, ale už o nich nebude moci nic zjistit.
Každá adresářová položka má vlastníka (což je některý uživatel, např. „root“) a příslušnou skupinu. Přístupová práva může měnit pouze vlastník položky nebo superuživatel.
Existují tři základní nastavení přístupových práv: pro vlastníka („u“), pro skupinu („g“) a pro ostatní („o“), vždy v tomto pořadí. Rozšířená nastavení přístupových práv jsou seznam dalších položek, které mohou stanovovat dodatečná práva konkrétním uživatelům a skupinám. Tento seznam však může být (a také obvykle bývá) prázdný.
Nastavení přístupových práv se uplatňují následovně:
- Když k položce přistupuje její vlastník, uplatní se jen a pouze základní nastavení přístupových práv pro vlastníka („u“); žádné jiné nastavení se neuplatní, dokonce ani rozšířené nastavení přístupových práv, které vlastníka výslovně jmenuje.
- Jinak se vezme základní nastavení pro skupinu („g“) a všechny položky rozšířeného nastavení. Pokud bude mezi nimi nalezena alespoň jedna „odpovídající“ položka, tedy např. skupina, jejíž je uživatel členem, uživatel dostane všechna práva garantovaná alespoň některou odpovídající položkou. (To znamená, že když např. bude adresář „adr“ mít nastavena pro skupinu „askup“ práva „r--“ a pro skupinu „bskup“ práva „--x“, uživatel, který je členem obou skupin, ale není vlastníkem daného adresáře, má k adresáři „adr“ práva „r-x“.)
- Jedině pokud nebyla v druhém kroku nalezena žádná odpovídající položka, uplatní se nastavení pro ostatní („o“).
2/2 Základní zvláštní příznaky
Vedle přístupových práv může mít každý soubor či adresář nastaveny ještě tři základní zvláštní příznaky:
Příznak zmocnění vlastníka (u+s, číselná hodnota „4“, set-uid bit):
- U souboru má význam pouze v kombinaci s právem „x“. Je-li takový soubor spuštěn, vzniklý proces získá EUID (a tedy i práva) vlastníka souboru, a to i v případě, že ho spustil jiný uživatel. Nejčastějším použitím je spuštění určitého programu s právy superuživatele.
- U adresáře nemá žádný význam.
Příznak zmocnění skupiny (g+s, číselná hodnota „2“ set-gid bit):
- U souboru funguje analogicky jako příznak zmocnění vlastníka – vzniklý proces získá EGID (tedy skupinová práva) skupiny souboru.
- U adresáře znamená, že všechny nově vytvořené adresářové položky v adresáři s tímto příznakem budou při vytvoření přiřazeny stejné skupině jako adresář, ve kterém byly vytvořeny. (Normálně by získaly skupinu podle procesu, který je vytvořil.) Takto vytvořené podadresáře navíc získají také příznak zmocnění pro skupinu, což znamená, že tento příznak se automaticky rozšíří i do všech nově vytvořených podadresářů, pokud u nich nebude výslovně zrušen.
Příznak omezení smazání (+t, číselná hodnota „1“, sticky-bit):
- U souboru nemá žádný význam.
- U adresáře omezuje výkon práva „w“ – brání ve smazání či přejmenování „cizích položek“, tedy přesněji – zabrání ve smazání či přejmenování adresářové položky každému uživateli, který není vlastníkem dané položky či vlastníkem samotného adresáře. Hlavním smyslem této kombinace je, že uživatelé mohou v daném adresáři vytvářet nové položky a ty jsou pak chráněny před zásahy jiných uživatelů, kteří mají k témuž adresáři také právo zápisu. Tento příznak je typicky nastaven na adresáři „/tmp“. Poznámka: vzniklé podadresáře tento příznak nedědí.
2/3 Superuživatel
Na superuživatele se nevztahují žádná přístupová práva a příznaky zmocnění vlastníka a omezení smazání. Ostatní zvláštní příznaky (zejména ty rozšířené) se vztahují i na superuživatele.
2/4 Mód
Mód se vyjadřuje čtyřmístným číslem v osmičkové soustavě (0000 až 7777), kde jednotlivé číslice zleva doprava znamenají: Příznaky, práva vlastníka, práva skupiny, práva ostatních. První číslice vyjadřující příznaky je nepovinná, mód tedy lze zadat i trojmístným číslem; místo chybějící úvodní číslice se pak uvažuje nula.
Každou číslici vypočteme jako součet číselných hodnot příznaků, které mají být nastaveny, a práv, která mají být přidělena. (Číselné hodnoty příznaků a práv jsou uvedeny výše.)
Příklad: chceme-li adresáři nastavit příznak omezení smazání (číselná hodnota 1) a nastavit, že vlastník bude mít všechna práva (4 + 2 + 1), skupina jen právo čtení (4) a ostatní nebudou mít žádná práva (0), výsledný mód bude: „1740“.
Pro čtení módu si musíme zapamatovat význam jednotlivých číslic v pořadí a číselné hodnoty příznaků a práv. Pak můžeme mód snadno přečíst následujícím postupem:
- Pokud je číslice 4, 2 nebo 1, výsledkem je právě jeden příznak/právo této číselné hodnoty.
- Pokud je číslice 7, výsledkem jsou všechny příznaky/práva.
- Pokud je číslice 0, výsledkem jsou žádné příznaky/práva.
- U zbylých číslic (6, 5 nebo 3) budou výsledkem dva příznaky/práva; u nich zkoušíme postupně odečíst 4 a 2; pokud se nám to podaří, aniž bychom se dostali pod nulu, zapíšeme příznak/právo odpovídající číslici, kterou jsme odečetli, a druhý příznak/právo odpovídající číslici, která nám po odečtení zbyla. 6 = 4 + 2, 5 = 4 + 1, 3 = 2 + 1.
Příklad: mějme mód 3571. První číslice: 4 odečíst nejde, takže odečteme 2 a zbude nám jedna; zapíšeme tedy příznak zmocnění skupiny (hodnota 2) a příznak omezení smazání (hodnota 1). Druhá číslice: 4 odečíst jde a zbude nám 1, zapíšeme tedy práva čtení (4) a spouštění (1). Třetí číslice: 7 znamená pro skupinu všechna práva, tedy čtení, zápis i spouštění. Čtvrtá číslice: 1 znamená pro ostatní jen právo spouštění.
2/5 Rozšířené zvláštní příznaky
Rozšířené zvláštní příznaky jsou relativně málo významné, málo uživtečné a jejich podpora je omezená typem souborového systému. Mezi užitečné z nich patří:
- Příznak „a“ (ext4: ano, btrfs: ano, tmpfs: ne) – Poskytne souboru či adresáři silnou ochranu před zápisem a jinými změnami, ale na rozdíl od příznaku „i“ umožňuje zápis za konec souboru a u adresáře vytvoření nové adresářové položky (její přejmenování či smazání už ne). Nově vytvářené podadresáře tento příznak nedědí.
- Příznak „i“ (ext4: ano, btrfs: ano, tmpfs: ne) – Poskytne souboru či adresáři silnou ochranu před zápisem a jinými změnami. Pozor, na soubor s tímto příznakem nelze ani vytvořit nový pevný odkaz, přejmenovat ho nebo změnit jeho vlastnictví či přístupová práva!
- Příznak „S“ (ext4: ano, btrfs: ano, tmpfs: ne) – Změny se zapisují okamžitě na disk. (Normálně čekají nějakou dobu v paměti.) Nově vytvořené soubory a adresáře tento příznak dědí.
- Příznak „C“ (ext4: ne, btrfs: ano, tmpfs: ne) – Byl-li tento příznak nastaven prázdnému souboru, jeho později alokované datové bloky na disku nebudou sdíleny s jinými soubory (např. klony). Je-li tento příznak nastaven adresáři, nově vytvořené soubory a podadresáře ho zdědí.
- Příznak „A“ (ext4: ano, btrfs: ano, tmpfs: ne) – Čas posledního přístupu („atime“) nebude aktualizován. (Nezkoušel/a jsem.)
3. Zaklínadla
3/1 Vypsat seznam adresářových položek (pro člověka)
3/2 Vypsat seznam adresářových položek (pro skript)
3/3 Testy
3/4 Srovnání
Poznámka: srovnávané položky nemusejí být v tomtéž adresáři; můžete je zadat i s relativní či absolutní cestou.
3/5 Zjistit údaje
3/6 Aktuální adresář
3/7 Vytvořit adresářovou položku
3/8 Přejmenovat či smazat adresářovou položku
3/9 Nastavit přístupová práva
3/10 Změnit čas, vlastnictví a skupinu
3/11 Zvláštní příznaky (nastavit)
3/12 Ostatní
4. Zaklínadla: Uživatelské datové položky
Poznámka: Znaky „\r“, „\n“, „=“ a „\“ se v klíčích atributů při použití následujících zaklínadel nahrazují sekvencemi „\015“ (\r), „\012“ (\n), „\075“ (=), resp. „\134“(„\“). Příkaz „getfattr“ je již automaticky nahrazuje ve výpisech a příkaz „setfattr“ očekává klíč s nahrazenými znaky. Buď se použití těchto znaků vyhněte, nebo jim zajistěte odpovídající konverzi. Nulový bajt „\0“ se v klíči vyskytovat nemůže.
Podle manuálové stránky je délka klíče omezena na 256 bajtů a délka hodnoty na 64 kibibajtů.
4/1 Vypsat položky
4/2 Smazat položku
4/3 Přečíst položku
4/4 Vytvořit či přepsat položku
5. Parametry příkazů
5/1 chmod
Příklady, jak může vypadat nastavení práv a příznaků najdete v zaklínadlech. Mód je číselné vyjádření základních práv a zvláštních příznaků v osmičkové soustavě.
☐ -R | Je-li argumentem adresář, provede stejné nastavení i na všech jeho položkách, položkách všech podadresářů a tak dále. |
☐ -v | Vypisovat provedené operace. |
5/2 mkdir
☐ -p | Vytvoří adresář, pokud ještě neexistuje. Je-li to třeba, vytvoří i nadřazené adresáře. |
☐ -v | Vypisovat provedené operace. |
☐ -m práva | Vytvořenému adresáři nastaví uvedený mód. Ten může být zadán symbolicky (např. „u=rwx,g=rx,o=“) nebo číselně (např. „755“). |
5/3 setfacl
☐ -b ☐ -k | Odstraní všechna rozšířená/výchozí přístupová práva. |
☐ -d | Uvedená normální přístupová práva nastaví jako „výchozí“. |
☐ -R | Je-li argumentem adresář, provede stejné nastavení i na všech jeho položkách, položkách všech podadresářů a tak dále. |
6. Instalace na Ubuntu
Všechny použité nástroje jsou základními součástmi Ubuntu, s výjimkou příkazů „tree“, „getfattr“ a „setfattr“, které můžete doinstalovat takto:
7. Tipy a zkušenosti
- Vlastníci a skupiny jsou v souborovém systému uloženy ve formě čísel UID a GID. Proto když uložíte soubor na USB flash disk a přenesete ho na jiný počítač, kde pracujete jako uživatel s jiným UID, může se stát, že tam k souborům na flash disku nebudete mít dostatečná přístupová práva.
- Symbolické odkazy mají vlastníka a skupinu, ale nemají vlastní přístupová práva. Přístup k odkazované položce se vždy řídí jejími přístupovými právy, čtení symbolického odkazu je bez omezení a zápis do něj není dovolen (je nutno místo toho odkaz smazat a vytvořit nový).
- Příznaky zmocnění vlastníka a skupiny jsou u souboru (vždy oba) automaticky odebrány, kdykoliv se změní jeho vlastník či skupina. U adresáře jsou v takové situaci ponechány.
- V linuxu existují také „výchozí přístupová práva“, což je nastavení přístupových práv na adresáři, které (je-li nastaveno) ovlivňuje přístupová práva nově vyvářených položek; bohužel nelze říci „stanovuje“, ale platí pouze „ovlivňuje“ – na výsledných právech se podílejí i další faktory, nelze rozlišit práva pro soubory a pro adresáře a celé je to dost komplikované a neintuitivní. Zatím jsem naštěstí nanarazil/a na případ, kdy by tuto vlastnost skutečně nějaký program použil.
8. Další zdroje informací
- Wikipedie: Přístupová práva v Unixu
- Wikipedie: Access Control List
- Wikipedie: setuid
- Tutorialspoint: setfacl (anglicky)
- man chmod (anglicky)
- man getfacl (anglicky)
- man setfacl (anglicky)
- man 5 acl (anglicky)
- man chattr (anglicky)
- Článek o getfacl a setfacl (anglicky)
- YouTube: Basic Linux Access Control (anglicky)
- TL;DR: setfacl (anglicky)
- TL;DR: chattr (anglicky)
- TL;DR: getfacl (anglicky)
9. Zákulisí kapitoly
V této verzi kapitoly chybí:
- Kdo má právo nastavovat příslušnou skupinu?
- kopírování (bude samostatná kapitola).
- hledání a eliminace duplikátů (pevné odkazy/btrfs klony)
Tato kapitola záměrně nepokrývá:
- pevné a symbolické odkazy (mají vlastní kapitolu)
- připojováním souborových systémů či prací s pododdíly btrfs (mají vlastní kapitolu)