Konečně jsem se po zkouškovém dostal k napsámí pokračování seriálu o LINUXu. Vím, že mi to trvalo opravdu dlouho, a tak alespoň doufám, že se na toto pokračování těšíte. Dneska si probereme typy a vlastnosti souborů, jejich práva a nakonec si probereme několik základních příkazů.
Soubory
Většina vlastností souboru se pozná podle přístupových práv. K podrobnému vypsání souborů v aktuálním adresáři jednoduše napíšeme:
bash$ ls -l
Příkaz ls
je vlastně zkratka pro "list
directory", tedy výpis adresáře, uživatelé jistých operačních systémů
možná znají příkaz dir
, který se v linuxu také vyskytuje.
V distribuci, kterou používám (Slackware), dělá totéž, co příkaz
"ls --color=none
", tedy jednobarevný abecedně
seřazený výpis souborů aktuálního adresáře ve sloupcích.
Existuje také příkaz vdir
, který se zase chová stejně, jako
"ls -l --color=none
", tedy podrobný
jednobarevný abecedně seřazený výpis souborů aktuálního adresáře. A protože
již z minulého dílu znáte příkaz man
, bude pro vás snadné
nahlédnout, kolik dalších možností (i nemožností) lze u příkazu
ls
využít.
Nyní se vraťme k vlastnostem souborů. Po napsání zmíněného
"ls -l
" (ve většině distribucí lze také napsat
ll
) můžeme dostat následující výpis:
bash$ ls -l
celkem 4
-rwxr-x--x 1 jiri users 41 2005-02-25 00:00 test
Vysvětlíme si, co tento výpis znamená (detaily posléze).
Na prvním řádku výpisu je psáno "celkem 4
". To jest kolik
vypsané soubory skutečně zabírají místa na disku v kilobytech.
Asi se divíte, proč soubor s 41 byty zabírá 4 kilobyty na disku. To pochopíte
v odstavci o organizaci systému souborů (Organizace disku).
Ve druhém řádku: první pomlčka určuje typ souboru, zbytek z prvního sloupečku
jsou práva, jednička nám říká, kolik má soubor linků, jiri
je jméno
vlastníka souboru, users
určuje jméno skupiny, následuje
velikost souboru v bytech, datum a čas poslední modifikace a konečně jméno
souboru.
Typ souborů:
-
- plain file (obyčejný soubor)
d
- directory (adresář, seznam jmen
souborů)
l
- symbolic link (symbolický
odkaz)
p
- pipe (pojmenovaná roura)
s
- socket
b,c
- block, character device
(speciální zařízení)
Pro začátek nás soubory typu p
, s
, b
a c
nebudou zajímat.
Přístupová práva:
Máme tři kategorie přístupových práv (9 pozic, pro každou kategorii 3):
u - user |
g - group |
o - others |
(pro vlastníka) | (pro skupinu) | (pro ostatní) |
Pro každého uživatele platí vždy nejspeciálnější kategorie, do které patří. Každá kategorie má 3 práva:
r
- read (pro čtení)w
- write (pro zápis)x
- execute (pro spouštění souboru, resp. přístup do adresáře)
Ještě existují tři speciální práva (pomocí nich lze provést spousty, většinou bezpečnostních, triků:
setUID
- u spustitelných souborů půjčuje identitu vlastníka, je
značen malým
s
na pozici vlastníka.
- u spustitelných souborů půjčuje identitu skupiny, je značen malým
s
na pozici skupiny. - u souboru bez spouštěcího práva pro skupinu slouží jako kontrola zámků
při každém přístupu (je označen velkým
S
na pozici skupiny). - pro adresář zajišťuje, že nově vytvořené soubory v něm budou mít stejnou skupinu jako tento adresář.
- u spustitelných souborů zajistí jeho zachování v paměti (blokuje odstránkování tohoto souboru do swap).
- u adresářů změní pravomoce pro přístup (do adresáře mají pak přístup vlastníci vnitřních souborů, tedy nemusí do něj mít přístup vlastníci adresáře).
- je značen malým
t
na pozici pro ostatní.
Změna práv:
Ke změně práv nám slouží příkaz chmod
, změnu vlastníka
lze provést příkazem chown
a změnit skupinu můžeme pomocí
chgrp
, nakonec ještě můžeme nastavit výchozí masku (práva,
která bude mít nově vytvořený soubor) a to lze učinit příkazem
umask
. Model nastavení práv vypadá nějak takto:
speciální | u (vlastník) | g (skupina) | o (ostatní) | |
4 | setUID | r-- |
r-- |
r-- |
2 | setGID | -w- |
-w- |
-w- |
1 | sticky | --x |
--x |
--x |
Z tohoto modelu lze vyčíst, pomocí jakého oktálního čísla chceme změnit
přístupová práva. Toto číslo sestavíme takto: Pokud chceme nastavovat
speciální bity (setUID/setGID/sticky), bude číslo mít 4 cifry (na první pozici
právě nastavíme požadovanou kombinaci setUID/setGID/sticky bitů), v opačném
případě stačí jen 3 cifry. Každá pozice našeho požadovaného oktálního čísla
je vždy součet číslic v tabulce pro danou kategorii (vlastník/skupina/ostatní).
Takže pokud například chceme nastavit sticky bit, čtení/zápis/souštění pro
vlastníka a pro skupinu ani ostatní nic, zvolíme kombinaci 1700
(sticky bit je 1
, 7=4+2+1
=čtení+zápis+spouštění
pro vlastníka, 0
pro skupinu a 0
pro ostatní),
výsledná přístupová práva pak budou
" rwx|---|--T
".
Příklady použití zmíněných příkazů:
chmod [-R] +x,g=rw soubor1 ...
chmod [-R] 2755 soubor1 ...
chown [-R] root soubor1 ...
chgrp [-R] users soubor1 ...
chown [-R] root.users soubor1 ...
umask doplněk_masky ( umask 022 )
Na prvním řádku přidáváme všem spustitelný bit, následně skupině nastavíme
právě čtení a zápis (to, co tato maska nepřekrývá souboru zůstane, tedy např.
pokud měl uživatel právo zapisovat, stále zapisovat může). V druhém řádku
nastavujeme setGID bit, a dále uživatel má právo na čtení/zápis/spouštění,
skupina i ostatní pak mohou číst a spouštět. Třetím řádkem bychom nastavili
vlastníka na superuživatele, čtvrtým bychom určili skupinu na
users
a toto lze zkombinovat pátým řádkem. Konečně posledním
řádkem (tím v závorce) nastavíme, že každý nový adresář bude mít práva
" rwx|r-x|r-x
" a každý nově vytvořený soubor
" rw-|r--|r--
" (u souborů se implicitně
nenastavuje spustitelný bit). Zmíněná maska umask
je v systému
implicitní (vyjímky ale mohou nastat, např. u souborových systémů bez práv,
tedy třeba FAT).
Organizace disku
Organizaci disků lze rozdělit z více hledisek - fyzická, logická
a systémová. Fyzicky je disk rozdělen na povrch, cylindry, stopy a sektory -
to je pro nás celkem nepodstatné. O něco zajímavější je
logické rozdělení disku na takzvané oddíly (partitions), běžný uživatel
bude mít po instalaci linuxu obsaženy oddíly, které budou připojeny jako
kořenový adresář (root), většinou bývá krátký oddíl v /boot
,
pravděpodobně bude přítomen i swap oddíl pro odkládání nepoužívané
paměti, nezřídka ještě nějaké nelinuxové oddíly (z jiných operačních systémů).
Za zmínku jistě stojí příkaz df
, který vypíše připojené oddíly,
včetně jejich zaplnění a dalších užitečných informací. Zvídavý čtenář jistě
bez váhání prozkoumá manuálové stránky.
Nejvíce nás bude zajímat systémová organizace disku (tzv. filesystem).
Ve fiesystemu máme boot blok, superbloky, seznam I-nodů
(nějak se mi nelíbí počeštěný výraz I-uzly) a v neposlední řadě ještě
datové bloky. Je pro nás celkem nepodstatný účel boot bloku
a superbloků. V datových blocích jsou data (jak překvapivé, že?), z hlediska
organizace disku jsou pak pro linux (možná nejen pro něj) charakteristické
právě I-nody. Každý soubor na disku má právě jeden I-node.
Každý I-node popisuje počet linků (tzn. kolik souborů ukazuje na datovou
oblast určenou tímto I-nodem), vlastníka i skupinu, nechybí přístupová práva
a typ souboru, velikost, 3 typy časů (poslední modifikace, poslední přístup
a poslední změna I-nodu) a nakonec odkaz na datové bloky. Tady také narážíme
na naši zvláštnost, proč soubor velký 41 bytů zabírá na disku 4 kilobyty.
To je dáno tím, že každý soubor má svůj I-node, a implicitně je filesystem
naformátován tak, že každému 4 kilovému datovému bloku přísluší jeden I-node,
tedy z extrémního pohledu, pokud bychom na disku měli jenom samé soubory menší
než 4 kilobyty, nedostávalo by se nám I-nodů. Zmínit bych ještě mohl, že pokud
byste si chtěli vypsat soubory s informací o číslu I-nodu, stačí použít
parametr -i
u příkazu ls
.
Linky
Máme dva druhy odkazů: link (někdy též hard link) a symlink (soft link, symbolický odkaz). V případě pevných linků neexistuje originál či kopie (prostě dva soubory mají společný I-node, z toho samozřejmě vyplývá, že mají společné datové bloky). Symbolický odkaz je soubor typul
,
ve kterém je napsána cesta směřující k odkazovanému souboru. Důraz je třeba
klást na to, že symbolický odkaz může směřovat na adresáře, kdežto pevný link
nikoliv!!! Dalším důležitým rozdílem je ověřování práv přístupu - u pevného
linku se vždy ověří, zda-li uživatel má přímý přístup, kdežto u symbolického
odkazu navíc musí mít právo dosáhnout celé cesty vedoucí k souboru. Vytvořením
pevného linku se zvýší počet linků v I-node (ten druhý sloupeček v podrobném
výpisu souboru), symbolický odkaz I-node původního souboru vůbec nemění.
Zajímavým faktem je ještě počet linků u adresářů. Vytvořme si nový adresář
test
, a následně si nechme udělat výpis příkazem
"ls -l
".
bash$ mkdir test
bash$ ls -l
celkem 4
drwxr-xr-x 2 jiri users 4096 2005-02-25 00:00 test
Asi se vám bude zdát zvláštní, že nově vytvořený adresář má dva linky,
navíc jsme si řekli, že nelze tvořit pevné linky na adresáře. Každý adresář
obsahuje podadresáře ".
" a "..
",
což je vyjímka u pevných linků v souvislosti s adresáři. Na náš adresář
test
ukazuje totiž i "test/.
".
Zkuste si rozmyslet, co pomocí počtu linků adresáře lze jednoduše zjistit.
Vytvořte si v adresáři test
nějaký podadresář a uvidíte, že se
počet linků adresáře test
zvýší o jednotku.
bash$ mkdir test/subtest
bash$ ls -l
celkem 4
drwxr-xr-x 3 jiri users 4096 2005-02-25 00:00 test
Počet linků na adresář test
je nyní 3, protože na něj
ukazuje ještě "test/subtest/..
". Podle počtu linků
adresáře tedy můžeme jednoduše zjistit počet podadresářů.
Linky (ať už pevné, či symbolické) lze vytvářet příkazem ln
,
pevné linky můžeme též tvořit pomocí link
.
link vzor obraz
ln [-s] vzor obraz
Parametr -s
definuje, že odkaz má být symbolický. Na závěr
odkazů ještě příklad:
bash$ ln -s test/ test2
bash$ ls -l
celkem 4
drwxr-xr-x 3 jiri users 4096 2005-02-25 00:00 test
lrwxr-xr-x 1 jiri users 5 2005-02-25 00:00 test2 -> test/
Nenechte se zmást počtem linků adresáře test
, stále obsahuje
podadresář subtest
.
Několik základních příkazů
Na závěr si ještě uvedeme několik základních příkazů:
touch
- nastavení data a času,
resp. vytvoření prázdného nového souboru
cp [-r]
- kopírování souborů
mv
-
přesun/přejmenování souborů
rm [-rf]
- smazání souboru
cd
- změna aktuálního
adresáře
pwd
- výpis cesty aktuálního
adresáře
mkdir [-p]
- vytvoření nového adresáře
rmdir
- smazání prázdného adresáře
find
, archivace ...
Autor: J.N.