Instalační a uživatelský manuál pro Linux Mission 1.0

Transkript

Instalační a uživatelský manuál pro Linux Mission 1.0
Instalační a uživatelský manuál pro Linux Mission 1.0
David Häring a kolektiv autorů LinuxZone
Impossible: Linux Mission 1.0
Obsah •
•
•
1. Úvod • 1.1 Proč zvolit Linux Mission? • 1.2 Co obsahuje Linux Mission 1.0 • 1.3 Požadavky na hardware • 1.4 Obecné poznámky k instalaci 2. Instalace
• 2.2 Příprava k instalaci • 2.2 Začínáme • 2.3 Otestování instalačních médií • 2.4 Úvodní obrazovka instalačního programu • 2.5 Volba jazyka pro instalaci • 2.6 Volba klávesnice • 2.7 Volba typu myši • 2.8 Výběr grafické karty a monitoru • 2.9 Výběr typu instalace • 2.10 Rozdělení disku • 2.12 Zavaděč systému • 2.13 Nastavení sítě • 2.14 Nastavení firewallu • 2.15 Podpora dalších jazyků • 2.16 Nastavení časové zóny • 2.17 Nastavení hesla uživatele root • 2.18 Výběr software k instalaci • 2.19 Zahájení instalace • 2.20 Vytvoření zaváděcí diskety • 2.17 Dokončení instalace • 2.17 Problémy při instalaci 3. Softwarový RAID
• 3.1 Hardwarové a softwarové implementace RAIDu • 3.2 Teorie fungování RAIDu • 3.2.1 RAID 0 (Nonredundant striped array)
• 3.2.2 RAID 1 (Mirrored array)
• 3.2.3 RAID 4 (Striped array with parity)
• 3.2.4 RAID 5 (Striped array with rotating parity)
• 3.2.5 Kombinace více typů polí
• 3.2.6 Redundantní pole neznamenají konec záloh
• 3.3 Typy polí podporovaných Linuxovým ovladačem RAIDu • 3.4 Konfigurace • 3.5 Obslužný software ­ Raidtools • 3.6 Alternativní obslužný software ­ Mdadm www.linuxzone.cz strana 2 / 159
Obsah Impossible: Linux Mission 1.0
3.7 Inicializace polí 3.8 Raid autodetect anebo raidstart? • 3.9 RAID superblok • 3.10 Perzistentní superbloky a RAID 0 / linear • 3.11 Monitorování stavu pole • 3.12 Rekonstrukce pole • 3.13 Redundantní pole: výměna disku, hot plug • 3.14 Možnosti rekonfigurace polí • 3.15 Optimalizace polí, výkon 4. LVM ­ Logical Volume Manger (Správa logických oddílů)
• 4.1 Teorie fungování LVM • 4.1.1 Mapování svazků
• 4.2 Práce s LVM • 4.2.1 Inicializace disků a diskových oddílů
• 4.2.2 Vytvoření skupiny svazků
• 4.2.3 Vyhledání dostupných skupin svazků
• 4.2.4 Aktivace skupiny svazků
• 4.2.5 Deaktivace skupiny svazků
• 4.2.6 Odstranění skupiny svazků
• 4.2.7 Přidání fyzického svazku do skupiny svazků
• 4.2.8 Odebrání fyzického svazku ze skupiny svazků
• 4.2.9 Vytvoření logického svazku
• 4.2.10 Odstranění logického svazku
• 4.2.11 Rozšíření (zvětšení) logického svazku
• 4.2.12 Redukce (zmenšení) logického svazku
• 4.2.13 Získání informací o stavu svazků
• 4.3 Instalace Linux Mission s využitím LVM 5. Základní orientace v systému
• 5.1 Uživatelé, skupiny a přístupová práva • 5.2 Adresářová struktura v Linuxu: kde, co a jak v systému nalézt • 5.2.1 Standardy FSSTND, FHS
• 5.2.2 Hierarchie svazků a adresářová struktura Linuxu
• 5.2.3 Nástroje pro vyhledávání
• 5.2.4 Rychlé vyhledávání souborů pomocí databáze souborů ­ locate
• 5.2.5 Vyhledávání souborů pomocí utility find
• 5.2.6 Orientace v systému pomocí databáze RPM
• 5.2.7 Prohledávání obsahu souborů ­ grep
• 5.2.8Nástroje pro vyhledávání s grafickým rozhraním
• 5.3 Jak rozpoznat formát datových či binárních souborů? • 5.3.1 Jak file pracuje?
• 5.3.2 Použití v praxi
• 5.4 Dokumentace, nápověda 6. Pod pokličkou ­ orientace v systému pro pokročilé
•
•
•
•
•
www.linuxzone.cz strana 3 / 159
Obsah Impossible: Linux Mission 1.0
6.1 Plánování, hierarchie a řízení procesů • 6.1.1 Co je proces?
• 6.1.2 Vznik procesu, vykonání programu ­ volání jádra fork() a execve()
• 6.1.3 Stavy procesů
• 6.1.4 Praxe: monitorování stavu procesů
• 6.1.5 Plánování procesů, priorita
• 6.1.6 Praxe: nástroje nice a renice pro změnu priority
• 6.2 Hierarchie procesů • 6.2.1 Skupiny procesů a sezení
• 6.2.2 Praxe: utility nohup, setsid a disown ­ vyjmutí procesu ze sezení
• 6.2.3 Řízení procesů, signály
• 6.2.4 Praxe: ukončení procesu, nástroj kill pro zasílání signálů procesům
• 6.2.5 Praxe: synchronizace rodiče s ukončením potomka
• 6.2.6 Praxe: nastavení reakce na signály ­ signal(), sigaction()
• 6.2.7 Příkazový interpret a řízení procesů ­ job control
• 6.3. Jádro systému a ovladače • 6.3.1 Monolitické nebo modulární jádro?
• 6.3.2 Práce s moduly ­ balíček modutils
• 6.3.3 Automatické zavádění a odstranění modulů jádrem ­ kmod
• 6.3.4 Předávání parametrů ovladačů
• 6.4 Proces bootování jádra • 6.4.1 Initrd, prvotní kořenový svazek a skript linuxrc
• 6.4.2 Jak vytvořit obraz initrd
• 6.4.3 Skript linuxrc, interpret nash
• 6.4.4 Změna kořenového svazku ­ change_root nebo pivot_root
• 6.4.5 Mkinitrd ­ nástroj pro generování initrd
• 6.5 Start systému: jakou roli hraje proces init? • 6.5.1 Inicializace systému, hierarchie procesů
• 6.5.2 Úroveň běhu systému (runlevel)
• 6.5.3 BSD versus System V
• 6.5.4 Konfigurace ­ init v Linuxu Mission
• 6.5.5 Konfigurační soubor /etc/inittab
• 6.5.6 Startovací skripty rc.sysinit a rc.local
• 6.5.7 Definování služeb v jednotlivých úrovních běhu
• 6.5.8 Chkconfig ­ zjednodušení manipulace s odkazy
• 6.5.9 Nastavení prostředí spouštěných procesů ­ /etc/initrc
• 6.5.10 Ovládání initu, přechod z jedné úrovně do druhé
7. Administrace systému
• 7.1 Správa software • 7.1.1 Systém RPM
• 7.1.2 Přidání / odstranění software dováváného s Linux Mission
• 7.1.3 Yum
• 7.1.4 Instalace software třetí strany
•
•
Obsah www.linuxzone.cz strana 4 / 159
Impossible: Linux Mission 1.0
• 7.1.5 Upozornění na dostupnost aktualizací Linux Mission
7.2 Vytváření uživatelů a skupin • 7.3 Konfigurace sítě • 7.4 Konfigurace tisku 8. Grafické rozhraní X Window System
• 8.1. Desktop GNOME • 8.1.1 Ovládací a stavový panel GNOME
• 8.1.2 Ovládání oken
• 8.1.3 Pracovní plocha
• 8.1.4 Hlavní menu
• 8.1.5 Správce souborů Nautilus
• 8.1.6 Odhlášení ze systému
• 8.2 Desktop KDE
9. Příkazový interpret Bash: nebojte se příkazové řádky
10. Tip: pracujeme se skenery
11. Tip: pacujeme s digitálním fotoaparátem
•
•
•
•
•
www.linuxzone.cz strana 5 / 159
Obsah Impossible: Linux Mission 1.0
Obsah Znáte LinuxZone.cz?
Linuxzone.cz je moderní internetový magazín z prostředí informačních technologií. Zaměřuje se na
operační systém GNU/Linux a problematiku svobodného a open source software. Kadý den zde vychází články ze světa GNU/Linuxu, programování, sítí a bezpečnosti, ze kterých
čtenáři načerpají aktuální informace a dozví se o nejmodernějších trendech, stejně jako starých a
ověřených zkušenostech jiných profesionálů. Portál Linuxzone.cz se zaměřuje na uživatele, administrátory a programátory všech kategorií ­
začátečníky, zkušenějí i znalé profesionály. Kadý z nich si z mnoství článků vybere ten pravý. Kromě řady odborných článků jsou zde k nalezení také oddychové. Například kniní recenze, a to
nejen české, ale i zahraniční literatury. Dále můete v archivu článků nalézt kupříkladu herní recenze
či románový seriál Gordon, v něm se seznámíte se stejnojmenným hrdinou, počítačovým expertem
Gordonem. To vše a ještě mnoho dalšího najdete na portálu Linuxzone.cz ­ http://www.linuxzone.cz/. www.linuxzone.cz strana 6 / 159
Impossible: Linux Mission 1.0
Obsah Využijte služeb Linux­cd.cz
Uživatelé, kteří nemají přístup k Internetu budou mít možnost využít služeb portálu LinuxCD
(http://www.linux­cd.cz). Na portálu LinuxCD bude možné objednat zaslání CD s aktualizacemi
Linux Mission. www.linuxzone.cz strana 7 / 159
Impossible: Linux Mission 1.0
Obsah Tux­NET: při pojte se k Internetu a podpořte komunitu!
Společnost Impossible ­ provozovatel portálu Linuxzone ­ přichází s možností, jak snadno podpořit
českou linuxovou komunitu a free software projekty, které u nás vznikají. Zapojte se i vy! Co je Tux­NET? Tux­NET je obdobou celé řady existujících nebo nově vznikajících podobných projektů. Jde o
vytáčené připojení, respektive poskytnutí zázemí pro jeho využití. To v praxi znamená, že máte k dispozici telefonní číslo, uživatelské jméno a přístupové heslo, s
jejichž pomocí se můžete z celého území České Republiky připojit na Internet. Stačí vám k tomu
jen obyčejná telefonní linka a modem. Vše je přitom zdarma ­ platíte pouze standardní poplatky
Českému Telecomu, nic víc. Samozřejmě se nemusíte nikde registrovat. Přístup na Internet je tedy v
tomto ohledu anonymní a nevyžaduje žádné informace o vás, které by mohly být nějakým
způsobem zneužity. Proč využívat Tux­NET?
Podobných poskytovatelů existuje mnoho, proč tedy využít právě Tux­NET? Důvod je zřejmý.
Tux­NET totiž neslouží k obohacování gigantických společností. Výtěžek je použit na podporu a
rozvoj české linuxové komunity a podporu free software. Konkrétním příkladem sponzoringu je
právě projekt Linux Mission. Zbylé peníze jsou investovány do technického rozvoje služeb, a také
do rozvoje portálu Linuxzone a kvality jeho obsahu. Jak využívat Tux­NET?
Veškeré nezbytné informace naleznete na informační stránce projektu ­ http://tuxnet.linuxzone.cz.
Služeb Tux­NETu můžete samozřejmě využívat jak v prostředí operačního systému GNU/Linux,
tak i MS Windows a všech dalších. Jakékoliv doplňující otázky vám rádi zodpovíme na e­mailové
adrese [email protected]. Provozovatel:
Impossible, s.r.o.
Tel. Číslo:
971 101 203
Login:
linux
Heslo:
linux
Bližší informace:
tuxnet.linuxzone.cz
www.linuxzone.cz strana 8 / 159
Impossible: Linux Mission 1.0
1. Úvod
1. Úvod
1.1 Proč zvolit Linux Mission?
Operační systém Mission je vystavěný na bázi robustního a osvědčeného OS Linux (konkrétně
vychází z linuxové distribuce Fedora Core). Na rozdíl od víceúčelových linuxových řešení je
operační systém Linux Mission specificky cílený na uživatele desktopu. Mission disponuje vylepšenou interoperabilitou se systémy Microsoft Windows. Vzdálené složky
jsou pohodlně dostupné přes položku "Síťové servery" v hlavním menu. Složky a soubory umístěné
na počítačích vybavených operačním systémem Linux Mission lze snadno vysdílet tak, že pravým
tlačítkem myši klikneme na ikonu daného objektu a v menu vybereme položku "Sdílení". Při
prvním použití se automaticky vyvolá konfigurace sítě. Pro lepší interoperabilitu se systémy Microsoft Windows povoluje vestavěný firewall systému
Mission provoz sítě Microsoft Windows. Omezení přístupu ke sdíleným soborům je samozřejmě
možné nastavit prostřednictvím pomocníka nastavení sítě. Snadnější instalace na počítač, kde je již instalován operační systém Microsoft Windows. Pokud je
instalován na jediném diskovém oddíle FAT32 nebo NTFS, instalátor Mission jej sám zmenší a
vytvoří místo pro instalaci Linuxu Mission. 1.2 Co obsahuje Linux Mission 1.0?
Linux Mission obsahuje předevčím software pro běžné nasazení na desktopu, ale také nástroje pro
vývoj aplikací či základní serverový software: •
•
•
•
•
•
•
•
desktopová prostředí GNOME a KDE; kancelářský software: kompletní kancelářský OpenOffice.org 1.1.0 (obsahuje word procesor,
tabulkový procesor, prezentace, grafika); internet: webový prohlížeč Mozilla a Konqueror, poštovní klient Evolution, komunikační
nástroj gaim (ICQ, Jabber, IRC); práce s grafikou: bitmapový GIMP, Gtkam (podpora digitálních fotoaparátů), Xsane
(podpora skenerů); serverové apklikace: webový server Apache s podporou PHP, SSL, MySQL, PostgreSQL,
databázové stroje MySQL a PostgreSQL, DNS server (bind), FTP server (vsftpd), poštovní
server sendmail; sdílení souborů pro klienty Microsoft Windows (Samba); podporu multimédií; nástroje pro vývoj aplikací (kompilátor, ladicí nástroje, knihovny). www.linuxzone.cz strana 9 / 159
Impossible: Linux Mission 1.0
1. Úvod
1.3 Požadavky na hardware
•
•
•
procesor: Intel Pentium a kompatibilní, dop. alespoň 400 MHz paměť: minimum 64 MB, pro komfortní práci doporučeno 256MB místo na disku: instalace na pracovní stanici zabere 1.6 GB místa na disku, minimální
instalace 0.5 GB. Kompletní instalace vyžaduje 2.5 GB. 1.4 Obecné poznámky k instalaci
K dispozici jsou dva způsoby instalace ­ v grafickém a v textovém režimu. Instalace v textovém
režimu se může hodit zejména tehdy, vyskytne­li se nějaký problém s detekcí hardware a grafický
režim z toho důvodu nelze použít. Oba dva způsoby instalace nabízejí stejnou funkčnost. V průběhu instalace provádíme volby buď myší, anebo pomocí kláves "Tab" a "Enter" ("Tab" a
šipky pro výběr voleb a "Enter" pro potvrzení výběru.) Pomocí volby "Další" postupujeme k dalším krokům instalace, pomocí volby "Zpět" se můžeme
vrátit nazpět k předchozímu kroku. Také jsou k dispozici klávesové zkratky (vyvoláte je stiskem "Alt" + klávesa). Instalace v grafickém
režimu se nejlépe ovládá myší, ale lze si vystačit i bez ní. Po celou dobu instalace se nápověda týkající se aktuálního dění také zobrazuje v levé části
obrazovky (pouze v grafickém režimu) a můžeme se jí zbavit stisknutím tlačítka "Skrýt nápovědu".
Stručné informace o systému (v angličtině) získáte na počátku instalace stisknutím tlačítka
"Poznámky k vydání". 2. Instalace
2.2 Př íprava k instalaci
Ujistíme se, že je počítač nastaven tak, že zavede systém z CD nebo DVD (pokud ne, provedeme
změnu nastavení pořadí zařízení pro zavedení systému v BIOSu, viz např. následující snímek
obrazovky. Nastavení BIOSu vašeho počítače se samozřejmě může lišit od toho vyobrazeného, v
tom případě konzultujte příslušnou dokumentaci). Vložíme instalační CD 1 do mechaniky CD­
ROM a restartujeme počítač. Po restartu by měl systém bootovat z CD / DVD a zahájit instalaci. www.linuxzone.cz strana 10 / 159
Impossible: Linux Mission 1.0
2. Instalace
2.2 Začínáme
V úvodní obrazovce nás přivítá logo Mission a v dolní části obrazovky úvodní prompt "boot:".
Základní nápověda je dostupná stiskem F1 až F4. Ve většině případů zde postačí prostý stisk klávesy "Enter", což obnáší výběr instalace v grafickém
režimu. Pro instalaci v textovém režimu bychom zadali "linux text". Pokud bychom měli nějaký při
instalaci nepostradatelný hardware, jehož ovladač není v Mission obsažen (např. netypický SCSI
řadič, ke kterému máme připojen pevný disk apod.), můžeme využit volbu "linux dd" ­ tím
instalačnímu programu sdělíme, že bude potřeba při zahájení instalace natáhnout z diskety potřebný
ovladač. Budeme k tomu potřebovat tzv. "driver disk" ­ někteří výrobci hardware jej mají na svých
internetových stránkách pro některé linuxové distribuce připravené ke stažení. Pokud ovladač k
danému zařízení existuje, ale předpřipravený driver disk nemáme k dispozici, je možné jej sestavit.
V takovém případě se požádejte o pomoc zkušeného uživatele anebo se obraťte do konference Linux
Mission. Poté je zavedeno jádro systému a proběhne detekce dostupných zařízení. www.linuxzone.cz strana 11 / 159
Impossible: Linux Mission 1.0
2. Instalace
2.3 Otestování instalačních médií
Pokud zvolíte "OK", instalační program nejprve zkontroluje obsah instalačních médií. Pokud jste si
instalační média stáhli prostřednictvím Internetu a sami vypálili, je vhodné je nechat zkontrolovat ­
vyhnete se případným pozdějším problémům při instalaci. Poté se nastartuje instalační program, což může na slabších počítačích chvíli trvat ­ dole na
obrazovce se mezitím objeví hlášení "Running anaconda, the Mission system installer­ please
wait...". 2.4. Úvodní obrazovka instalačního programu
www.linuxzone.cz strana 12 / 159
Impossible: Linux Mission 1.0
2. Instalace
Nyní máme možnost přečíst si stručné poznámky k této verzi systému Mission (stiskem tlačítka
"Poznámky k vydání") a pomocí volby "Další" se přesuneme k další obrazovce, kde pokračujeme
výběrem jazyka. 2.5 Výběr jazyka
Nyní volíme jazyk, který se bude používat v průbehu instalace, tedy češtinu a přejdeme na další
obrazovku potvrzením volby "Další". www.linuxzone.cz strana 13 / 159
Impossible: Linux Mission 1.0
2. Instalace
2.6 Volba klávesnice
Nyní přichází na řadu volba rozložení kláves. Pro českého uživatele přichází v úvahu volby
"Czechoslovakian" a "Czechoslovakian (qwertz)" ­ liší se od sebe prohozením umístění písmen "z"
a "y". 2.7 Volba typu myši
www.linuxzone.cz strana 14 / 159
Impossible: Linux Mission 1.0
2. Instalace
Řadu myší je instaleční program schopen sám správně rozpoznat, v takovém případě pouze potvrďte
volbu a přejděte na další obrazovku. Pokud používáte myš připojenou k sériovému portu, je potřeba zadat také kokrétní zařízení, ke
kterému je připojena (např. portu COM1 v DOSu odpovídá zařízení /dev/ttyS0, portu COM2
odpovídá /dev/ttyS1 apod.). Máte­li starší myš vybavenou pouze dvěma tlačíčky, ponechte také
zatrhnutou volbu "Emulovat 3 tlačítka". (Pod linuxem se obvykle pracuje se všemi třemi tlačítky
myši, u dvoutlačítkové myši pak prostřední tlačítko supluje současný stisk obou tlačítek myši). Pokud se vám stane, že zvolíte špatně a zjistíte, že vám v následující obrazovce myš nefunguje,
vraťe se zpět k výběru myši buď pomocí kláves "Tab" a "Enter" anebo pomocí klávesové zkratky
"Alt" + "z" a vyberte znovu. 2.8 Výběr monitoru
V podstatě všechny dnešní monitory i grafické karty popdporují standard DDC, který umožňuje
automatickou detekci parametrů monitoru. Pokud se vám stane, že váš monitor není detekován
správně, máte dvě možnosti. Tou první je ručně projít seznam monitorů známých instalačnímu
programu a pokusit se jej najít. Pokud jej v seznamu nenajdete, budete muset sami zadat parametry
monitoru. Pod položkou "Generic CRT Display" (používáte­li klasický CRT monitor) anebo
"Generic LCD Display" používáte­li LCD displej zvolíte jeho rozlišení a v dolní části obrazovky
můžete zkontrolovat a upravit nastavení horizontálního a vertikálního kmitočtu (tyto údaje
naleznete v dokumentaci monitoru, pokud ji nemáte, lze je obvykle dohledat na Internetových
stránkách výrobce podle typového čísla monitoru vytištěného na štítku umístěného někde boku
nebo zadní straně monitoru). Pokud si nejste těmito parametry jisti, ponechte raději implicitní
hodnoty nastavené instalačním programem ­ zejména u staršího hardware by mohlo v případě
www.linuxzone.cz strana 15 / 159
Impossible: Linux Mission 1.0
2. Instalace
chybného nastavení dojít k poškození monitoru (novější monitory se v takovém případě zpravidla
samy vypnou). 2.9 Výběr typu instalace
V tomto kroku volíme typ instalace ­ tedy podle zamýšleného způsobu nasazení systému zvolíme
jednu z variant (ovlivní výchozí výběr instalovaného software, výběr software k instalaci lze
samozřejmě ještě upravit): •
•
•
•
osobní systém ­ instalace bude obsahovat vše potřebné pro běžnou práci (grafické prostředí,
kancelářský software). pracovní stanice ­ instalace bude obsahovat vše potřebné pro běžnou práci a kromě toho také
nástroje pro vývoj aplikací a administraci systémů. server ­ také tato volba mluví sama za sebe. Linux Mission je zaměřen především pro použití
na desktopu, ale obsahuje i základní serverový software jako je webový server, databázové
stroje SQL, FTP, jmenný či poštovní server. U této varianty se standardně neinstaluje
grafické prostředí, ale je možné instalaci grafického prostředí později (při upřesnění výběru
software k instalaci) zvolit explicitně. vlastní ­ vhodné pro zkušené uživatele, kteří přesně vědí co od systému chtějí (t.j. jakým
způsobem chtějí rozdělit diskový prostor, jaké softwarové balíčky instalovat apod.). www.linuxzone.cz strana 16 / 159
Impossible: Linux Mission 1.0
2. Instalace
2.10 Rozdělení disku
Tady se nám nabízí dvě možnosti: buď vše ponechat na instalačním programu, který se pokusí v
závislosti na zvoleném typu instalace vytvořit optimální rozdělení disku, anebo to udělat ručně (v
tom případě nám pomůže přehledný nástroj Disk Druid). Začínající uživatelé by měli rozhodně
využít možnosti automatického rozdělení disku. www.linuxzone.cz strana 17 / 159
Impossible: Linux Mission 1.0
2. Instalace
Pokud potvrdíme volbu automatického rozdělení disku, jsme v následujícím kroku dotázáni, zda se
mají před instalací Mission •
•
•
odstranit všechny existující diskové oddíly, což znamená že o data na nich umístěná
nenávratně přijdeme (!), odstranit pouze existující linuxové diskové oddíly ­ t.j. pokud jsme měli instalovanou jinou
linuxovou distribuci, kterou nechceme zachovat, o data na těchto linuxových oddílech opět
nenávratně přijdeme (!), zachovat všechny stávající diskové oddíly a k instalaci Mission využít pouze volný prostor
na disku. V každém případě máme možnost zvolit disk(y), na které chceme Mission instalovat a kromě toho
můžeme zatrhnout volbu "Prohlédnout a případně upravit vytvořené oddíly". Pokud této možnosti
využijeme, v následujícím kroku můžeme pomocí nástroje Disk Druid provést úpravy. Rozhodnete­li se pro ruční rozdělení disku, měli byste dodržet následující: •
•
•
je vhodné vyhradit menší diskový oddíl speciálně pro svazek /boot (bohatě stačí velikost
50 ­ 100 MB); v každém případě musíte označit oddíl, na kterém bude umístěn kořenový svazek /, bez
toho není možné pokračovat dále v instalaci. Pokud nebudete definovat další oddíly, měl by
být dostatečně velký na to, aby pojal celou instalaci plus místo na data uživatelů; rozhodně byste měli definovat diskový oddíl, který bude sloužit jako odkládací prostor
(swap) ­ může klidně zabírat i dvojnásobek fyzické paměti počítače. Swapovat lze
samozřejmě i do souboru, který můžete vytvořit později, ovšem swapování do souboru je o
něco pomalejší. www.linuxzone.cz strana 18 / 159
Impossible: Linux Mission 1.0
2. Instalace
Linux Mission podporuje také softwarový RAID a LVM, potřebné informace stran takové instalace
najdete v kapitolách věnovaných speciálně problematice RAIDu a LVM. 2.12 Zavaděč systému
Mission obsahuje zavaděč systému GRUB. Standardně bude instalován na MBR (Master Boot
Record) prvního pevného disku. Pokud máme kromě Mission instalovány i další operační systémy,
můžeme GRUB nakonfigurovat tak, aby nám při startu počítače nabídl možnost výběru operačního
systému, který chceme spustit. Ten operační systém, který chceme nechat zavést implicitně,
označíme zatrhnutím příznaku "Implicitní". Pokud některý z dalších operačních systémů, které
máme instalovány v nabídce není (t.j. instalátor Mission jej sám nedetukuje), můžeme jej ručně
přidat pomocí tlačítka "Přidat". Pokud používáme primárně jiný zavaděč systému, můžeme přes
volbu "Pokročilé nastavení zavaděče systému" zvolit, kam se bude GRUB instalovat. Pokud
chceme pro zavedení systému použít jiný zavaděč než GRUB, můžeme přes volbu "Změnit
zavaděč" zvolit variantu "Neinstalovat zavaděč systému". Pak je ale na nás, abychom dotyčný
zavaděč nakonfigurovali tak, aby umožnil zavedení systému Mission. Pro vyšší zabezpečení systému je možné zavaděč systému chránit heslem. Standardně je totiž při
startu systému možné linuxovému jádru předat určité parametry, které lze použít např. při opravě
havarovaného systému, kromě jiného je toho také možné zneužít k obejití standardní startovací
sekvence a získat oprávnění privilegovaného uživatele root. Pokud zavaděč ochráníme heslem,
nebude bez znalosti hesla možné této možnosti využít. Poznámka: pokud se chceme účinně bránit proti neoprávněnému vniknutí do systému, měli bychom
současně také chránit heslem BIOS počítače a zakázat zavedení systému z jiného média než
pevného disku. www.linuxzone.cz strana 19 / 159
Impossible: Linux Mission 1.0
2. Instalace
2.13 Nastavení sítě
V dalším kroku přichází na řadu konfigurace sítě. Instalátor nám nabídne seznam detekovaných
síťových zařízení, standardně je u nich nastaveno získání konfigurace pomocí protokolu DHCP.
DHCP je síťový protokol, který umožňuje prostřednictvím DHCP serveru v síti automaticky
přidělovat klientům IP adresy a předat další parametry nastavení sítě jako je výchozí brána či
servery DNS apod. Pokud DHCP používáte, můžete pokračovat dále. Pokud ne, pomocí tlačítka
"Upravit" vyvoláme konfigurační dialog (na obrázku), kde ručně nastavíme parametry síťového
rozhraní jako je IP adresa a maska sítě. Taktéž v případě nastavení jména systému zvolíme, zde se
nastavuje přes DHCP anebo jej zadáme ručně. V případě, že DHCP nepoužíváme ještě musíme
nastavit IP adresy výchozí brány (gateway) a alespoň jeden jmenný server (DNS). Nemáme­li
otřebné údaje během instalace po ruce, nic se neděje, síť je možné nakonfigurovat později po
dokončení instalace. 2.14 Nastavení firewallu
Používáme­li síťové připojení, rozhodně bychom z důvodů zabezpečení systému měli v
následujícím kroku povolit nastavení firewallu. Firewall je v podstatě ochranný filtr, který podle
vámi nastavených pravidel filtruje příchozí i odchozí síťový provoz na vašem počítači. Umožňuje
odstranit potenciálně nebezpečný provoz a zabránit neautorizovanému přístupu přes síť do vašeho
systému (tedy pokud je firewall správně nakonfigurován). Vzhledem k tomu že na veřejné sítě a
tedy i na Internet je třeba nahlížet jako na sice užitečné, ale ve své podstatě nedůvěryhodné médium,
měl by každý systém, který je k takové síti připojen firewall používat. Linux Mission obsahuje vestavěný kvalitní firewall. Pokud jej zapneme (volba "Povolit firewall"),
www.linuxzone.cz strana 20 / 159
Impossible: Linux Mission 1.0
2. Instalace
nebude systém akceptovat žádný síťový provoz zvenčí kromě takového provozu, který odpovídá na
vámi inicializovaný odchozí provoz. Používáte­li počítač jako pouze jako osobní systém a nehodláte
na něm provozovat síťové služby, které by měly být zvenčí přístupné, je toto implicitní nastavení
firewallu optimální bezpečnou volbou. Pokud hodláte nějaké zvenčí dostupné síťové služby provozovat (např. webový server, FTP server
apod.), pak v nastavení firewallu zatrhněte povolení průchodu firewallem pro ty služby, které
budete provozovat. Pokud vámi požadovaná služba na seznamu není, využijte políčka "Ostatní
porty" (ve formátu jméno_služby:protokol anebo číslo_portu:protokol, tedy např.
5492:tcp). Upozorňujeme, že některé zpřístupnění některých služeb zvenčí s sebou nese určitá
bezpečnostní rizika (např. hesla uživatelů v protokolu FTP nebo telnet lze snadno odposlechnout a
zneužít k neoprávněnému přístupu do systému, stejně tak špatně nakonfigurovaný SMTP server lze
zneužít k rozesílání nevyžádané pošty ­ spamu apod.). Vybraná síťová zařízení také lze označit jako důvěryhodná, což zajistí, že síťový provoz procházející
přes tato zařízení nebude firewallem filtrován. Takto je možné nakláldat se síťovými rozhraními,
připojených do lokálních, chráněných sítí. Z pochopitelných důvodů se rozhodně nedoporučuje
takto označit síťová rozhraní, která jsou přímo připojena do veřejných sítí (internetu). 2.15 Podpora dalších jazyků
Nyní je potřeba zvolit jazyk, který bude považován za implicitní pro tento systém. Kromě toho ale
můžete instalovat jazykovou podporu i pro další jazyky, mezi kterými je pak možné se za běhu
systému přepínat. www.linuxzone.cz strana 21 / 159
Impossible: Linux Mission 1.0
2. Instalace
2.16 Nastavení časové zóny
V tomto kroku vybereme časovou zónu, ve kterém se nacházíme (buď na mapě, anebo ji
nalistujeme v seznamu ­ pro Česko je to volba "Evropa/Praha"). Pokud chceme, aby systém
korektně pracoval s letním časem, je vhodné mít hardwarové hodiny nastavené v čase UTC (GMT)
a v tom případě zatrhneme volbu "Hardwarové hodiny používají čas v UTC". www.linuxzone.cz strana 22 / 159
Impossible: Linux Mission 1.0
2. Instalace
2.17 Nastavení hesla uživatele root
Dále je potřeba zadat heslo uživatele root. Uživatel root slouží v systému Mission k administraci
systému a má nejvyšší privilegia. I když je možné pod tímto uživatelem v systému normálně
pracovat, je z důvodů bezpečnosti žádoucí, abyste okamžitě po dokončení instalace systému založili
obyčejný účet nebo účty, které budete používat pro každodenní práci se systémem. Pokud budete
uživatelský účet root používat výhradně k administraci systému, ušetříte se tím možnosti
nechtěného poškození systému v důsledku překlepu či omylu. Ještě jednou jinými slovy: pokud v
systému pracujete jako obyčejný uživatel, můžete v nejhorším poškodit svá osobní data či nastavení
­ systém jako takový zůstává neporušen. Pokud něco smažete či přepíšete jako uživatel root, můžete
způsobit nefunkčnost celého systému. Založení uživatelského účtu pro obyčejnou každodení práci
se systémem by mělo to první, co po prvním spuštění Linuxu Mission uděláte. 2.18 Výběr software k instalaci
Nyní máme možnost ovlivnit výběr software, který bude instalován. Implicitně jsou nastaveny
skupiny softwarových balíčků v závislosti na tom, jaký typ instalace jsme zvolili v úvodu instalace
(osobní systém, pracovní stanice, server). Chceme­li ponechat implicitní výběr software, zatrhneme
volbu "Nainstalovat implicitní balíčky software" a pokračujeme v instalaci. www.linuxzone.cz strana 23 / 159
Impossible: Linux Mission 1.0
2. Instalace
V opačném případě, pokud se rozhodneme upravit sadu instalovaných balíčků software, se
dostaneme k další obrazovce, kde je dostupný software rozdělen do skupin podle účelu použití.
Můžeme volit instalaci jednotlivých skupin balíčků a u každé skupiny můžeme jít ještě o úroveň
níže a pomocí tlačítka "Detaily" vyvolat dialog, ve kterém jsou vypsány jednotlivé volitelné
aplikace a zde můžeme rozhodnout, které konkrétní aplikace se budou instalovat. Úplně dole na
konci seznamu záložka "Různé volby", kde je možné zvolit "minimální" instalaci (tato je použitelná
pouze pro určitá speciální nasazení systému, neboť zahrnuje skutečně jen to nejnutnější pro základní
běh systému). Naopak zvolením volby "Všechno" zvolíme instalaci veškerého software, který je na
instalačních médiích k dispozici. www.linuxzone.cz strana 24 / 159
Impossible: Linux Mission 1.0
2. Instalace
Pokud ručně zasahujeme do výběru software, instalační program se postará o kontrolu závislostí a
případný potřebný software doplní k instalaci ­ nehrozí tedy, že budeme instalovat produkt X, který
ke své funkčnosti vyžaduje software Y, který ale nenainstalujeme. 2.19 Zahájení instalace
Nyní máme poslední možnost se ještě vrátit zpět a případně provést změny anebo od instalace
systému upustit. Do této chvíle ještě instalátor na disku nic neměnil, potvrzením tohoto kroku již
začne instalační program zapisovat operační systém na disk. Pokud chcete instalaci zrušit, vyjměte
instalační média a stiskněte Ctrl+Alt+Del, alternativně stiskněte tlačítko Reset počítače. www.linuxzone.cz strana 25 / 159
Impossible: Linux Mission 1.0
2. Instalace
V průběhu instalace instalační program vypisuje, které balíčky právě instaluje, ukazuje průběh
instalace a očekávanou dobu dokončení instalace. Během instalace můžeme být v závislosti na
software zvoleném k instalaci požádáni, abychom vložili další instalační médium. 2.20 Vytvoř ení zaváděcí diskety
V závěru instalace máme možnost vytvoření zaváděcí diskety. Této možnosti bychom měli
rozhodně využít a disketu uschovat, protože umožňuje zavadení systému např. tehdy, poškodí­li se
www.linuxzone.cz strana 26 / 159
Impossible: Linux Mission 1.0
2. Instalace
instalovaný zavaděč systému na pevném disku. Bez zaváděcí diskety se neobejdeme také v tom
případě, pokud jsme v průběhu instalace rozhodli neinstalovat zavaděč na pevný disk. Také se třeba
může stát, že jsme zamýšleli využít pro zavedení systému zavaděče systému třetí strany, který ale z
nějakého důvodu nebude fungovat. 2.21 Dokončení instalace
Nyní už zbývá pouze vyjmout instalační médium a stiskem tlačítka "Restartovat" vyvolat restart
počítače (a případně ještě v BIOSu upravit pořadí zařízení, ze kterých počítač zavádí systém tak,
aby zavedl OS přednostně z pevného disku). www.linuxzone.cz strana 27 / 159
Impossible: Linux Mission 1.0
2. Instalace
2.22 Problémy př i instalaci
Pokud při instalaci narazíme na problém, můžou nám v diagnostice příčiny problému pomoci
podrobná chybová hlášení, která systém vypisuje na textové konzoli. Mezi konzolemi se lze
přepínat následujícím způsobem: •
•
•
•
•
virtuální textová konzole 1: je přístupná stiskem Alt+F1 (Ctrl+Alt+F1 z grafického režimu),
zde jsou obecné hlášení a chyby instalačního programu; virtuální textová konzole 2: je přístupná stiskem Alt+F2 (Ctrl+Alt+F1 z grafického režimu)
na této konzoli je k dispozici příkazová řádka, kterou zkušený uživatel může využít k
ručnímu odstranění problémů; virtuální textová konzole 3: je přístupná stiskem Alt+F3 (Ctrl+Alt+F1 z grafického režimu)
tady instalační program vypisuje jednotlivé absolvované kroky; virtuální textová konzole 4: je přístupná stiskem Alt+F4 (Ctrl+Alt+F1 z grafického režimu)
na této konzoli nalezneme výpisy a chybová hlášení linuxového jádra; virtuální konzole 7: je přístupná stiskem Alt+F7, na této konzoli běží instalační program. Nevíte­li si s nějakým problémem rady, poznamenejte si pokud možno detailní informace (použitý
hardware, podrobný popis problému, chybová hlášení) a obraťte se do diskusního fóra na webových
stránkách projektu Linux Mission. www.linuxzone.cz strana 28 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
3. Softwarový RAID
V této části manuálu naleznete informace potřebné pro provozování softwarového RAIDu v
systému Linux Mission, včetně specifik instalace systému na RAID zařízení. Tato část je určená pro
zkušenější uživatele a předpokládá, že čtenář je již obeznámem s principy fungování OS Linux. Disková pole (RAID) představují možnost jak zvýšit výkon / kapacitu diskového subsystémů anebo
posílit jeho odolnost vůči výpadku hardware (redundance). Disková pole lze implementovat čistě na
úrovni hardware, ale také softwarové na úrovni OS. Řada dnešních OS obsahuje implementace
softwarových variant RAIDu a ani Linux není výjimkou. Cílem této části manuálu je poskytnout
přehled o možnostech, stabilitě a výkonu softwarového RAIDu pod OS Linux Mission. Podívejme
se tedy na principy fungování RAIDu, výhody / nevýhody softwarového RAIDu ve srovnání s
hardwarovými řešeními, implementace RAIDu pod Linuxem, obslužný software, možnosti
autodetekce a automatické sestavení poli jádrem, možnosti rekonfigurace polí pomocí nástroje
raidreconf a optimalizace polí. Softwarový RAID je cenově lákavou alternativou nákladných hardwarových řešení. Další výhodou
je flexibilita (např. možnost sestavení pole v degradovaném režimu, možnost eventuální částečné
záchrany dat v případě výpadku celého pole, protože je známá struktura dat v diskovém poli,
konverze RAID svazků z jednoho typu RAIDu na jiný). Některé z těchto možností (např. zmíněná
možnost konverze jednoho typu RAIDu na jiný pomocí utility raidreconf) jsou ale spíše
experimentálního rázu. Softwarový RAID je náročnější na systémové prostředky než čistě
hardwarová řešení, s dnes běžných výkonnými procesory je obvykle softwarový RAID výrazně
rychlejší než hardwarové varianty. Je tedy na adminstrátorovi, aby zvážil výhody a nevýhody
sofwarového či hardwarového RAIDu vzhledem k aktuálním podmínkám. www.linuxzone.cz strana 29 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
3.1 Hardwarové a softwarové implementace RAIDu
RAID lze provozovat v podstatě dvojím způsobem. Buď je realizován v hardwaru, což obnáší
speciální řadič osazený procesorem a zpravidla vybavený vlastní pamětí, která slouží jako cache.
Veškeré funkce RAIDu plní řadič a z pohledu operačnímu systému se chová jako jediný disk. Tato
řešení bývají poměrně drahá (Mylex, DPT ­ nyní Adaptec, ICP Vortex, velcí výrobci PC jako HP,
IBM, Compaq apod. mají své vlastní implementace). Předností hardwarových řešení bývá
maximální spolehlivost a ve srovnání se softwarovou variantou RAIDu dovedou odlehčit zátěži
systému. RAID ovšem také může být realizován patřičným ovladačem na úrovni operačního
systému a spousta operačních systémů to také dnes umožňuje. Toto řešení může být za jistých
okolností flexibilnější a rychlejší, ale také náročnější na systémové prostředky ­ zejména na čas
procesoru. V posledních letech se setkáváme i s napůl hardwarovými/softwarovými
implementacemi RAIDu, kdy hardware obsahuje jen minimální podporu a většinu práce dělá
ovladač; zatímco dříve existovaly hardwarové řadiče RAIDu pouze v provedení SCSI, nyní jsou
dostupné také řadiče s rozhraním IDE (3ware, Promise a další). Tyto varianty jsou levné, ale řada
produktů této kategorie je nevalné kvality a výkonu. Dále se budeme zabývat pouze softwarovým
RAID pod Linuxem. 3.2 Teorie fungování RAIDu
Dříve než se zaměříme na detaily implementace softwarového RAIDu pod Linuxem, podíváme se
na princip fungování jednotlivých typů RAIDu a jejich vlastnosti. 3.2.1 RAID 0 (Nonredundant striped array)
Tento typ je určen pro aplikace, které vyžadují maximální rychlost a není redundantní. Naopak je
potřeba vzít v úvahu, že pravděpodobnost výpadku takového pole roste s počtem disků. Ideální
použití představují audio/video streamingové aplikace, eventuálně databáze a obecně aplikace, při
kterých čteme sekvenčně velká množství dat. Základní jednotkou pole je tzv. stripe (z angl. "stripe",
česky pruh), což je blok dat určité velikosti (běžně 4­4096 kB v závislosti na aplikaci). Po sobě
jdoucí data jsou pak v poli rozložena střídavě mezi disky do "stripů" takovým způsobem, aby se při
sekvenčním čtení/zápisu přistupovalo ke všem diskům současně. Tím je zajištěna maximální
rychlost jak při čtení tak i zápisu, ale současně je tím dána také zranitelnost pole. Při výpadku
kteréhokoliv disku se stávají data v podstatě nečitelná (respektive nekompletní). RAID 0 bývá
označován rovněž jako striping. Protože není redundantní, má nejvýhodnější poměr cena/kapacita.
Počet disků je libovolný. Je ovšem třeba pamatovat na to, že s rostoucím počtem disků v poli roste i
pravděpodobnost výpadku pole (protože výpadek libovolného disku znamená havárii celého pole);
RAID 0 je tedy velmi rychlý, ale méně bezpečný než samostatný disk. www.linuxzone.cz strana 30 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
3.2.2 RAID 1 (Mirrored array)
RAID 1 je naopak maximálně redundantní. Rychlost čtení může být oproti samostatnému disku
výrazně vyšší, rychlost zápisu je stejná jako u samostatného disku. Funguje tak, že data jsou při
zápisu "zrcadlena" na všechny disky v poli (tedy v případě RAIDu 1 tvořeného dvěma disku jsou
data duplikována apod.). Při čtení lze využít vícero kopií dat a podobně jako u RAIDu 0 číst za
všech disků současně. (Tedy abychom byli přesní, ne tak docela. Pokud bychom chtěli na RAIDu 1
při sekvenčním čtení "stripovat" stejně jako u RAIDu 0, museli bychom číst data ze zrcadlených
disku ob jeden sektor ­ na zrcadlech totiž máme kompletní data a nevyhneme se tedy přesunům
hlaviček disku. Proto nárůst výkonu nebude tak dramatický, jako u RAIDu 0). Tento typ pole je
určen pro aplikace s důrazem na maximální redundanci. Výhodou tohoto redundantního řešení je
stabilní výkon i v případě výpadku disku, nevýhodou je poměr cena/kapacita. Počet disků bývá buď
2 anebo libovolný, čím větší počet disků, tím větší redundance a odolnost proti výpadku. www.linuxzone.cz strana 31 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
3.2.3 RAID 4 (Striped array with parity)
Raid 4 je redundantní pole, které se dnes již používá málo. Jeho nástupcem je RAID 5, který je
výkonnější. Funguje tak, že jeden disk je vyhrazen jako tzv. paritní disk. Na paritním disku je
zaznamenán kontrolní součet (operace XOR přes data stejné pozice jednotlivých disků). Pokud tedy
dojde k výpadku některého z datových disků, lze data rekonstruovat z dat zbylých disků a parity
uložené na paritním disku. RAID 4 je odolný vůči výpadku libovolného jednoho disku a má tedy
příznivý poměr cena/kapacita. Paritní disk ale představuje úzké hrdlo této architektury při zápisech,
protože každý zápis znamená také zápis na paritní disk. Mimimální počet disků je 3. www.linuxzone.cz strana 32 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
3.2.4 RAID 5 (Striped array with rotating parity)
Tento typ poskytuje redundanci vůči výpadku libovolného jednoho disku s dobrým poměrem
cena/kapacita a výkonem. RAID 5 je vylepšená varianta RAIDu 4 v tom, že parita není uložena na
jednom vyhrazeném disku, ale je rozmístěna rovnoměrně mezi všemi disky pole, čímž se odstraní
úzké hrdlo architektury RAIDu 4. www.linuxzone.cz strana 33 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
Paritu lze spočítat buď tak, že skutečně načteme a XORujeme data z odpovídajících datových stripů
všech disků (takto se parita počítá při inicializaci pole, vyžaduje to tedy přístup ke všem diskům).
Ve druhém případě načteme původní data z datového stripu, která se mají změnit, provedeme XOR
s novými daty a výsledek ještě XORujeme s původní hodnotou parity (takto se parita počítá na již
inicializovaném běžícím poli). Zápis dat tedy představuje dvoje čtení (dat a parity), výpočet parity a
dvojí zápis (opět dat a parity). Počet přístupů na disk při zápisu je v tomto případě konstantní bez
ohledu na počet disků v poli ­ přistupuje se vždy ke dvěma diskům ­ a to také má za následek nižší
výkon tohoto typu pole ve srovnání s redundantním RAIDem 1. www.linuxzone.cz strana 34 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
V degradovaném režimu (degradovaný režim znamená stav, kdy je některý z disků z pole vyřazen
kvůli hardwarové chybě) se pak musejí data uložená na vadném disku odvodit z dat zbývajících
disků a parity. Na rozdíl od redundantního RAIDu 1, kde výpadek disku obvykle neznamená
výrazný pokles výkonu, vykazuje RAID 5 v degradovaném režimu výrazně snížený výkon zejména
při čtení. Minimální počet disků pro tento typ diskového pole jsou 3. www.linuxzone.cz strana 35 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
3.2.5 Kombinace více typů polí
Z definic výše popsaných typů polí vyplývá, že redundantní pole nejsou tak rychlá, jak bychom si
mohli přát a naopak u RAIDu 0 nám chybí redundance. Existuje ovšem možnost, jak výhody
jednotlivých typů diskových polí spojit. Tato metoda spočívá ve vytvoření kombinovaných polí,
kdy disky v poli určitého typu jsou samy tvořeny poli jiného typu. Příkladem může být např. RAID
1+0, kdy jsou pole typu RAID 1 dále sloučeny do RAIDu 0. Takové pole je pak redundantní
(toleruje výpadek až dvou disků), rychlejší zejména v zápisech než samotný RAID 1, a má lepší
poměr cena/kapacita než RAID 1 (velikost je zde n/2 * disk a minimální počet disků je pak 4. Další
možností je třeba RAID 0+1, RAID 5+0, RAID 5+1 apod. 3.2.6 Redundantní pole neznamenají konec záloh
Redundantní disková pole jsou odolná pouze vůči výpadkům určitého počtu disků. Neochrání před
výpadkem napájení, poškozením souborového systému při pádu celého systému nebo chybou
administrátora systému. Proto je potřeba myslet i na další metody ochrany dat ­ např. na záložní
zdroje napájení (UPS), žurnálovací souborové systémy apod. a v každém případě pravidelně
zálohovat. 3.3 Typy polí podporovaných Linuxovým ovladačem RAIDu
Až doposud jsme se zabývali pouze teorií fungování diskových polí, podívejme se tedy jak to
vypadá se softwarovým RAIDem v Linuxu. Softwarová implementace RAIDu pod OS Linux
podporuje 5 typů diskových polí: •
•
•
•
•
Linear: toto v podstatě není RAID, jedná se o možnost "pospojování" více disků do jednoho.
Co se týče rychlosti, neliší se příliš od výkonu samostatných disků. Není redundantní,
výhodou však je např. oproti RAIDu 0 to, že se v případě havárie jednoho z disků dají data
ze zbývajících disků snáze obnovit, protože se nestripuje. RAID 0: zde je volitelná velikost stripu; tato výrazně (v závislosti na aplikaci) ovlivňuje
výkon RAIDu. RAID 1: oproti klasické definici RAIDu 1 kdy se disky spojují pouze do párů, pod Linuxem
můžeme vytvořit RAID 1 i z více než dvou aktivních disků. RAID 4: je sice implementován, ale funkčně nahrazen RAIDem 5 RAID 5: opět je zde volitelná velikost stripu, která ovlivňuje výkon RAIDu. 3.4 Konfigurace
Pro konfiguraci softwarového RAIDu se používá konfigurační soubor /etc/raidtab, ve kterém
se používají následující direktivy: •
raiddev: touto direktivou definice pole začíná, následuje označení pole. Svazky
www.linuxzone.cz strana 36 / 159
Impossible: Linux Mission 1.0
•
•
•
•
•
•
•
•
•
•
•
3. Softwarový RAID
softwarového RAIDu se označují md1, md2 atd. raid-level: následuje direktivu raiddev, uvádíme zde typ pole (­1 pro linear, 0 pro
RAID 0, 1 pro RAID 1, 5 pro RAID 5). persistent-superblock: tato direktiva bude popsána níže, týká se kompatibility se
starší verzí RAIDu. chunk-size: velikost stripu, maximální velikost je 4MB (což je dáno konstantou
MAX_CHUNK_SIZE ovladače, kvůli eventuální změně by bylo nutné provést úpravu ve
zdrojovém kódu a znovu sestavit linuxové jádro), udává se v kB. nr-raid-disks: zde uvádíme kolik diskových oddílů bude součástí pole. nr-spare-disks: počet rezervních disků v poli direktiva device jméno_oddílu následovaná jednou z direktiv raid-disk, sparedisk, parity-disk nebo failed-disk: tyto direktivy deklarují příslušné oddíly, které
budou součástí pole. raid-disk: tento oddíl bude aktivním oddílem. spare-disk: tento oddíl bude sloužit jako rezervní. parity-disk: tento oddíl bude sloužit jako paritní disk (RAID 4). failed-disk: tento oddíl bude při inicializaci pole přeskočen (má význam pouze při
sestavování pole v egradovaném stavu, viz diskuse níže). parity-algorithm: specifikuje schéma rozložení parity u RAIDu 5 (možnosti jsou: left­
symmetric, right­symmetric, right­asymmetric; z podporovaných je obecně nejrychlejší left­
symmetric). 3.5 Obslužný software ­ Raidtools
Balíček raidtools obsahuje obslužné utility nezbytné k manipulaci s diskovými poli: •
•
•
•
•
•
•
mkraid: pro inicializaci polí; raidstart: pro spouštění diskových polí; raidstop: pro vypnutí diskových polí; raidhotadd: přidá nový diskový oddíl do aktivního diskové pole (náhradou za vadný
oddíl, pokud jsou všechny oddíly pole funkční, přidá nový oddíl jako rezervní ­ "spare­
disk"). Nelze tedy použít pro rozšíření kapacity pole; raidhotremove: odejme vadný diskový oddíl z~aktivního diskového pole; raidsetfaulty: označí funkční diskový oddíl jako vadný, tím umožní jeho odejmutí z
pole příkazem raidhotremove (možné využití např. při testování nebo výměnách
funkčních disků); raid0run: utilita pro spouštění starších polí typu linear nebo RAID 0 bez perzistentních
superbloků (viz níže "Perzistentní superbloky a RAID 0 / linear"). Poznámka na vysvětlenou: Soubor raidtab odráží konfiguraci polí v době jejich sestavení, ovšem
pokud třeba později vyměníme nebo přesuneme některé disky, nemusí již odrážet skutečnou
konfiguraci. Pokud tedy z nějakého důvodu potřebujeme pole znovu inicializovat anebo ho jen
startujeme pomocí raidstart, nesmíme zapomenout soubor raidtab ručně upravit, abychom
www.linuxzone.cz strana 37 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
se ušetřili v budoucnu nepříjemností. 3.6 Alternativní obslužný software ­ Mdadm
K balíčku raidtools existuje další alternativa ­ tou je utilita mdadm. Tato utilita nemusí používat
žádný konfigurační soubor, vše potřebné lze zadat na příkazové řádce, anebo to zjistí analýzou
RAID superbloků uložených na discích (podobně funguje automatické startování polí jádrem při
bootu). Cílem autora je tedy přidat výhody a robustnost, kterou poskytuje vlastnost samosestavení
diskových polí jádrem a zárověň se vyhnout potenciálním konfliktům mezi neaktuální konfigurací v
souboru raidtab a skutečnou konfigurací polí, ke kterým někdy může dojít, pokud používáme
raidtools. Nástroj mdadm je velmi flexibilní a stabilní, takže jeho vyzkoušení/použití lze pro
zkušené uživatele doporučit. 3.7 Inicializace polí
Jakmile máme odpovídajícím způsobem rozdělené disky a připravený konfigurační soubor /
etc/raidtab, můžeme pole inicializovat utilitou mkraid, která pole sestaví a aktivuje. Pokud
zakládáme pole s perzistentními RAID superbloky (což je obvyklé, pole bez persizstentních
superbloků jsou poporována jen z důvodu zpětné kompatibility ­ viz níže), pak mkraid vypíše i
pozici RAID superbloků: # mkraid
/dev/md5
handling MD device /dev/md5
analyzing super-block
disk 0: /dev/sda7, 20163568kB, raid superblock \
at 20163456kB
disk 1: /dev/sdb7, 20163568kB, raid superblock \
at 20163456kB
Po úspěšné inicializaci bychom měli v souboru /proc/mdstat, který obsahuje informace a
aktivních polích, vidět odpovídající záznam, např: # cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
read_ahead 1024 sectors
md0: active raid1 sdb1[1] sda1[0] 131968 blocks [2/2] [UU]
Poté nám nic nebrání pole zformátovat např. pomocí mkfs.ext3, pokud chceme na poli
provozovat žurnálovací souborový systém ext3. Utilita mkfs pro souborový systém ext2 respektive
ext3 akceptuje volbu ­R stride=X, která udává kolik bloků souborového systému obsahuje 1 "stripe"
pole. Tím pádem je také vhodné zadat ručně velikost bloku (parametr -b). Např. mějme pole typu
www.linuxzone.cz strana 38 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
RAID 0 s velikostí stripu 16 kB. Pokud budeme chtít použít velikost bloku souborového systému 4
kB, zadáme: mkfs.ext3 /dev/md0 -b 4096 -R stride=4
3.8 Raid autodetect anebo raidstart?
Nyní tedy máme funkční diskové pole. Zbývá vyřešit způsob, jakým se bude pole vypínat při
vypnutí systému a zapínat při startu systému. Jednou možností je použití utilit raidstart a
raidstop. Tuto možnost využívají startovací skripty Linuxu Mission (ze skriptu /
etc/rc.d/rc.sysinit je raidstart volán automaticky, existuje­li soubor /
etc/raidtab a raidstop je volán ze skriptu /etc/rc.d/init.d/halt.). Druhou, robustnější metodou je využití možnosti automatické aktivace polí jádrem při bootu. Aby
mohla fungovat, je potřeba v prvé řadě používat perzistentní RAID superbloky a všechny diskové
oddíly, které jsou součástí polí, musejí být v tabulce oddílů označeny jako typ "Linux raid
autodetect", (tedy hodnota 0xfd hexadecimálně) a samozřejmě mít v jádře zapnutou podporu
autodetekce RAID polí. Výhodou tohoto řešení navíc je, že jakmile je diskové pole inicializováno, nepoužívá se již pro
opětovný start nebo zastavení pole konfigurační soubor /etc/raidtab. O sestavení a spuštění
pole se postará ovladač RAIDu, který na všech diskových oddílech typu "Linux raid autodetect"
vyhledá RAID superbloky a na základě informací v RAID superblocích pole spustí. Stejně tak
ovladač RAIDu všechny pole korektně vypne v závěrečné fázi ukončení běhu systému poté, co jsou
odpojeny souborové systémy. I v případě změny jmen disků nebo po přenesení disků na úplně jiný
systém tedy pole bude korektně sestaveno a nastartováno. Pokud bychom chtěli používat tuto
možnost, museli bychom upravit startovací skripty systému (v krátkosti: ve sktripu linuxrc
ramdisku initrd je třeba spustit raidautorun a v rc.sysinit zakomentovat volání
raidstart, podrobnosti viz manuálové stránky nash, initrd). Kromě toho ještě existuje další možnost, jak systému při startu sdělit, jakým způsobem má pole
sestavit ­ a to pomocí parametru jádra md přes prompt zavaděče systému. 3.9 RAID superblok
Každý diskový oddíl, který je součásti raid svazku (výjimku tvoří pouze svazky bez perzistentních
superbloků, viz níže) obsahuje tzv. RAID superblok Tento superblok je 4kB část RAID oddílu
vyhrazená pro informace o příslušnosti daného oddílu k určitému poli a o stavu pole. Prohlédnout si jej můžeme např. pomocí utility mdadm. Pokud ji nemáme k dispozici, vypomůžeme
si utilitou od (spuštěnou s vhodnými parametry, např. od -Ax -tx4) poté, co si jej příkazem dd
někam zkopírujeme. Pro kontrolu, superblok vždy začíná magickým číslem 0xa92b4efc.
www.linuxzone.cz strana 39 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
Superblok obsahuje zejména následující informace: •
•
•
•
•
•
•
•
•
•
•
•
verzi ovladače raidu, kterým byl vytvořen, jedinečný identifikátor pole, typ RAIDu, datum vytvoření RAID svazku, počty disků (aktivních, rezervních apod.), preferované vedlejší číslo RAID zařízení, stav pole, kontrolní součet superbloku, počet updatů superbloku, datum posledního updatu superbloku, velikost stripu, informace o stavu jednotlivých diskových oddílů. 3.10 Perzistentní superbloky a RAID 0 / linear
Pokud provozujeme pole RAID 0 či linear, máme možnost zvolit variantu bez použití perzistentního
superbloku. Volba persistent-superblock 0, znamená, že se RAID superblok nebude
ukládat na disk. Tato možnost existuje z důvodů zachování kompatibility s polemi zřízenými
pomocí starší verzí ovladače RAIDu, které superbloky nepoužívaly. Po vypnutí takového pole
nezůstane na svazku informace o konfiguraci a stavu pole. Proto je tato pole nutné vždy znovu
inicializovat při každém startu buď utilitou mkraid, nebo pomocí utility raid0run (což je pouze
symbolický odkaz na mkraid) a nelze pak využít automatického startování polí jádrem při bootu. Poznámka: Na tuto volbu je třeba dávat pozor při konfiguraci ­ pokud při konfiguraci pole RAID 0
direktivu persistent­superblock vynecháme, použije se standardní hodnota 0, tedy pole bez
perzistentních superbloků, což zpravidla není to, co zamýšlíme! 3.11 Monitorování stavu pole
Aktuální stav diskových polí zjistíme vypsáním souboru /proc/mdstat. První řádek obsahuje
typy polí, které ovladač podporuje (záleží na konfiguraci jádra). U jednotlivých RAID svazků je pak
uvedeno které diskové oddíly svazek obsahuje, velikost svazku, u redundantních polí pak celkový
počet konfigurovaných oddílů a z toho počet funkčních, následovaný schématem funkčnosti v
hranatých závorkách. Následující příklad uvádí stav funkčního pole RAID 1: md0: active raid1 hdc1[1] hda1[0] 136448 blocks [2/2] [UU]
Druhý příklad uvádí stav pole RAID 1 po výpadku jednoho disku, oddíl sdc1 je označen jako
nefunkční (F=Failed místo čísla aktivního oddílu): md0: active raid1 sdc1[F] sdd1[0] 8956096 blocks [2/1] [U_]
www.linuxzone.cz strana 40 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
Třetí příklad ukazuje stav pole RAID 1, kdy probíhá rekonstrukce: md1: active raid1 hdc2[1] hda2[0] 530048 blocks [2/2] \
[UU] resync=4\% finish=6.7min
Součástí raidtools bohužel není samostatná utilita k monitorování stavu diskových polí, takže si
administrátor musí vypomoci skriptem, který je pravidelně spouštěn zc cronu a kontroluje /
proc/mdstat (jednoduše např. tak, že si skript na disk uloží obsah /proc/mdstat nebo jeho
MD5 součet a následně kontroluje, jestli se /proc/mdstat změnil; v případě změny pak
prostřednictvím e­mailu uvědomí administrátora). Další možnost je filtrovat systémový log. Napoak
pohodlným způsobem umí monitorovat stav RAID polí nástroj mdadm (včetně možnosti zasílání
zpráv e­mailem). 3.12 Rekonstrukce pole
Redundantní typy polí je třeba po inicializaci, po výměně disku, nebo po automatickém nahrazení
vadného disku rezervním (viz direktiva spare-disk v /etc/raidtab) rekonstruovat či
synchronizovat. Ve všech případech systém rekonstrukci spouští automaticky. Průběh rekonstrukce
je možné sledovat v /proc/mdstat (viz příklad o několik řádek výše). Rekonstrukce probíhá s
nízkou prioritou, nezabere tedy čas procesoru na úkor jiných aplikací, ale bude se snažit využít
maximální prostupnosti I/O zařízení. Proto můžeme po dobu rekonstrukce pozorovat zpomalení
diskových operací. Maximální rychlost rekonstrukce ovšem také lze ovlivnit nastavením limitu v /
proc/sys/dev/raid/speed-limit-max, výchozí hodnota je 100 kB/sec. Ovladač RAIDu
umí současně spustit rekonstrukci na několika polích současně. Pokud jsou však oddíly jednoho
disku součástí více polí, které by se měly synchronizovat současně, provede se synchronizace polí
postupně (z důvodu výkonnosti). V systémovém logu se pak objeví neškodné hlášení typu "XX has
overlapping physical units with YY": md: syncing RAID array md1
md: minimum _guaranteed_ reconstruction speed: 100 KB/sec.
md: using maximum available idle IO bandwith for \
reconstruction.
md: using 128k window.
md: serializing resync, md2 has overlapping physical \
units with md1!
md: md1: sync done.
md: syncing RAID array md2
md: minimum _guaranteed_ reconstruction speed: 100 KB/sec.
md: using maximum available idle IO bandwith for \
reconstruction.
md: using 128k window.
md: md2: sync done.
www.linuxzone.cz strana 41 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
V /proc/mdstat jsou ty svazky, na kterých je rekonstrukce pozastavena, označeny jako plně
funkční, ale je u nich poznámka resync=DELAYED: Personalities : [linear] [raid0] [raid1] [raid5]
read_ahead 1024 sectors
md2 : active raid1 hdc3[1] hda3[0] 530048\
blocks [2/2] [UU] resync=DELAYED
md1 : active raid1 hdc2[1] hda2[0] 530048\
blocks [2/2] [UU] resync=4\% finish=6.7min
md0 : active raid1 hdc1[1] hda1[0] 136448\
blocks [2/2] [UU]
3.13 Redundantní pole: výměna disku, hot plug
Pokud při čtení nebo zápisu na některý z diskových oddílů, který je součástí redundantního
diskového pole, dojde k chybě, je dotyčný oddíl označen jako vadný a pole jej přestane používat.
Pokud máme v daném diskovém poli zařazen jeden nebo více rezervních disků (direktiva sparedisk), je tento v případě výpadku automaticky aktivován, systém provede rekonstrukci pole a
průběh rekonstrukce zaznamená do systémového logu. V opačném případě pole zůstane v provozu v
degradovaném režimu, pak to v systémovém logu bude vypadat zhruba takto: kernel: SCSI disk error : host 0 channel 0\
id 4 lun 0 return code = 28000002
kernel: [valid=0] Info fld=0x0, Current sd08:11:\
sense key Hardware Error
kernel: Additional sense indicates\
Internal target failure
kernel: scsidisk I/O error:\
dev 08:11, sector 2625928
kernel: raid1: Disk failure on sdb1,\
disabling device.
kernel: Operation continuing on 1 devices
kernel: md: recovery thread got woken up ...
kernel: md0: no spare disk to reconstruct\
array! - continuing in degraded mode
kernel: md: recovery thread finished ...
Příjemnou vlastností diskových polí je také možnost výměny disku za chodu systému. Samozřejmě
k tomu potřebujeme v prvé řadě hardware, který to umožňuje. Ovladače slušných SCSI řadičů
umožňují přidávání či ubírání zařízení, to ale samo o sobě nestačí. Je zapotřebí používat SCA disky
určené pro hot swap a odpovídající SCSI subsystém s SCA konektory a elektronikou, která zajistí
stabilitu SCSI sběrnice při odebírání či přidávání zařízení. Existují také některé řadiče disků na bázi
IDE, které hot swap podporují. Mějme pole typu RAID 1, ve kterém došlo k chybě na oddílu sdc1. Disk sdc1 je připojen ke kanálu
0 SCSI řadiče 0 a má ID rovno 4: www.linuxzone.cz strana 42 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
md0: active raid1 sdc1[F] sdd1[0] 8956096 blocks [2/1] [U_]
Jak tedy probíhá výměna vadného disku SCSI, máme­li ktomu potřebné hardwarové vybavení: •
•
•
•
•
•
•
provedeme raidhotremove /dev/md0 /dev/sdc1, což vyřadí vadný oddíl z pole
md0, provedeme příkaz echo "scsi remove-single-device 0 0 4 0"
>/proc/scsi/scsi, ovladač SCSI řadiče zapomene na zařízení na řadiči 0, kanálu 0, ID
4, LUN 0, vyjmeme vadný disk sdc, vložíme nový disk sdc, dále vykonáme příkaz echo "scsi add-single-device 0 0 4 0"
>/proc/scsi/scsi, což nový disk zpřístupní systému, pomocí utility fdisk vytvoříme diskové oddíly, vykonáme raidhotadd /dev/md0 /dev/sdc1, čímž přidáme oddíl sdc1 nového
disku do pole md0 a na pozadí se spustí rekonstrukce pole. Pokud nemáme hardware potřebný k hot­swap výměně disků, musíme se smířit s vypnutím
systému, výměnou vadného disku a opětovným zapnutím systému. Potom stačí pouze vytvořit např.
pomocí nástroje fdisk odpovídající diskové oddíly a příkazem raidhotadd je zařadit do
diskového pole. Jinak příkazy pro přidávaní a ubírání SCSI zařízení jsou popsány ve zdrojovém
kódu jádra (soubor linux/drivers/scsi/scsi.c). 3.14 Možnosti rekonfigurace polí
Pro offline konverzi jednoho typu RAIDu do jiného lze použít nástroj raidreconf. Tento nástroj
je ovšem stále ještě ve vývoji a není zcela stabilní, použití zálohy dat je v tomto případě nutností.
Změníme­li velikost diskového pole, musíme pak ještě upravit velikost souborového systému
(pokud používáme souborový systém ext2/ext3, můžeme použít utilitu resize2fs). Utilita
raidreconf není standardní součástí Mission, je třeba ji získat z internetu. 3.15 Optimalizace polí, výkon
Výkon diskových polí velmi záleží na vhodně zvolené velikosti stripu (to je samozřejmě
aplikovatelné u polí RAID 0 a RAID 5). Jak jsem již zmínil, také souborový systém ext3 lze
optimalizovat pro užití na diskovém poli; nástroji mkfs pro zakládání ext2/ext3 souborových
systémů lze pomocí volby -R stride=XX zadat, kolik bloků souborového systému odpovídá
velikosti stripu. Vhodným nástrojem pro testování propustnosti I/O subsystému jsou nástroje
bonnie++, tiotest a další. Pokud jde o srovnání rychlosti softwarového RAIDu a hardwarových řešení, softwarový RAID je
oproti hardwarové implementaci samozřejmě náročnější na systémové prostředky (což vzhledem k
www.linuxzone.cz strana 43 / 159
Impossible: Linux Mission 1.0
3. Softwarový RAID
rychlosti dnešních procesorů nebývá problém), ale na druhou stranu bývá mnohdy rychlejší
(výrazně rychlejší bývá zejména RAID 0). 4. LVM ­ Logical Volume Manager (Správa
logických oddílů)
Kromě RAIDu linuxové systémy disponují ještě jednou vymožeností, která může uživatelům
značně zpříjemnit život. Jedná se o LVM (Logical Volume Manager), který představuje alternativu
ke klasickému rozdělování diskového prostoru. Výhodou použití LVM je např. to, že logické
svazky lze (na rozdíl od použití klasických diskových oddílů) za chodu systému zvětšovat /
zmenšovat, případně i přesouvat. Asi nejlepší způsob, jak výhody LVM prezentovat, je ukázat to na příkladu. Dejme tomu, že se při
instalaci systému rozhodneme rozdělit disk určitým způsobem: vyhradíme si diskový oddíl pro
svazek /boot, další pro kořenový svazek /, dále pro odkládací oddíl (swap) a také pro svazek /
home s uživatelskými daty. Po nějaké době zjistíme, že se nám ve svazku připojeném jako /home
nedostává místa, zatímco v kořenovém svazku ještě máme prozatím místa dost. V této chvíli máme
několik možností, např: •
•
•
•
můžeme systém přeinstalovat s jiným rozdělením disku, můžeme offline pomocí vhodných nástrojů (tedy např. nabootovat nějakou záchrannou
distribuci) přesouvat data a upravovat velikost diskových oddílů a souborových systémů, můžeme v kořenovém svazku vytvořit nějaký adresář, do něhož se budeme někde z /home
odkazovat symblickým odkazem a další uživatelská data budeme ukládat sem, můžeme si přikoupit další disk a připojit jej někam do /home. Všechna tato řešení ale nejsou dvakrát pohodlná a tak či tak nám po nějaké době dojde místo pro
změnu v kořenovém svazku a problém budeme řešit znovu. Pokud bychom používali LVM, situace by byla mnohem jednodušší. Ve chvíli, kdy nám ve svazku
/home dojde místo zatímco ve svazku / máme místa habaděj, můžeme přímo za chodu systému
svazek / zmenšit a o ušetřené místo rozšířit /home. Tedy žádné složité laborování s diskovými
oddíly nebo dokonce reinstalace systému. Stejně tak po přikoupení dalšího disku můžeme libovolně
svazky / nebo /home rozšířit o prostor nového disku. LVM se samozřejmě velmi hodí a často bývá nasazován hlavně tam, kde spravujeme rozsáhlý
diskový prostor, ale jak demonstruje výše uvedený příklad, můžeme jej směle využít i na domácím
systému. LVM lze také kombinovat se softwarovým RAIDem. www.linuxzone.cz strana 44 / 159
Impossible: Linux Mission 1.0
4. LVM ­ Logical Volume Manager (Správa logických oddílů)
4.1 Teorie fungování LVM
Nejprve je potřeba seznámit se s terminologií LVM: •
•
•
•
•
volume group (skupina svazků ­ VG): je nejvyšší administrativní jednotka v rámci LVM.
Obsahuje fyzické a logické svazky. V systému může existovat více skupin svazků. physical volume (fyzický svazek ­ PV): může to být pevný disk, diskový oddíl, ale třeba i
zařízení RAID. Z jednoho nebo více fyzických svazků se následně vytváří skupiny svazků
(VG). logical volume (logický svazek ­ LV): obdoba diskového oddílu ze systémů, kde se
nepoužívá LVM. Je k dispozici jako blokové zařízení, na které můžeme umístit soubrový
systém. Je na adminstrátorovi kolik logických svazků a jaké velikosti uvnitř dané skupiny
svazků (VG) vytvoří. Tyto logické svazky pak lze za běhu systému podle potřeby zvětšit
nebo zmenšit. physical extent (PE): Každý fyzický svazek je rozdělen do menších částí, označovaných jako
"physical extent" (typická velikost PE může být např. 32 MB). Určuje granularitu, s jakou je
v rámci skupiny svazků rozdělován diskový prostor. V rámci jedné skupiny svazků mají
všechny fyzické svazky stejnou velikost PE. logical extent (LE): Obdobě logický svazek sestává z menších částí, označovaných jako
"logical extent". V rámci jedné skupiny svazků mají všechny logické svazky stejnou velikost
LE, která je současně shodná s velikostí PE fyzických svazků. Celé to pak může vypadat např. takto: mějme k dispozici dva disky (hda a hdc), na každém
vytvoříme jeden diskový oddíl zabírající celý disk (hda1 a hdc1). Z obou diskových oddílů
vytvoříme fyzické svazky (PV) a začleníme je do skupiny svazků pojmenované "mygroup". V
rámci této skupiny svazků, která zahrnuje veškerý prostor obou dvou disků pak vytvoříme podle
potřeby logické svazky (LV), na které umístíme jednotlivé souborové systémy: "rootlv" pro
připojení na /), "varlv" pro připojení na /var, "usrlv" pro připojení na /usr a "homelv" pro
připojení na /home. www.linuxzone.cz strana 45 / 159
Impossible: Linux Mission 1.0
4. LVM ­ Logical Volume Manager (Správa logických oddílů)
4.1.1 Mapování svazků
Při vytváření logických svazků můžeme zvolit, jakým způsobem se budou mapovat LE na PE.
Můžeme zvolit buď lineární mapování, kdy jsou řazeny za sebou nejprve PE prvního fyzického
svazku a teprve potom následují PE dalšího fyzického svazku (podobně jako o softwarového
RAIDu typu linear). Tento případ také ilustruje první obrázek (výše). Alternativou je "stripování",
které je jakousi obdobou softwarového RAIDu 0 (s tím, že granularita stripování je u softwarového
RAIDu jemnější a tedy nárůst výkonnosti větší). V tomto případě se PE jedotlivých fyzických
svazků střídají. Následující obrázek ukazuje situaci, kdy je v případě logického svazku "homelv"
použito stripování. www.linuxzone.cz strana 46 / 159
Impossible: Linux Mission 1.0
4. LVM ­ Logical Volume Manager (Správa logických oddílů)
4.2 Práce s LVM
Teorii LVM máme ve stručnosti úspěšně za sebou, takže se můžeme pustit do praxe a seznámit se s
jednotlivými nástroji pro adminstraci LVM. 4.2.1 Inicializace disků a diskových oddílů
K tomu, abychom mohli používat disk (případně diskový oddíl nebo jiné blokové zařízení ­ např.
RAID) jako fyzický svazek (PV) v rámci LVM, musíme jej nejprve inicializovat. K tomu slouží
utilita pvcreate, pokud bychom chtěli inicializovat jako PV diskový oddíl hda1, spustili bychom
ji jednoduše takto: pvcreate /dev/hda1
Poznámka: pokud bychom chtěli jako PV inicializovat celý disk (např hdc) a pvcreate by to odmítal
s tím, že disk obsahuje tabulku rozdělení disku, můžeme tabulku rozdělení disku přepsat pomocí
utility dd a následně si vynutit znovunačtení tabulky rozdělení disku pomocí utility blockdev
(ovšem je třeba si dát pozor na to, zda opravdu pracujeme se správným diskem ­ jinak si připravíme
horké chvilky při obnovování tabulky rozdělení disku): dd if=/dev/zero of=/dev/hdc bs=1k count=1
blockdev --rereadpt /dev/hdc
www.linuxzone.cz strana 47 / 159
Impossible: Linux Mission 1.0
4. LVM ­ Logical Volume Manager (Správa logických oddílů)
4.2.2 Vytvoř ení skupiny svazků
Pro vytvoření skupiny svazků (VG) slouží nástroj vgcreate. Pokud bychom chtěli vytvořit skupiny
svazků nazvanou "mygroup" obsahující dva fyzické svazky hda1 a hdc1, učinili bychom to takto: vgcreate mygroup /dev/hda1 /dev/hdc1
Můžeme přitom také zadat velikost PE (výchozí hodnota je 32 MB) a to pomocí přepínače -s. 4.2.3 Vyhledání dostupných skupin svazků
Při startu systému je potřeba vyhledat dostupné skupiny svazků, což zařídí spuštění přikazu
vgscan. Proto tento příkaz najdeme také ve startovacích skriptech systému. 4.2.4 Aktivace skupiny svazků
Při startu systému je pak pro aktivaci již existující skupiny svazků ještě potřeba spustit vgchange -a y jméno_skupiny
Prosté spuštění vgchange -ay bez uvedení jména skupiny svazků aktivuje všechny dostupné
skupiny svazků (tímto příkazem se skupiny svazků aktivují při startu systému ze startovacích
skriptů systému poté, co byly pomocí vgscan vyhledány dostupné skupiny svazků). 4.2.5 Deaktivace skupiny svazků
Pro deaktivaci skupiny svazků spustíme příkaz: vgchange -a n jméno_skupiny
Analogicky prostým spuštěním vgchange -a n bez uvedení jména skupiny svazků vypneme
všechny skupiny svazků. 4.2.6 Odstranění skupiny svazků
Nejprve musíme danou skupinu svazků deaktivovat příkazem vgchange -a n
jméno_skupiny a poté ji můžeme odstranit spuštěním: vgremove jméno_skupiny
www.linuxzone.cz strana 48 / 159
Impossible: Linux Mission 1.0
4. LVM ­ Logical Volume Manager (Správa logických oddílů)
4.2.7 Přidá ní fyzického svazku do skupiny svazků
K přidání fyzického svazku (PV) do skupiny svazků (VG) slouží příkaz vgaextend: vgaextend jméno_skupiny jméno_svazku
4.2.8 Odebrání fyzického svazku ze skupiny svazků
Analogicky k odebrání fyzického svazku (PV) ze skupiny svazků (VG) slouží příkaz vgreduce: vgreduce jméno_skupiny jméno_svazku
4.2.9 Vytvoř ení logického svazku
Pro vytvoření logického svazku slouží příkaz lvcreate. Při zakládání logického svazku musíme
specifickovat jeho velikost, což můžeme učinit dvěma způsoby: bud uvedeme velikost zadáním
počtu LE (velikost LE je totožná s velikostí PE v rámci dané skupiny svazků), anebo zadáme
velikost v jednotkách MB nebo GB. Kromě velikosti také máme možnost zvolit způsob mapování
fyzických svazků uvnitř zakládaného logického svazku (lineární nebo stripování) a pokud se
rozhodneme pro stripování, pak i velikost stripu. Následující příkaz vytvoří logický svazek "testlv"
ve skupině svazků "mygroup" o velikosti 100MB, fyzické svazky budou mapovány lineárně: lvcreate -L100 -ntestlv mygroup
Následující příkaz vytvoří logický svazek "testlv" ve skupině svazků "mygroup" který bude
obsahovat 100 LE (velikost logického svazku tedy bude rovna 100 x velikost LE), uplatní se
stripování: lvcreate -l100 -i2 -ntestlv mygroup
4.2.10 Odstranění logického svazku
Před odstraněním logického svazku se ujistíme, že není používán (případně jej odpojíme příkazem
umount, t.j. např. umount /dev/mygroup/testlv). Poté jej můžeme odstranit příkazem
lvremove: lvremove /dev/mygroup/testlv
www.linuxzone.cz strana 49 / 159
Impossible: Linux Mission 1.0
4. LVM ­ Logical Volume Manager (Správa logických oddílů)
4.2.11 Rozšíře ní (zvětšení) logického svazku
Při rozšiřování logického svazku máme několik možností, jak rozšíření specifikovat ­ můžeme zadat
o jaké množství diskového prostoru chceme svazek zvětšit anebo můžeme přímo zadat jeho novou
velikost. Následující příkaz rozšíří logický svazek "testlv" o 1 GB: lvextend -L+1G /dev/mygroup/testlv
Následující příkaz rozšíří logický svazek "testlv" na celkovou velikost 10 GB: lvextend -L10G /dev/mygroup/testlv
Tím to ovšem nekončí ­ zatím jsme pouze upravili velikost logického svazku, ale velikost
souborového systému, který se něm nacházá je stále stejná. Postup se liší pro jednotlivé typy
souborových systémů. Pokud používáme souborový systém ext2/ext3, použijeme utilitu
resize2fs. K tomu musíme souborový systém nejprve dočasně odpojit (příkazem umount /
dev/mygroup/testlv), poté jej rozšířit tak, aby zaplnil celý zvětšený logický svazek
(resize2fs /dev/mygroup/testlv) a poté jej můžeme opět připojit (mount /
dev/mygroup/testlv). Zdá se vám to zbytečně složité? Existuje i jednodušší varianta ­
existuje utilita e2fsadm, která nahradí spouštění lvextend a resize2fs (stále ale musíme
souborový systém před jejím použití odpojit). Pro online zvětšení (tedy bez nutnosti odpojovat souborový systém) souborového systému reiserfs
slouží utilita resize_reiserfs, v případě souborového systému xfs použijeme xfs_grows,
souborový systém jfs pouze znovu připojíme pomocí mount -o remount,resize. 4.2.12 Redukce (zmenšení) logického svazku
LVM samozřejmě umožňuje také logické svazky zmenšovat. V tomto případě ještě předtím, než
logický svazek zmenšíme, musíme zmenšit souborový systém, který se na něm nachází. Na to
pozor, protože pokud na to zapomeneme a zmenšíme logický svazek aniž bychom předtím zmenšili
souborový systém, velmi pravděpodobně přijdeme o některá data, která na něm byla uložena! Pokud používáme souborový systém ext2/ext3, nejprve jej odpojíme příkazem umount /
dev/mygroup/testlv, potom jej zmenšíme příkazem resize2fs /
dev/mygroup/testlv 524228, pak teprve zredukujeme vlastní logický svazek příkazem
lvreduce -L-1G /dev/mygroup/testlv a nakonec je opět připojíme příkazem mount /
dev/mygroup/testlv. Všimněme si, že utilitě resize2fs zadáváme novou velikost
souborového systému v blocích. Také v tomto případě si můžeme postup zjednodušit použitím
utility e2fsadm. Pokud používáme souborový systém reiserfs, je třeba jej před zmenšením také odpojit, následně jej
www.linuxzone.cz strana 50 / 159
Impossible: Linux Mission 1.0
4. LVM ­ Logical Volume Manager (Správa logických oddílů)
zmenšit pomocí resize_reiserfs a opět připojit. Souborové systémy xfs a jfs zmenšovat
nelze. 4.2.13 Získání informací o stavu svazků
K prohlížení informací o skupině svazků (VG) slouží utilita vgdisplay. Analogicky k prohlížení
informací konkrétním o fyzickém svazku (PV) slouží utilita pvdisplay: pvdisplay jméno_fyz_svazku
vgdisplay jméno_skupiny
4.3 Instalace Linux Mission s využitím LVM
Pokud se rozhodneme pro instalaci Mission na LVM, musíme vzít na vědomí jednu věc a tou je
skutečnost, že zavaděč systému LVM přímo nepodporuje. Řešení je jednoduché, prostě vyhradíme
jeden malý regulérní diskový oddíl pro připojení /boot a zbytek systému včetně kořenového
svazku již můžeme instalovat na LVM. Příklad: máme k dispozici dva disky (hda a hdc). Nejprve založíme klasický diskový oddíl hda1
dejme tomu o velikosti 50 MB, který bude připojen jako /boot. Veškeré zbývající místo prvního
disku využijeme pro druhý diskový oddíl hda2, který poslouží jako fyzický svazek (PV). Na
druhém disku můžeme vyhradit diskový oddíl hdc1 jako swap a zbývající místo využijeme pro
druhý oddíl hdc2, který využijeme jako další fyzický svazek (PV). Oba fyzické svazky začleníme
do skupiny svazků (VG), kterou nazveme třeba "missionvg" a prostor rozdělíme mezi logické
www.linuxzone.cz strana 51 / 159
Impossible: Linux Mission 1.0
4. LVM ­ Logical Volume Manager (Správa logických oddílů)
svazky (LV) "rootlv" pro připojení jako kořenový svazek /, "usrlv" pro připojení jako /usr a
"homelv" pro připojení jako /home. Nemusíme přitom hned rozdělit veškeré volné místo v rámci
skupiny svazků, část můžeme ponechat volnou pro pozdější rozšíření logických svazků. Zavaděč instalujeme na MBR prvního disku a zadáme, že jako kořenový svazek má připojit zařízení
/dev/missionvg/rootlv. www.linuxzone.cz strana 52 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
5. Základní orientace v systému
5.1 Uživatelé, skupiny a př ístupová práva
Linux je víceuživatelský systém a nelze v něm pracovat bez toho, abychom použili uživatelský účet.
Každému uživateli musí administrátor systému uživatelský účet (což je privilegovaný uživatel
nazvaný "root", který existuje vždy) vytvořit, teprve potom se může uživatel do systému přihlásit.
Přístupové heslo uživatele "root" jste nastavili již v průběhu instalace systému, jen znovu
připomenu, že tento účet byste z bezpečnostních důvodů měli používat opravdu jen k administraci
systému a pro běžnou práci používat obyčejný uživatelský účet. Vytvoření obyčejného
uživatelského účtu vám Mission také automaticky nabídne při prvním spuštěním systému. Každý uživatel je v systému identifikován jedinečným číslem UID (UserID) ­ tím si ale začínající
uživatel nemusí lámat hlavu, protože většina systémových nástrojů a rozhraní umí pracovat přímo s
uživatelskými jmény tak a o mapování uživatelských jmen na UID se postará systém sám. Uživatele je možné v systému seskupovat do skupin, což má smysl při uplatňování přístupových
práv. Např. máme­li několik uživatelů, kteří potřebují sdílet určitá data, ale tato data současně
nemají být přístupná ostatním uživatelům, vytvoříme pro ně společnou skupinu a přístupová práva k
souborům nastavíme odlišně pro příslušníky skupiny a zbytek světa. S přístupovými právy můžeme manipulovat např. prostřednictvím správce souborů ­ kliknutím
pravým tlačítkem myši na vybraný objekt a zvolením položky "Vlastnosti" v menu otevřeme dialog,
ve kterém přes záložku "Oprávnění" můžeme prohlížet nebo měnit prístupová práva k objektu. www.linuxzone.cz strana 53 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
Vidíme, že systém rozlišuje tři skupiny práv: •
•
•
práva vlastníka práva skupiny práva pro všechny ostatní U každé z těchto skupin práv můžeme přidělit nebo odebrat práva pro: •
•
•
čtení zápis spouštění Samozřejmě ne všechny kombinace nastavení práv jsou smysluplná. Nastavujeme­li např. práva pro
spustitelný soubor, nestačí přidat jen práva ke spouštění, je také potřeba, aby bylo možné daný
objekt číst. Přidělíme­li obyčejnému souboru právo pro zápis, ale už ne právo pro čtení, bude sice
možné soubor přepsat, ale nebudeme jej moci otevřít. Trošku jinak je to s právy u adresářů (složek). Adresáře samozřejmě nelze spouštět, v tomto případě
přidělení práva pro spouštění znamená, že lze adresář otevřít. Přidělení práva pro čtení u adresáře
znamená, že lze vypsat jeho obsah. Přidělení práva pro zápis u adresáře znamená, že v něm lze
vytvářet nové objekty nebo naopak objekty mazat. Z toho plyne, že je např. možné adresáři přidělit
právo ke spouštění (t.j. lze do něj vstoupit), ale současně odebrat právo ke čtení ­ uživatel pak do
adresáře může vstoupit, ale neuvidí jeho obsah. www.linuxzone.cz strana 54 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
Ještě důležitá poznámka: při rozhodování o povolení nebo zamítnutí přístupu systém zkouší uplatnit
práva v pořadí práva vlastníka, poté práva skupiny a nakonec práva pro zbytek světa. Ale ­ pokud je
uživatel vlastníkem objektu, práva pro skupiny nebo ostatní se už neuplatní. Pokud uživatel není
vlastníkem objektu ale je členem odpovídající skupiny, uplatní se práva pro skupinu, ale neuplatní
se již práva pro ostatní. Teprve v případě, kdy uživatel není ani vlastníkem objektu ani členem
příslušně skupiny, uplatní se práva pro ostatní. Jinými slovy, pokud si např. vlastník nastaví k
objektu právo ke čtení pro "ostatní", ale nepřiděli si právo pro čtení pro sebe jako vlastníka nebo
člena skupiny, je sice vlastníkem objektu (t.j. může měnit jeho přístupová práva), ale nemůže objekt
přečíst. Z příkazové řádky lze k prohlížení práv použít příkaz ls, výpis o bsahu adresáře může vypadat
např. takto: [dave@mission
celkem 152
drwxr-xr-x 2
drwxr-xr-x 2
drwxr-xr-x 2
-r--r--r-- 1
lrwxrwxrwx 1
drwxr-xr-x 2
drwxr-xr-x 4
drwxr-xr-x 2
vmware-tools-distrib]$ ls -l
dave
dave
dave
dave
dave
dave
dave
dave
dave
4096 srp 9 23:07 bin
dave
4096 srp 9 23:08 doc
dave
4096 srp 9 23:07 etc
dave 126164 srp 9 23:08 FILES
dave
11 srp 11 18:16 INSTALL -> doc/INSTALL
dave
4096 srp 9 23:07 installer
dave
4096 srp 9 23:07 lib
dave
4096 srp 9 23:07 sbin
Přístupová práva jsou v levé části výpisu, první písmeno označuje typ objektu ("d" pro adresář, "­"
pro obyčejný soubor, "l" pro symbolický odkaz) a pak již následují tři trojice symbolů práv v pořadí
vlastník, skupina, ostatní: •
•
•
r: právo čtení w: právo zápisu x: právo spouštění Pokud je právo přiděleno, vidíme příslušný symbol, pokud je na daném místě pomlčka, právo
přiděleno není. Pro změnu nastavení práv y příkazové řádky lze použít utilitu chmod (podrobnosti
viz programová dokumentace). 5.2 Adresářová struktura v Linuxu: kde, co a jak v systému
nalézt
"Kam jsem ten soubor asi tak mohl uložit?" nebo "Určitě jsem to už instaloval, ale kam?" ­ to jsou
otázky, které si snad každý uživatel počítače s železnou pravidelností klade. Operační systémy
samozřejmě poskytují řadu nástrojů, které hledání potřebného souboru či dat usnadňují. V tomto
článku si nejprve osvětlíme uspořádání souborových systémů a obvyklou adresářovou strukturu,
www.linuxzone.cz strana 55 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
která je v linuxových distribucích zavedena a následně si pak představíme několik nástrojů, které
můžeme využít k vyhledávání uložených souborů či dat. 5.2.1 Standardy FSSTND, FHS
I když mezi jednotlivými linuxovými distribucemi existují drobné rozdíly, většinou se přidržují
standardů, které byly vytvořeny za účelem sjednocení adresářové struktury mezi distribucemi. Jako
první vzniknul standard FSSTND (Linux Filesystem Structure, poslední verze je FSSTND 1.2),
který je nyní nahrazen novějším standardem FHS (Filesystem Hierarchy Standard, aktuální verze je
FHS 2.2). Uživatel proto nebude mít při přechodu z jedné linuxové distribuce na druhou problémy s
orientací v systému, protože základní části jsou stejné. 5.2.2 Hierarchie svazků a adresář ová struktura Linuxu
Zatímco uživatelé operační systémů z dílny Microsoftu jsou zvyklí pracovat odděleně s
jednotlivými diskovými oddíly (které jsou označované velkými písmeny abecedy, např. "C:", "D:"),
v Linuxu je tomu jinak. Diskové oddíly, které obsahují souborový systém (tzv. svazky), tvoří
hierarchii na jejímž vrcholu je tzv. kořenový svazek (root, označovaný znakem "/"). Ostatní svazky
jsou pak připojeny na zvolené adresáře v kořenovém svazku atd. atd., čímž vzniká hierarchie
souborových systémů. Z pohledu uživatele je to velmi pohodlné, protože uživatel vidí jediný
adresářový strom a vůbec se nemusí starat o to, na kterých diskových oddílech je co uloženo. Zatímco je jednodušší instalovat celý systém na jediný svazek (/), existují také rozumné důvody,
proč instalaci rozložit na více svazků. Je to o něco bezpečnější a v případě počítačových sítí
oddělením dat týkajících se konfigurace systému (a tudíž specifických pro jednotlivé počítače) od
dat neměnných (která mohou být společná) si usnadníme sdílení dat mezi počítači. Z těchto důvodů
mohou být adresářové stromy /var, /home, /boot, /usr či /tmp instalovány na oddělené
svazky, toto rozdělení také závisí na volbě typu instalace ­ optimální rozdělení bude jiné v případě
instalace typu pracovní stanice a jiné bude v případě instalace serveru. Záleží také na uživateli /
administrátorovi systému, zda upřednostní pohodlí anebo o něco větší robustnost. V případě
desktopu nebo domácích systémů si s tím ale nemusíme lámat hlavu, instalace, kdy je zvlášť
vyčleněn pouze svazek /boot a zbytek systému je umístěn na jednom svazku je v těchto případech
zcela vyhovující. Podívejme se nyní, jak taková běžná adresářová struktura v linuxovém systému vypadá a
charakterizujme jednotlivé adresáře: /
|-|-|-|-|-|-|--
bin
boot
dev
etc
home
initrd
lib
(root)
(základní příkazy a nástroje)
(soubory potřebné pro zavedení systému)
(soubory speciálních zařízení, "device files")
(konfigurace systému, nelze sdílet)
(domovské adresáře uživatelů)
(přípojný bod, používá se při bootu systému)
(základní sdílené knihovny a moduly jádra)
www.linuxzone.cz strana 56 / 159
Impossible: Linux Mission 1.0
|-|-|-|-|-|-|-|-`--
mnt
misc
opt
proc
sbin
tmp
usr
var
root
•
•
•
•
•
•
•
•
•
•
•
•
•
5. Základní orientace v systému
(přípojný bod)
(součást autofs)
(instalace doplňkového software)
(přípojný bod pro systém procfs jádra)
(systémové utility nezbytné pro běh systému)
(pro vytváření dočasných pracovních souborů)
(běžné aplikace)
(proměnlivá data)
(domovský adresář uživatele root)
/ (root): tento svazek nelze sdílet, obsahuje minimum potřebné k inicializaci systému do
té míry, aby mohly být připojeny ostatní souborové systémy, provedena kontrola / oprava
souborových systémů nebo obnova systému ze zálohy a konečně obashuje vše potřebné k
běhu systému v jednouživatelském režimu. /bin: základní systémové nástroje které se uplatní při zavádění systému (např. utilita
mount pro připojování svazků apod.) a utility, které běžně používají i obyčejní uživatelé
(např. mkdir, cp, příkazové interprety ­ bash apod.). /boot: tento adresář (často na odděleném svazku) obsahuje soubory pro zavedení systému
jako je obraz jádra, pomocné soubory zavaděče systému apod. /dev: obsahuje speciální soubory reprezentující zařízení. Obvykle také obsahuje skript
MAKEDEV, který slouží k vytváření souborů zařízení. /etc: tento adresář obsahuje konfigurační soubory a nelze jej sdílet. Jsou zde např. soubory
fstab (informace o tom, jaké svazky se mají připojit a kam), passwd a shadow (definují
seznam uživatelů systému a jejich přístupová hesla), group (definuje skupiny uživatelů),
inittab (konfigurace programu init, který řídí start systému) a řadu dalších. /home: tento adresář obsahuje domovské adresáře uživatelů a často bývá na odděleném
svazku. initrd: tento adresář se používá výhradně jako dočasný přípojný bod při bootu, přepojuje
se na něj prvotní kořenový svazek . /lib: obsahuje základní sdílené knihovny potřebné pro běh programů v /bin, /sbin a
moduly jádra (/lib/modules). /mnt: slouží jako přípojný bod pro svazky, které nejsou trvale připojeny, často obsahuje
podadresáře pro připojování disket (/mnt/floppy) nebo médií CD/DVD (/mnt/cdrom)
apod. /misc: tento adresář používá automounter (nástroj pro automatické připojování
souborových systémů) /opt: do tohoto adresáře se instaluje software, který není součástí distribuce. V minulosti se
takto používal adresář /usr/local. Také tento adresář je mnohdy umístěn na odděleném
svazku. /proc: tento adresář slouží jako přípojný bod pro pseudosouborový systém jádra procfs.
Pokud jej používáme nalezneme v něm informace o konfiguraci a stavu systému. /sbin: systémové nástroje které se uplatní při zavádění či konfiguraci systému, na rozdíl
od nástrojů umístěných v /bin nejsou určeny pro běžné používání obyčejnými uživateli
(např. nástroje pro formátování disků ­ fdisk, zakládání nebo opravu souborových systémů
www.linuxzone.cz strana 57 / 159
Impossible: Linux Mission 1.0
•
•
•
•
5. Základní orientace v systému
­ mke2fs a e2fsck, nástroje pro konfiguraci sítě apod.) /tmp: tento adresář slouží k vytváření dočasných pracovních souborů, obvykle je pravidelně
automaticky promazáván a také může být instalován na odděleném svazku. /usr: zde jsou instalovány další aplikace a nástroje, které jsou součástí distribuce, ale které
nejsou nezbytné pro start systému či běh v jednouživatelském režimu. Obsahuje mimo jiné
podadresáře bin, sbin, lib podobně jako kořenový svazek, grafické rozhraní X Window
System je instalováno v /usr/X11 apod. Protože je rozsáhlý a obsahuje data, která se při
provozu systému nemění, lze jej s výhodou sdílet. /var: tento adresář obsahuje data, která se během provozu systému mění a nelze jej sdílet.
Obsahuje např. podadresář log, ve kterém se nachází systémové logy, podadresář spool,
který obsahuje tiskové fronty nebo fronty zpráv elektronické pošty, schránky elektronické
pošty uživatelů apod. Často bývá instalován na odděleném svazku. /root: domovský adresář uživatele root. 5.2.3 Nástroje pro vyhledávání
Pokud jde o nástroje pro vyhledávání souborů, můžeme si vybrat mezi nástroji s grafickým
rozhraním a nástroji pro příkazovou řádku. Nejprve se budeme zabývat nástroji pro příkazovou řádku ­ tady si můžeme vybrat mezi nástroji,
které přímo procházejí souborový systém (find) a nástroji, které pracují s databází jmen souborů
(locate). Nástroje, které pracují s databází jmen souborů jsou samozřejmě rychlejší a hodí se
zejména v případech, kdy se stav souborového systému příliš němění. 5.2.4 Rychlé vyhledávání souborů pomocí databáze souborů ­ locate
Tento nástroj funguje tak, že si v pravidelných, administrátorem stanovených intervalech buduje
databázi jmen souborů, ve které pak můžeme hledat bez toho abychom se zdržovali znovu a znovu
procházením souborového systému. Jedná se o standardní součást linuxových distribucí a je
obvykle nastaven tak, aby se databáze iniciovala jednou denně (zpravidla v noci, k inicializaci
databáze slouží příkaz updatedb, který je spouštěn z cronu). Administrátor má možnost zvolit,
které části souborového systému se budou indexovat (volby -u, -U) a které se mají naopak
vynechat ( volby -e, --prunepaths), databáze je standardně ukládáná do souboru /
var/lib/locatedb. Administrátor obvykle z bezpečnostních důvodů nechá indexovat pouze ty
části systému, které používají všichni uživatelé systému. Příkaz pro inicializaci databáze může vypadat např. takto (vynecháme pracovní adresáře, přípojné
body floppy a cdrom umístěné pod /mnt, a přípojné body síťových a speciálních souborových
systémů): /usr/bin/updatedb -f "nfs,smbfs,ncpfs,proc,devpts" \
-e "/mnt,/tmp,/var/tmp,/usr/tmp"
www.linuxzone.cz strana 58 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
Celé to ovšem nemusíme vymýšlet, protože Mission je již nakonfigurován tak, že jednou denně tuto
databázi aktualizuje (viz skript /etc/cron.daily/slocate.cron). Na víceuživatelském
systému je také vhodné vynechat domovské adresáře (/home), aby se v databázi neobjevily názvy
důvěrných dokumentů apod. Chceme­li pak nalézt soubor např. soubor který obsahuje řetězec "resolver", spustíme locate
jednoduše takto (jinak locate umí vyhledávat i podle regulárních výrazů, slouží k tomu volba
-r): [dave@azucar dave]$ locate resolver
/var/cache/man/cat3/resolver.3.gz
/var/cache/man/cat5/resolver.5.gz
/usr/share/man/man3/resolver.3.gz
/usr/share/man/man5/resolver.5.gz
/usr/bin/resolve_stack_dump
/usr/bin/resolveip
Uživatelé si pak mohou vytvářet vlastní databáze třeba svých domovských či pracovních adresářů
(volba -o nebo --output při vytváření databáze specifikuje, kam se má výsledná databáze uložit
namísto standardního /var/lib/locatedb a volba -d umožní pro vyhledávání zvolit jinou
databázi než tu standardní ve /var/lib/locatedb). Např. příkazem updatedb -U ~ -o ~/locate.db
vygenerujeme databázi souborů našeho domovského adresáře, která bude uložena v domovském
adresáři v souboru locate.db a pokud v ní budeme chtít hledat, spustíme locate s volbou -d
~/locate.db. 5.2.5 Vyhledávání souborů pomocí utility find
Nástroj locate je sice rychlý, ale protože používá databázi jmen souborů, nepracuje s aktuálním
stavem souborového systému a tudíž není použitelný v případě kdy pracujeme se souborovým
systémem, na kterém soubory často vytváříme nebo mažeme a také neumožňuje hleddání na
základě vlastností souborů (např. typ souboru, datum změny, přístupu apod.). Standardní součástí
linuxových distribucí je utilita find, která umí soubory hledat nejen podle jména, ale i podle času
modifikace souboru, přístupu k souboru, modifikace i­uzlu souboru, typu souboru, počtu odkazů,
přístupových práv, provádět různé testy, vyhodnocovat výrazy apod. Možností je celá řada a proto
je zde nebudeme popisovat, podrobné informace o používání uživatel nalezne v manuálové stránce
programu. Příkaz find také umí provádět nad nalezenými soubory zadanou akci. Pro ilustraci zde uvedu jen jednoduchý příklad. Následující příklad se pokusí v adresáři /etc
nalézt soubor, jehož jméno začíná na "resolv" a pokud jej nalezne, spustí ls ­l pro vypsání informací
o souboru: www.linuxzone.cz strana 59 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
[root@mission /]# find /etc -name '*resolv*' -exec ls -l {} \;
-rw-r--r-- 2 root root 0 srp 3 04:16 /etc/resolv.conf
-rw-r--r-- 1 root root 0 čec 23 17:04 /etc/resolv.conf.bak
5.2.6 Orientace v systému pomocí databáze RPM
Linux Mission používá obdobně jako linuxové distribuce Red Hat Linux, SUSE Linux či Mandrake
Linux ke správě balíčků systém RPM (Red Hat Package Manager). Pokud potřebujeme zjistit, ke
kterému balíčku daný soubor patří, spustíme rpm s volbami -qf. Např. chceme­li vědět, kam patří
nástroj /bin/cp, spustíme rpm takto: [dave@mission dave]$ rpm -qf /bin/cp
fileutils-4.0.36-4
Pro prohlížení obsahu nainstalovaných balíčků slouží volby -qil. RPM je sofistikovaný systém a
umožňuje spustu dalších věcí týkajících se správy balíčků, to už ale není předmětem tohoto článku ­
další informace čtenář nalezne v manuálové stránce programu rpm. 5.2.7 Prohledávání obsahu souborů ­ grep
Nástroje, které jsme doposud zmínili, umožňovali hledat soubory podle jejich názvu či vlastností.
Uživatel ovšem často potřebuje hledat na základě obsahu souboru. To už ale s adresářovou
strukturou linuxových systémů nesouvisí, takže zde pouze v krátkosti představíme balíčky grep a
rgrep, které slouží k vyhledávání souborů na základě výskytu řetězců, které obsahují. Balíček grep obsahuje tři nástroje: •
•
•
grep: hledání pomocí regulárních výrazů fgrep: jednoduché a rychlé hledání bez použití regulárních výrazů egrep: hledání pomocí rozšířených regulárních výrazů Chceme­li např. zjisti, které ze souborů s příponou ".conf" umístěných v adresáři /etc obsahují
řetězec "root", spustíme grep takto: [root@mission etc]# grep -l root /etc/*.conf
/etc/gpm-root.conf
/etc/grub.conf
/etc/ldap.conf
/etc/logrotate.conf
/etc/nscd.conf
/etc/sensors.conf
/etc/smartd.conf
/etc/warnquota.conf
www.linuxzone.cz strana 60 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
Utilita grep a její varianty umí také rekurzivně procházet adresáře, což je rychlejší, než
kdybychom k rekurzivnímu prohledávání adresářů použili kombinaci příkazů find a grep. K
rekurizvnímu prohledávání slouží volba -r. 5.2.8 Nástroje pro vyhledávání s grafickým rozhraním
Také zde máme k dispozici několik nástrojů. V hlavním menu desktopu GNOME prostřednictvím
položky "Hledat soubory" vyvoláme grafické rozhraní, ve kterém můžeme hledat soubory podle
jména, ale také vyhledat soubory obsahující určitý text apod. Zatrhneme­li volbu "Zobrazit více možností", můžeme vybírat další kritéria hledání, která můžeme
libovolným způsobem kombinovat (viz tlačítka "Odstranit a "Přidat"). Z hlavního menu můžeme také přes položky "Internet" ­> "Další aplikace pro Internet" ­>
"Internetový prohlížeč Konqueoror" spustit aplikace Konqueror, která zdaleka není jen webovým
prohlížečem. Z nabídky "Nástroje" Konqueroru pak vyvoláme dialog "Najít soubor". www.linuxzone.cz strana 61 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
Také tady můžeme hledat soubory podle názvu, ale prostřednictvím záložky "Obsah" lze vyhledat
soubory obsahující určitý text a konečně v záložce "Vlastnosti" můžeme hledat podle data, vlastníka
souboru atd. 5.3 Jak rozpoznat formát datových či binárních souborů?
V řadě operačních systémů tradičně slouží k rozpoznání typu či formátu souboru jeho přípona. Na
základě přípon ve jménech souborů jsou také často přiřazovány vazby mezi typy souborů a
aplikacemi, které s těmito soubory pracují a uživatelé jsou na používání přípon k rozlišení typů
souborů či formátu dat zvyklí. Spoléhání se na přípony v názvech souborů ale může někdy být
ošidné ­ např. v souvislosti s existencí velkého množství virů šířených elektronickou poštou, které
pro zamaskování manipulují s příponami souborů. Linuxové systémy ovšem disponují šikovným
nástrojem file, který lze s výhodou použít pro rozpoznání typu či formátu souboru na základě
jeho obsahu. www.linuxzone.cz strana 62 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
5.3.1 Jak file pracuje?
Jedná se o nástroj pro příkazovou řádku, v nejjeddnodušším případě jej spustíme pouze se zadáním
jména nebo jmen souboru, jehož typ či formát neznáme. Pro ilustraci si uveďme malý příklad: [dave@azucar dave]$ file *
R-1.5.0-1.i386.rpm:
RPM v4 bin i386 R-1.5.0-1
test:
ASCII mail text
test.html:
HTML document text
agt.zip:
Zip archive data, at least v2.0 to extract
linuxzone:
directory
xsane.png:
PNG image data, 896 x 650, 8-bit colormap,\
non-interlaced
Utilita file provádí tři druhy testů: nejdříve zjistí ­ pomocí volání jádra stat() ­ o jaký typ
souboru se jedná (obyčejný soubor, adresář, pojmenovaná roura, symbolický odkaz apod.). Pokud
se jedná o obyčejný soubor, zkoumá jej dále a snaží se odhadnout formát souboru, tedy zda se jedná
o spustitelný program a jaký, skript, nebo zda se jedná o datový soubor (např. obrázek ve formátu
GIF, PostScriptový soubor atd.). Používá přitom databázi uloženou zpravidla v souboru /usr/share/magic, tato databáze
obsahuje seznam běžně užívaných formátů spolu s určitou "značkou" (angl. magic), která je pro
daný formát typická. Pod značkou si představme určitou pro daný formát typickou sekvenci znaků,
která se vždy nachází na stejném místě od počátku souboru. Tímto způsobem lze popsat většinu
datových formátů, se kterými se můžeme běžně setkat. Např. nahlédneme­li do souboru /
usr/share/magic a vyhledáme definici formátu GIF, uvidíme zhruba následující: # GIF
0
string
>4
string
>4
string
>6
leshort
>8
leshort
[ zkráceno ]
GIF8
7a
9a
>0
>0
GIF image data
\b, version 8%s,
\b, version 8%s,
%hd x
%hd,
To znamená, že pokud soubor na počátku (pozice 0) obsahuje řetězec "GIF8", dále podle řetězce na
pozici 4 rozlišíme, zda se jedná o verzi 87a nebo 89a a na offsetech 6 a 8 jsou uloženy rozměry
obrázku. V praxi pak výstup vypadá takto: [dave@azucar dave]$ file multimon.gif
multimon.gif: GIF image data, version 87a, 637 x 244,
File umí rozpoznat i řadu formátů spustitelných souborů pro řadu platforem: [dave@azucar dave]$ file seqstat*
www.linuxzone.cz strana 63 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
seqstat:
ELF 32-bit MSB mips-2 executable, MIPS R3000_BE, version 1\
dynamically linked (uses shared libs), not stripped
seqstat2: ELF 32-bit LSB executable, Intel 80386, version 1, \
dynamically linked (uses shared libs), not stripped
Jak je vidět, databáze /usr/share/magic je věc velmi užitečná. Pokud zkoumaný soubor
nevyhoví žádné z definic v databázi magic a jedná se o textový soubor, pokusí se file ještě
odhadnout jakou znakovou sadu soubor používá a potom se pokusí odhadnout v jakém je jazyce
(např. zdrojový kód v jazyce C bude obsahovat rezervovaná slova tohoto jazyka apod.). Tyto testy
jsou už pochopitelně méně spolehlivé. 5.3.2 Použití
Příkaz file nabízí několik užitečných voleb (všechny zde rozebírat nebudeme, zastavíme se pouze u
několika nejzajímavějších): •
-i: tato volba způsobí, že file na výstup vypíše mime typ souboru, např.: [dave@azucar dave]$ file -i multimon.gif
multimon.gif: image/gif
•
-L: tato volba způsobí, že file bude následovat symbolické odkazy, místo aby pouze vypsal,
že se jedná o symbolický odkaz. •
-s: tato volba způsobí, že se file pokusí otevřít a identifikovat soubory blokových nebo
znakových zařízení (normálně file otevírá pouze obyčejné soubory). To se nám může
hodit v případě, kdy potřebujeme zjistit jaký souborový systém obsahují určité diskové
oddíly: [root@azucar /root]# file -s /dev/hda /dev/hda1 /dev/hda2
/dev/hda: x86 boot sector
/dev/hda1: x86 boot sector, system MSWIN4.1, FAT (12 bit)
/dev/hda2: Linux rev 1.0 ext2 filesystem data (mounted or unclean)
Jak vidno, utilita file je užitečný nástroj pro příkazovou řádku, který poměrně spolehlivě
rozpozná velké množství datových formátů, jeho "magic" databáze uživateli poskytne informace o
tom, jak dané datové formáty rozpoznat. Tento příkaz je standardní součástí linuxových distribucí a
nalezneme jej také prakticky v každém UN*Xovém systému. www.linuxzone.cz strana 64 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
5.4 Dokumentace, nápověda
Linux Mission obsahuje spoustu užitečné dokumentace. V podstatě každá utilita má svou
programovou dokumentaci. V linuxových systémech existuje několik systémů nápovědy: •
•
•
klasické manuálové stránky, systém info, desktopová prostředí mají svou vlastní dokumentaci. K prohlížení manuálových stránek slouží v textovém režimu příkaz man, nápovědu k použití získáte
zadáním man man. K prohlížení dokumentace v systému info slouží v textovém režimu utilitta
info. Samozřejmě lze použít také grafická rozhraní. V dekstopu GNOME vyvoláte nápovědu z hlavního
menu přes položku "Nápověda", klasické manuálové stránky jsou přístupné přes odkaz "Manuálové
stránky" (předposlední položka dole), systém info je přístupný přes odkaz "Informační stránky".
Pokud chcete v manuálech hledat, použijte záložku "Index": Alternativně lze použít např. prohlížeč Konqueror (což je internetový prohlížeč, správce souborů a
prohlížeč dokumentace v jednom) ­ pokud jako URL zadáte man:/ můžete prohlížet klasické
manuálové stránky, analogicky pokud jako URL zadáte info:/. www.linuxzone.cz strana 65 / 159
Impossible: Linux Mission 1.0
5. Základní orientace v systému
6. Pod pokličkou ­ orientace v systému pro
pokročilé
6.1 Plánování, hierarchie a ř ízení procesů
V této části se budeme zabývat fungováním procesů v systému Linux. Nejprve si definujeme, co je
to proces, popíšeme stavy, ve kterých se může nacházet, budeme se krátce zabývat mechanismem
plánování procesů a možností ovlivnění jejich priority a mechanismy řízení procesů. Tato část je
určena mírně či středně pokročilým uživatelům či administrátorům a kromě teoretického úvodu
obsahuje i řadu příkladů, které uživatel využije při práci se systémem, ale některé praktické tipy
využije i uživatel ­ začátečník. 6.1.1 Co je proces?
Dříve než se dostaneme k praktickým záležitostem je potřeba definovat několik pojmů, jako je jádro
systému, proces, uživatelský režim či režim jádra a objasnit mechanismus vzniku procesů.
Začínajícímu uživateli se možná bude tento úvod zdát zbytečně podrobný, nicméně pochopení
těchto pojmů je důležité pro zbytek textu, takže doporučuji obrnit se trpělivostí a několik úvodních
odstavců přečíst. Pod pojmem proces rozumíme běžící instanci programu. UN*Xové systémy, tedy systému
odvozené od systému UNIX nebo systémy UNIXu podobné ­ jako je i Linux, jsou systémy
www.linuxzone.cz strana 66 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
víceuživatelské a podporují multitasking ­ umožňují tedy současnou práci více uživatelů a běh
více procesů současně. Ve skutečném slova smyslu může samozřejmě na jednoprocesorovém
počítači být vykonáván pouze jeden proces, nicméně víceméně simultánní běh více procesů
umožňuje režim sdílení času procesoru (tzv. time­share) mezi jednotlivými procesy, kdy se procesy
ve svém běhu střídají podle určitých pravidel a vytváří se tak iluze, že více procesů běží současně.
K problematice plánování procesů se ovšem ještě dostaneme později. Architektura UN*Xových systémů je následující: existuje jádro systému, které obhospodařuje
technické prostředky systému, plánuje vykonávání procesů a poskytuje rozhraní, pomocí kterého je
možno přistupovat k technickým prostředkům a prostředkům jádra. Toto rozhraní představují tzv.
volání jádra. Procesy mohou běžet ve dvou režimech: v režimu uživatelském a v režimu jádra.
Proces běžící v uživatelském režimu může přistupovat pouze ke svému paměťovému prostoru, který
obsahuje kód programu a jeho data a nemůže vykonávat určité privilegované činnosti související
např. se stavem technických prostředků, nemůže přistupovat k paměťovým strukturám jádra či
jiných procesů a podobně. Akce, které není možné realizovat v uživatelském režimu, mohou
uživatelské procesy vykonávat právě pomocí volání jádra, které způsobí, že proces přejde z režimu
uživatelského do režimu jádra. Procesy v systémech UN*Xového typu vznikají standardním způsobem pomocí volání jádra fork
(), které způsobí jakési rozdvojení procesu. Proces, který volání jádra fork() vyvolal, se nazývá
rodičovský proces (parent), pokud fork() proběhne úspěšně, vzniká nový proces ­ tzv. potomek
(child). Z toho plyne, že každý proces tedy má svého rodiče a vzniká tak hierarchie procesů.
Každý proces je v systému identifikován číslem PID (Process ID). Hierarchií procesů se bude
detailně zabývat později. (Uvidíme, že výše uvedené neplatí bez výjimky ­ existuje proces, který
nevzniká tímto standardním způsobem a také existuje proces, který má v hierarchii procesů zvláštní
postavení, o tom ale později.) 6.1.2 Vznik procesu, vykonání programu ­ volání jádra fork() a execve()
Z pohledu programátora to vypadá takto (uvedu příklad v jazyce C, začátečníci či neprogramátoři
jej mohou přeskočit): rodičovský proces zavolá volání jádra fork(), které v případě úspěchu vrátí
rodiči návratovou hodnotu číslo procesu potomka, zatímco potomek jako návratovou hodnotu
obdrží 0. Tím je umožněno rozlišit v kódu programu proces rodiče potomka. if (fork()==0) {
/* zde pokračuje vykonávání potomka */
}
/* zde pokračuje rodič*/
K vykonání jiného programu slouží mechanismus exec ­ nahrazení procesu jiným, které realizuje
volání jádra execve(). Pokud tedy chceme např. z našeho programu spustit jiný program a přitom
pokračovat ve vykonávání našeho programu, musíme nejprve provést fork(), který vytvoří proces
potomka a následně v kódu potomka zavoláme execve(), který způsobí nahrazení kódu potomka
www.linuxzone.cz strana 67 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
kódem daného programu. 6.1.3 Stavy procesů
Během své existence se proces může vyskytovat v různých stavech. Nyní si jednotlivé stavy v
krátkosti popíšeme a vysvětlíme, jaké jsou mezi nimi vztahy, tedy jakým způsobem může proces
přecházet z jednoho stavu do druhého. V UN*Xových systémech to zjednodušeně vypadá takto: Jsou tedy možné následující stavy: •
•
•
•
•
1) Proces běží v režimu uživatelském. 2) Proces běží v režimu jádra. Do režimu jádra se dostane buď pomocí volání jádra, anebo
tak, že dojde k přerušení. Přerušení může po uplynutí určité doby vyvolat časovač, nebo
nějaký technický prostředek (prostřednictvím přerušení procesoru) signalizuje, že je potřeba
ošetřit nějakou událost (např. dokončení I/O operace apod.). Po obsloužení přerušení může
být vybrán k vykonávání jiný proces. 3) Proces je zablokován a čeká na dokončení I/O operace, případně na určitý signál nebo na
uplynutí určitého časového kvanta. Jakmile důvod zablokování pomine, přejde do stavu
připraven k běhu. 4) Proces je připraven k běhu a čeká, až bude jádrem systému naplánován k vykonávávání. 5) Proces je ve stavu mátoha (zombie). Po ukončení běhu procesu zůstává ještě v tabulce
procesů záznam (který obsahuje status ukončení procesu), aby jej mohl rodičovský proces
zjistit. Proces již de facto neexistuje a nezabírá systémové prostředky, vyjma záznamu v
tabulce procesů. www.linuxzone.cz strana 68 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
6.1.4 Praxe: monitorování stavu procesů
Stav procesu lze samozřejmě monitorovat ­ pokud jádro obsahuje podporu pseudosoborového
systému procfs, nalezneme informace o jednotlivých procesech v adresáři /
proc/číslo_procesu/. Samozřejmě není potřeba procházet /proc manuálně, existuje řada
nástrojů, které to umějí. Utilita ps slouží k aktuálnímu výpisu stavu procesů, utilita top slouží k
interaktivnímu sledování procesů. Obojí jsou terminálové aplikace, tedy spouštějí se z příkazové
řádky, ale existují samozřejmě i alternativní nástroje s grafickým rozhraním. Nebudeme zde rozebírat detailně používání ps či top, detaily čtenář nalezne v příslušných
manuálových stránkách, pouze zmíníme význam symbolů popisujících stav procesu (sloupec "S"
nebo "STAT" ve výpisu ps nebo top): $ ps -l
F
000
000
000
S
S
T
R
•
•
•
•
•
UID
PID
500 1012
500 13500
500 12943
PPID
1009
1012
1012
C PRI
0 74
0 69
0 78
NI
0
0
0
SZ
729
474
769
WCHAN
wait4
do_sig
-
TTY
pts/0
pts/0
pts/0
TIME
00:06
00:00
00:00
CMD
bash
vi
ps
R ­ běžící nebo připraven k běhu ("runnable", ve výše uvedeném schématu odpovídá stavům
1, 2 a 4) D ­ nepřerušitelné čekání ("uninetrruptible sleep", zpravidla čekání na dokončení I/O
operace, v schématu stav 3) S ­ přerušitelné čekání ("interruptible sleep", může být probuzen příchodem signálu nebo
vypršením časového limitu, v schématu rovněž odpovídá stavu 3) T ­ pozastaven ("stopped", pozastaven pomocí mechanismu "job control" ­ k tomuto
mechanismu řízení procesů se dostaneme později ­ nebo je trasován, v schématu rovněž
odpovídá stavu 3) Z ­ mátoha ("zombie", v schématu odpovídá stavu 5) Pokud v okně terminálu nebo na textové konzoli spustíme utilitu top, budeto to vypadat takto
(najdeme zde i další údaje jako je např. velikost paměti procesu ve sloupci SIZE, procentuální
množství paměti používané procesem ve sloupci %MEM, nebo procentuální obsazení času
procesoru daným procesem ve sloupci %CPU): www.linuxzone.cz strana 69 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
V desktopovém prostředí GNOME spustíme nástroj pro sledování procesů s grafickým rozhraním
přes menu "Systémové nástroje", položka "Sledování systému": Pomocí okénka hledat můžeme snadno vyhledat procesy podle jejich názvu. Chceme­li, aby byly
procesy řazeny podle abecedy, klikneme na záložku "Jméno procesu" apod. Prostřednictvím menu
www.linuxzone.cz strana 70 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
"Úpravy ­> Nastavení" vyvoláme dialog, kde můžeme specifikovat, jaké informace o procesech se
budou zobrazovat a jak čast budou informace v seznamu procesů aktualizovat. 6.1.5 Plánování procesů, priorita
V úvodu jsem zmiňoval, že UN*Xové systémy podporují multitasking, který funguje na základě
režimu sdílení času procesoru (time­share). Procesorový čas je mezi jednotlivými procesy sdílen,
procesy se ve svém běhu střídají podle určitých pravidel a vytváří se tak iluze, že více procesů běží
současně. Rozvržení procesorového času mezi jednotlivé procesy obstarává plánovač procesů,
který je součástí jádra systému. Funguje to tak, že plánovač přidělí procesor určitému procesu na
určitou dobu a po jejím vypršení vykonávání procesu pozastaví a naplánuje jiný proces ­ takový,
který má nejvyšší prioritu, případně se nachází ve stavu připraven k běhu nejdelší dobu. V hodnotě
priority, která je pravidelně přepočítávána, se negativně odráží i doba, po kterou proces běžel během
posledního časového úseku, jehož délka je předem stanovena. Tak je zaručeno spravedlivé střídání
procesů ­ priorita procesu, který je připraven k běhu roste (do určité meze) čím déle proces čeká na
zpracování a naopak priorita procesu, který v nedávné době běžel nebo běží se snižuje. K práci s
časem jádro využívá časovač, který je součástí hardware a v určitém neměnném intervalu
pravidelně přerušuje procesor. Jádro Linuxu ve skutečnosti podporuje kromě zmíněné plánovací politiky sdílení času (time share)
také politiky pro aplikace vyžadující zpracování v reálném čase (real time policies). Jednodušší
varianta politiky práce v reálném čase se nazývá FIFO (first in, first out), která funguje tak, že je k
vykonávání vybrán proces s nejvyšší prioritou a ten je vykonáván tak dlouho, dokud se nevyskytne
www.linuxzone.cz strana 71 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
jiný proces s vyšší prioritou připravený k běhu, nebo se nezablokuje kvůli I/O operaci, anebo sám
nezavolá volání jádra pro přenechání procesoru jinému procesu. Když je proces vybrán ke
zpracování, je následně přeřazen na poslední místo ve frontě (proto označení first in, first out).. Druhá varianta politiky zpracování v reálném čase se nazývá Round Robin (což by šlo přeložit
jako střídání dokola). Od politiky FIFO se liší tím, že je definována maximální doba, po kterou
proces může běžet bez přerušení, po uplynutí této doby je jeho vykonáváni pozastaveno a je stejně
jako v předchozím případě přeřazen na poslední místo ve frontě. Obyčejný uživatel ovšem nemá
možnost spouštět procesy využívající politiky zpracování v reálném čase, tuto možnost má pouze
superuživatel (root). Drtivá většina procesů v Linuxových systémech ovšem pracuje v režimu sdílení času; klasické jádro
Linuxu ani není navrženo pro použití v aplikacích, které vyžadují opravdu spolehlivé zpracování v
reálném čase a zmíněné politiky zpracování v reálném čase také nelze uplatnit v případech, kdy je
potřeba zaručit opravdu minimální prodlevy. Existuje ovšem např. projekt RTLinux (Real­Time
Linux), který dává mnohem lepší výsledky stran aplikací pracujících v reálném čase (kromě toho
existují speciální OS vyvíjené pro tento účel, jako je např. QNX či LynxOS). Problematika
plánování procesů je poměrně rozsáhlá a nebudeme zde zabývat do detailů, další informace čtenář
nalezne např. v manuálových stránkách dokumentující volání jádra sched_setscheduler(2),
sched_yield(2) či sched_setparam(2). 6.1.6 Praxe: nástroje nice a renice pro změnu priority
Tolik k teorii, nyní se pojďme podívat, jakým způsobem může uživatel či administrátor ovlivnit
prioritu vykonávání procesů. Uživatel nemůže přímo ovlivnit hodnotu priority procesu, může pouze
nastavit jeden z parametrů, který se při výpočtu priority uplatní. Jedná se o tzv. hodnotu nice. Tento
parametr má přípustný rozsah od ­20 po 19 a udává, jak je proces "hodný" (proto také angl. název
"nice") vůči ostatním. Výchozí hodnota nice je 0. Obyčejný uživatel může hodnotu pouze zvyšovat
(a tím snížit prioritu daného procesu), zatímco administrátor může nastavit i zápornou hodnotu nice
a tím prioritu daného procesu zvýšit. Pro manipulaci s parametrem nice slouží nástroje pro příkazovou řádku nice (spuštění aplikace s
pozměněnou prioritou) a renice (pozměnění priority již běžícího procesu), ale je možno použít i
jiné, interaktivní nástroje jako je top pro terminál (příkaz renice vyvoláme stiskem "r") anebo již
zmíněnou utilitu pro správu procesů prostředí GNOME. Např. následující příkaz zajistí, že aplikace
bude spuštěna s nejnižší prioritou: nice -n 19 cesta_k_aplikaci
Pokud pracujeme s aplikací "Sledování systému" GNOME, označíme v seznamu procesů pomocí
myši dotyčný proces a přes menu, které vyvoláme stistkuntím pravého tlačítka myši vybereme
položku "Změnit prioritu". Tím otevřeme dialog, ve kterém upravíme a potvrdíme změnu priority
www.linuxzone.cz strana 72 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
(přesněji parametru nice). Ve druhé části tohoto miniseriálu se podíváme, jaká je hierarchie procesů v Linuxu, krátce se
zmíníme o zvláštním postavení procesu init a osvětlíme si koncept skupin procesů a sezení. Na
závěr si ukážeme si praktický příklad, jak pomocí nástroje nohup spouštět procesy tak, aby nebyly
po odhlášení uživatele ukončeny.
6.2 Hierarchie procesů
V této kapitole se podíváme, jaká je hierarchie procesů v Linuxu, krátce se zmíníme o zvláštním
postavení procesu init a osvětlíme si koncept skupin procesů a sezení. Na závěr si ukážeme si
praktický příklad, jak pomocí nástroje nohup spouštět procesy tak, aby nebyly po odhlášení
uživatele ukončeny. Minule jsme si definovali několik pojmů, víme co si představit pod pojmem proces, jaká je role
jádra systému a přiblížili jsme si mechanismy, které jádro používá při plánování procesů, víme také
jakým způsobem ovlivnit prioritu vykonávání procesu. Proces jsme si definovali jako běžící
instanci programu, který standardně vzniká voláním jádra fork(). Původní proces, který fork()
provede je rodičovským proces a nově vytvořený proces je potomek (child). Každý proces je v
systému identifikován svým číslem PID (Process ID) a u každého procesu jádro také eviduje číslo
www.linuxzone.cz strana 73 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
rodiče ­ toto číslo je označeno jako PPID (Parent Process ID). Vzniká tak hierarchie procesů, kde
každý proces má svého rodiče. Celou hierarchii procesů si můžeme vypsat například pomocí
nástroje pro příkazovou řádku pstree (v grafickém režimu nám obdobně poslouží nástroj
"Sledování systému"): vanvancito ~ $ pstree -p
init(1)-+-apmd(508)
|-atd(703)
|-bdflush(6)
|-crond(772)
|-gdm(850)-+-X(858)
|
`-gdm(859)---gnome-session(872)
|-gmc(14542)
|-gnome-terminal(1009)-+-bash(1012)-+-pstree(20186)
|
|
|-xemacs(12538)
|
|
|-xosview(9199)
|
|
`-xv(3886)
|
|-bash(150)--su(170)--bash(175)
|
|-bash(14316)---ssh(20152)
|
|-bash(11601)
|
|-bash(18144)
|
`-gnome-pty-helper(1011)
[ ... zkráceno ...]
Vidíme, že na vrcholu hierarchie je proces číslo 1 a jedná se o program init. Tento proces má
významné postavení, je to totiž proces, který je jádrem spouštěn při startu systému a tento proces
pak řídí inicializaci systému včetně spouštění nakonfigurovaných služeb. Init (proces s PID=1) ve skutečnosti není úplně prvním procesem v systému ­ existuje ještě proces
číslo 0, který vzniká nestandardním způsobem ­ jádro jej vytváří v rané fázi startu systému přímo
bez použití algoritmu fork, teprve proces 1 (init) už vzniká obvyklou posloupností algoritmů fork
(rozdvojení procesu) a následným uplatněním algoritmu exec (vykonání programu) v kódu
potomka. Po spuštění initu se z procesu 0 stane tzv. swapper. Ve výpisu procesů běžících v systému
bychom jej ale hledali marně, protože tento proces zůstane před uživatelem skrytý. Prakticky tedy
na vrcholu hierarchie procesů stojí proces s PID 1, tedy init. Možná Vás napadlo, co se stane v případě, kdy je ukončen proces, jehož potomci v systému ještě
existují. Systém v tom případě nastaví PPID (Parent Process ID) u těchto procesů na 1 ­ jejich
rodičem se pak tedy stane init. Startu systému a roli procesu init, včetně jeho konfigurace, se budeme ještě věnovat podrobněji ve
zvláštní kapitole. www.linuxzone.cz strana 74 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
6.2.1 Skupiny procesů a sezení
Kromě toho, že je každý proces identifikován svým číslem PID, rozlišuje systém ještě mezi
skupinami procesů. Procesy, které patří do stejné skupiny mají shodné číslo skupiny procesů ­
PGID (Process Group ID). V rámci skupiny procesů je jeden proces evidován jako vedoucí proces
skupiny (process group leader, takový proces poznáme podle toho, že má shodné číslo PID s číslem
PGID). Skupiny procesů umožnují distribuci signálů v rámci skupin. Dále existují tzv. sezení
(sessions), k jejich identifikaci slouží číslo SID (Session ID). Sezení jsou skupinám nadřazené,
procesy mohou přecházet mezi skupinami pouze v rámci jednoho sezení. Obdobně jako v případě
skupin procesů je jeden proces vedoucím procesem sezení (session leader, poznáme jej analogicky
podle toho, že má shodné číslo PID s číslem SID). Pod pojmem sezení si představme např. množinu
procesů, která vznikne okolo procesu procesu login po přihlášení uživatele na konzoli anebo okolo
procesu příkazového interpretu po přihlášení uživatele do vzdáleného systému apod. 6.2.2 Praxe: utility nohup, setsid a disown ­ vyjmutí procesu ze sezení
Existence skupin procesů a sezení (sessions) je opodstatněná ­ např. si představme, že se uživatel
přihlásí přes terminál do systému a spustí několik aplikací. Posléze se ohdlásí bez toho, aby
zkontroloval, zda všechny aplikace, které spustil jsou ukončeny (což může být problém, neboť
Linux je víceuživatelský systém a pokud by to tak kupříkladu na aplikačním serveru činili všichni
uživatelé, za chvíli by byl server zahlcen takovými zapomenutými procesy). Všechny tyto procesy,
které uživatel během ze svého terminálu spustil jsou ovšem identifikovatelné podle příslušnosti k
jednomu sezení (session) a při odhlášení uživatele tak může vedoucí proces sezení zaslat všem
těmto procesům signál k ukončení. Skupiny procesů také využívají příkazové interprety, když
uživateli umožňují řídit více procesů pomocí mechanismu job control (co to je a k čemu se job
control v praxi hodí si ukážeme příště). Jak to v praxi vypadá, demonstruje následující příklad:
uživatel dave s UID (User ID) 1118 se přihlásil do vzdáleného systému a v shellu si spustil editor
vi, pak editor vi pozastavil a příkazem ps si vypsal údaje o všech svých procesech (poznámka: své
UID můžeme zjistit buď náhlednutím do souboru /etc/passwd nebe pomocí příkazu id): vanvancito ~ $ ps -u dave o uid,pid,ppid,pgid,sid,tty,comm
UID
1118
1118
1118
PID
1257
1446
1451
PPID
1252
1257
1257
PGID
1257
1446
1451
SID
1257
1257
1257
TT
pts/0
pts/0
pts/0
COMMAND
bash
vi
ps
Hierarchii procesů si také pro větší názornost můžeme nechat vypsat pomocí již zmiňovaného
příkazu pstree: vanvancito ~ $ pstree -p dave
bash(1257)-+-bc(1450)
|-pstree(1469)
www.linuxzone.cz strana 75 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
`-vi(1446)
Vidíme, že všechny procesy skutečně náleží k jednomu sezení (číslo sezení je rovno 1257),
rodičovským procesem procesů vi a ps je proces příkazového interpretu bash, který je současně
vedoucím procesem sezení. Pokud si všimneme čísel skupin, vidíme, že procesy v rámci sezení
(session) jsou každý ve zvláštní skupině (mají odlišná čísla PGID), což souvisí s mechanismem job
control (pokud by si např. uživatel z editoru vi spustil další proces vyvoláním externího příkazu,
měl by stejné číslo skupiny jako rodičovský proces vi). Už jsem naznačil, že na základě příslušnosti procesů k sezením má systém možnost ukončit
procesy, které uživatel před odhlášením ze systému zapomněl ukončit. Někdy je ovšem žádoucí,
aby toto chování bylo možné potlačit. Dejme tomu, že např. uživatel či administrátor potřebuje
spustit proces, jehož provádění trvá dlouhou dobu a nepřeje si být po celou dobu v systému
přihlášen (at už se jedná třeba o provedení zálohy nebo třeba offline zpracování videa ­ příkladů by
se jistě našla celá řada). Pokud by takový proces spustil obvyklým způsobem a následně se odhlásil,
proces by byl ukončen. Situaci lze řešit buď tak, že proces spustíme v novém sezení ­ existuje
volání jádra setsid() a utilita setsid (pro příkazovou rádku) ­ spouštěný proces se tak stane
nezávislým na sezení příkazového interpretu a po ukončení příkazového interpretu zůstane běžet,
neboť přísluší jinému sezení. (Poznámka: má to ovšem jeden háček, setsid() uspěje pouze v
případě, že se proces, který setsid() volá není vedoucí proces skupiny). Druhá možnost je, že
interpretu sdělíme, že daný proces má vyřadit ze seznamu aktivních úloh a nemá mu zasílat příkaz k
ukončení, k tomu můžeme použít buď příkaz nohup anebo vestavěný příkaz příkazového interpretu
disown. Dejme tomu, že chceme provést nějaký dlouhotrvající výpočet, který realizuje program
"pocitej", s pomocí utility nohup jej spustíme takto (nezapomeňme na znak &, tedy spuštění
procesu na pozadí, viz manuálová stránka příkazu nohup): vanvancito ~$ nohup pocitej &
Utilita nohup pamatuje na případný výstup programu ­ automaticky jej přesměruje do souboru
nohup.out. Kromě nástroje nohup také můžeme použít vestavěný příkaz interpretu bash ­ příkaz disown: vanvancito ~ $
vanvancito ~ $
[1]+ Running
vanvancito ~ $
vanvancito ~ $
pocitej &
jobs
disown %1
jobs
./pocitej &
Vidíme, že po provedení příkazu disown již příkaz jobs proces pocitej nevypsal, protože jej
vyřadil ze seznamu aktivních úloh. Poznámka: Uvedené příklady s utilitami disown a nohup lze jednoduše aplikovat jen na
www.linuxzone.cz strana 76 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
programy, které neběží v grafickém režimu. 6.2.3 Řízení procesů, signály
V této kapitole se budeme zabývat mechanismy řízení procesů ­ osvětlíme si koncept signálů a v
závěru se budeme věnovat praktickým možnostem řízení procesů, které nabízí nejpoužívanější
příkazový interpret Bash (mechanismus job control). Signály slouží k tomu, aby procesy informovaly o výskytu nějaké asynchronní události. Pro zasílání
signálů slouží volání jádra kill(), jádro také samo může zasílat procesům signály. K tomu, aby
nějaký proces mohl zaslat signál jinému procesu, musí se jednat o proces stejného uživatele, pouze
uživatel root může zasílat signály libovolným procesům. Jsou tři možnosti, jak může proces na
přijetí signálu reagovat: •
•
•
může být ukončen; může jej ignorovat; může vykonat určitou předem definovanou akci, která byla předtím zaregistrována pomocí
volání jádra signal() nebo sigaction(). Existuje celá řada signálů a standardní reakce definovaná systémem na jejich přijetí je různá, pro
získání představy si uveďme namátkou některé často používáné signály a standardní reakce na ně: •
•
•
•
•
•
SIGHUP ­ (číslo 1) signál zavěšení linky, tento signál zašle proces kontrolující terminál
ostatním procesům v rámci sesion (sezení), standardní reakce na tento signál je ukončení
procesu; SIGKILL (číslo 9) ­ tento signál způsobí okamžité ukončení procesu, není možné jej
odchytit či ignorovat; SIGTERM (číslo 15) ­ signál pro ukončení procesu, standardní reakce na tento signál je
ukončení procesu; SIGSEGV (číslo 11) ­ signalizuje neoprávněný přístup do paměti, standardní reakce na tento
signál je ukončení procesu a uložení obrazu paměti procesu na disk (určitě se vám již někdy
stalo, že progam skončil s chybou a hlášením typu segmentation fault, core dumped); SIGSTOP (číslo 19) ­ pozastavení vykonávání procesu; SIGCONT (číslo 18) ­ obnovení vykonávání procesu; Detailní popis dostupných signálů je k dispozici v manuálové stránce signal(7). 6.2.4 Praxe: ukončení procesu, nástroj kill pro zasílání signálů procesům
Pro zasílání signálů procesům z příkazové řádky je možné použít utility kill nebo killall (ale
také utilitu top nebo grafické rozhraní "Sledování systému" desktopu GNOME). Z názvu by se
dalo usuzovat, že se jedná o nástroje určené výhradně k ukončení běhu procesů ­ což je skutečně
jejich standardní akce ­ nicméně slouží je lze použít k zaslání jakéhokoliv signálu, nejen signálu
www.linuxzone.cz strana 77 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
SIGTERM pro ukončení procesu. Pokud chceme určitý proces ukončit, máme na výběr ze dvou možností ­ použít signál SIGTERM
(15) anebo signál SIGKILL (9). Rozdíl mezi těmito signály je v tom, že signál SIGKILL
nemůže být procesem odchycen, zatímco na signál SIGTERM může aplikace zareagovat ­ textový
editor např. může před ukončením uložit soubor apod. Nástroj kill ackceptuje jako argument číslo
PID procesu, zatímco nástroj killall akceptuje jako argument jméno procesu (detaily viz
příslušné manuálové stránky). Pokud bychom chtěli např. ukončit proces s číslem PID 146, učinili
bychom to příkazem kill -s SIGKILL 146 anebo třeba kill -9 146. Pokud pracujeme s aplikací "Sledování systému" GNOME, označíme v seznamu procesů pomocí
myši dotyčný proces a přes menu, které vyvoláme stistkuntím pravého tlačítka myši vybereme
položku "Ukončit proces". Tím otevřeme dialog, ve kterém potvrdíme násilné ukončení běhu
procesu. Násilné ukončení běhu procesu takovým způsobem (pomocí signálu SIGKILL) může
znamenat ztrátu neuložených dat, se kterými daná aplikace pracovala. 6.2.5 Praxe: synchronizace rodiče s ukončením potomka
Mnohdy je žádoucí, aby rodičovský proces poznal, kdy je proces ­ potomek ukončen a aby znal
status ukončení svého potomka (jestli byl ukončen regulérně, nebo zda došlo k chybě). Systém na to
pamatuje a při ukončení procesu potomka rodičovskému procesu zašle příslušný signál (SIGCLD).
www.linuxzone.cz strana 78 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
Standardní reakce na tento signál je jej ignorovat, je ovšem možno nastavit zachytávání signálu
pomocí volání jádra signal() nebo sigaction(). Jádro dále poskytuje volání jádra wait(),
waitpid() a wait4(), která slouží k čekání na ukončení běhu potomka. Demonstrujme si to na
krátkém příkladu v jazyce C, detaily čtenář nalezne v příslušných manuálových stránkách: /* potřebné hlavičkové soubory */
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
int CheckStatus() {
pid_t pid;
int status;
}
pid=wait(&status);
printf("potomek: %i návratový kód: %i\n",pid,status);
int main(int argc, char **argv) {
/* instalujeme signal handler,
standardní reakce je signál SIGCLD ignorovat */
signal(SIGCLD,(void*)CheckStatus);
if (fork()==0) {
/* zde pokračuje vykonávání potomka ... */
exit(0);
}
}
/* zde pokračuje rodič*/
sleep(5);
return(0);
Poznámka: Pokud rodičovský proces stále běžía status ukončení svého potomka nevyzvedne,
zůstane potomek ve stavu mátoha (zombie). Pokud v době ukončení potomka již rodičovský proces
neexistuje, vyzvedne za něj status ukončení potomka proces init. 6.2.6 Praxe: nastavení reakce na signály ­ signal(), sigaction()
Nyní si v krátkosti ukážeme, jak v jazyce C nastavovat reakce na signály. Máme na výběr ze dvou
rozhraní: starší představuje volání jádra signal(), které vychází z normy ANSI C, novější je
volání jádra sigaction(), které je v souladu s normou POSIX . Dejme tomu, že programujeme
systémovou aplikaci, která běží na pozadí (démon)a přejeme si, aby proces po obdržení signálu
SIGHUP znovu načetl svůj konfigurační soubor a naopak aby ignoroval signály SIGTTIN,
SIGTTOU a SIGTSTP: /* potřebné hlavičkové soubory */
www.linuxzone.cz strana 79 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
#include <signal.h>
#include <stdio.h>
int LoadConfig() {
/* zde ošetříme znovunačtení
konfiguračního souboru ...*/
}
int main(int argc, char **argv) {
/* na začátku načteme konfigurační soubor,
k čemuž v našem případě slouží fce LoadConfig() */
LoadConfig();
/* nastavíme signal handler pro signál SIGHUP */
signal(SIGHUP,(void*)LoadConfig);
/* signály SIGTTIN, SIGTTOU a SIGTSTP
budeme ignorovat */
signal(SIGTTIN,SIG_IGN);
signal(SIGTTOU,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
/* pokračuje tělo programu ... */
for(;;);
}
6.2.7 Příka zový interpret a říz ení procesů ­ job control
Příkazové interprety v UN*XOvých systémech umožňují pracovat s více programy najednou s tím,
že uživatel může mezi jednotlivými procesy přepínat, může vykonávání některých činností
pozastavit a posléze v nich zase pokračovat dále. V daném okamžiku ovšem nemá smysl, aby z
terminálu četly nebo na něj zapisovaly všechny aplikace zárověň. Obvykle je taková aplikace jen
jedna ­ o takové aplikaci říkáme, že běží na popředí. Ostatní aplikace jsou buď pozastaveny anebo
mohou běžet na pozadí ­ v případě, že nepotřebují bezprostředně číst z terminálu nebo na něj
zapisovat. Správa procesů spouštěných v rámci příkazového interpretu je realizována pomocí
mechanismu job control, který využívá pro oddělení procesů běžících na popředí či pozadí odlišné
skupiny procesů v rámci jedné session (sezení), jednotlivým skupinám procesů pak podle potřeby
zasílá signály (podrobnosti opět viz manuálová stránka signal(7) a manuálová stránka
příkazového interpretu bash). Podívejme se, jak v praxi používat mechanismus job control v
příkazovém interpretu bash: •
pokud chceme spustit aplikaci na pozadí, za příkaz doplníme znak &, např: vanvancito ~ $ netscape &
•
příkaz jobs vypíše seznam procesů, které v rámci tohoto sezení běží, na procesy se budeme
www.linuxzone.cz strana 80 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
odvolávat čísly, které jsou uvedeny v hranatých závorkách (nejedná se o PID procesu, je to
číslo, pod kterým proces eviduje příkazový interpret v rámci mechanismu job control).
Proces, který běžel na popředí jako poslední, je označen znakem +. Proces, který běžel na
popředí jako předposlední, je označen znakem -. Na tyto procesy se můžeme pro větší
pohodlí odvolávat i znaménky + a - namísto jejich čísel. vanvancito ~ $ jobs
[1]
[2][3]+
•
•
•
Stopped
Stopped
Stopped
vi
man ls
bc
příkaz fg (foreground) převede daný proces do popředí, chceme­li tedy pokračovat v práci s
editorem vi, zadáme fg %1. příkaz bg (background) převede daný proces do pozadí. toto má smysl tehdy, jedná­li se o
aplikaci, která nepotřebuje bezprostředně číst z terminálu nebo na něj zapisovat ­ pokud by
se o to pokusila, bude pozastavena do té doby, než bude vyvolána do popředí. stisknutí sekvence ^Z (Control­Z) způsobí, že bude proces běžící na popředí pozastaven.
Chceme­li takto pozastavený proces poslat běžet na pozadí, použijeme následně ještě příkaz
bg. Toto je jen zkrácený popis možností, pokud se rozhodnete tento mechanismus používat, určitě si
prostudujte příslušnou část manuálové stránky příkazového interpretu bash. 6.3 Jádro systému a ovladače
Jádro Linuxu může být sestaveno dvěma způsoby: potřebné ovladače mohou být zakompilovány
přímo do jádra anebo mohou být k dispozici formou tzv. modulů ­ tedy ovladačů, které mohou být
do jádra zavedeny nebo naopak uvolněny kdykoliv podle potřeby. Nicméně minimální sada
ovladačů (t.j. ovladačů těch zařízení, bez kterých by nebylo možné systém spustit ­ např. ovladač
pevného disku apod.) musí být k dispozici již při startu systému, což se obvykle řeší za použití
speciálního ramdisku "initrd". V této části manuálu se podíváme, jak to celé funguje, naučíme se
pracovat s moduly a zaměříme se na co si dát pozor při eventuálním sestavování vlastního
modulárního jádra. Následující kapitola se věnuje problematice zavádění modulů a popisu nástrojů
pro práci s moduly. 6.3.1 Monolitické nebo modulární jádro?
Linux podporuje značné množství periferií a tedy i množství ovladačů, které jsou zapotřebí k
provozu běžných instalací Linuxu je velké. Ovladače mohou být přímou součástí jádra ­ takové
jádro, které obsahuje pouze zabudované ovladače nazýváme jádrem monolitickým. Většina
ovladačů však může být sestavana a používána jako moduly, které lze za běhu systému v případě
potřeby natáhnout nebo je naopak kdyz už nejsou zapotřebí z jádra uvolnit. Pokud je jádro
www.linuxzone.cz strana 81 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
sestaveno s podporou modulů, hovoříme o modulárním jádře. Pochopitelně velikost jádra je
omezená, takže mnohdy ani není možné sestavit monolitické jádro, které by obsahovalo všechny
požadované ovladače, obvykle se tedy používají jádra modulární; jádra monolitická používají v
opodstatněných případech zkušení uživatelé, kteří si je připravují podle svých potřeb. Pokud používáme modulární jádro (což je samozřejmě i případ OS Linux Mission), neobejdeme se
bez balíčku modutils, který obsahuje nástroje pro práci s moduly. Jednotlivé nástroje balíčku
modutils si nyní představíme a na krátkých příkladech vysvětlíme práci s moduly. Ještě doplňme, že
moduly pro danou verzi jádra jsou uložené v odpovídajícím podadresáři v adresáři /
lib/modules. Moduly jsou pak ještě rozděleny do podadresářů podle funkce (ovladače
blokových zařízení v adresáři drivers/block, ovladače znakových zařízení v adresáři
drivers/char, ovladače souborových systémů v adresáři fs atd.). Celá stromová struktura pak
může vypadat např. takto (v příkladu pro jádro 2.4.22, výpis je zkrácen; (mimochodem verzi
běžícího jádra zjistíme příkazem uname s volbou ­a, v případě jádra uloženého v souboru na disku
si vypomůžeme příkazy strings a grep): /
`-lib
`-modules
`-linux-2.4.22-1.2188.lz.1.nptl
|-- build -> /usr/src/linux-2.4.22-1.2188.lz.1.nptl
|-- kernel
|
|-- drivers
|
|
|-- block
|
|
|
|-- loop.o
|
|
|
`-- rd.o
|
|
|-- cdrom
|
|
|
`-- cdrom.o
|
|
|-- char
|
|
|
`-- lp.o
|
|
|-- i2c
|
|
|-- media
|
|
|-- net
|
|
|-- parport
|
|
|
|-- parport.o
|
|
|
`-- parport_pc.o
|
|
|-- scsi
|
|
`-- sound
|
|-- fs
|
|
|-- fat
|
|
|
`-- fat.o
|
|
|-- isofs
|
|
|
`-- isofs.o
|
|
`-- msdos
|
|
`-- msdos.o
|
`-- net
`-- modules.dep
www.linuxzone.cz strana 82 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
6.3.2 Práce s moduly ­ balíček modutils
Dříve než se začneme zabývat procesem bootování modulárního jádra a záležitostí s tím spojených,
podívejme se v krátkosti jakým způsobem se s moduly pracuje. Utilita depmod slouží k sestavení jakéhosi "inventáře" dostupných modulů. Obvykle je spuštěna
automaticky při startu systému prostřednictvím startovacích skriptů (konkrétně v systému Mission
je to skript rc.sysinit) a vygeneruje soubor modules.dep ­ což je textový soubor, ve kterém
jsou jednotlivé moduly vypsány spolu s jejich závislostmi. Depmod také použijeme případě, že
dodatečně instalujeme nějaký modul ­ pokud by modul nebyl uveden v souboru modules.dep, bylo
by sice možné jej zavést, ale s mnohem menším komfortem. Např. u modulu lp.o (podpora
tiskáren připojených k paralelnímu portu) bude v souboru modules.dep poznamenáno, že ke své
funkčnosti vyžaduje modul parport.o (což je obecný ovladač paralelního portu nezávislý na
platformě) a ten ještě na platformě PC potřebuje modul parport_pc.o. Nástroj insmod slouží k manuálnímu zavádění modulů do jádra. Obvykle je k dispozici ve dvou
verzích ­ jednak dynamicky linkované a také ve verzi staticky linkované (např. v distribucích Red
Hat insmod.static), což je z toho důvodu, aby bylo možné tento nástroj použít i v případě, kdy
nejsou dostupné knihovny (anebo jsou poškozené). Pokud bychom chtěli zavést modul parport,
spustíme insmod parport. V případě, že chceme pouze ujistit, že daný modul natáhnout lze,
můžeme použít volby -p nebo -n. Pokud použijeme pro zavedení modulu utilitu insmod, je na
nás, abychom v patřičném pořadí zavedli i případné další moduly, které modul vyžaduje, v opačném
případě se setkáme chybovým hlášením, že nelze modul nelze zavést neboť nelze mapovat některé
symboly. Např. pokusíme­li se ručně zavést modul lp, aniž bychom předtím zavedli modul
parport, pokus o zavedení skončí s následující chybovou hláškou: vanvancito /usr/src/linux 48# /sbin/insmod lp
Using /lib/modules/2.4.22/kernel/drivers/char/lp.o
/lib/modules/2.4.22/kernel/drivers/char/lp.o: \
unresolved symbol parport_write_R5279b323
/lib/modules/2.4.22/kernel/drivers/char/lp.o: \
unresolved symbol parport_read_R806760f9
[ ... zkráceno]
Utilita rmmod slouží k uvolnění modulu z jádra. Samozřejmě je možné se zbavit pouze těch
modulů, které nejsou dalšími moduly používány, pokud se pokusíme takový modul odstranit,
obdržíme následující hlášení: vanvancito / 5# /sbin/rmmod parport
parport: Device or resource busy
Utilita lsmod slouží k vypsání zavedených modulů, u každého modulu je vyznačeno, jestli je
používán dalšími moduly a pokud ano, tak kterými. Např. následující výpis ukazuje, že modul
www.linuxzone.cz strana 83 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
parport je používán moduly parport_pc a lp, naopak modul lp žádným modulem používán
není. Pokud bychom tedy chtěli tyto moduly odstranit, zavoláme rmmod nejprve na modul lp, pak
na modul parport_pc a na závěr na modul parport. O významu příznaku "autoclean" se
zmíníme později v části věnované automatickému zavádění a odstraňování modulů: vanvancito / 12# /sbin/lsmod
Module
Size
parport_pc
19056
lp
5200
parport
28960
Used by
1 (autoclean)
0 (unused)
1 [parport_pc lp]
K pohodlnější manipulaci s moduly je určena utilita modprobe. Ta používá výše zmíněný soubor
modules.dep, ve kterém jsou popsány závislosti mezi moduly, takže není nutné zavádět
jednotlivé moduly postupně, pokud bychom např. chtěli zavést ovladač bttv (ovladač pro
televizní/radio tunery), postačí zadat příkaz modprobe bttv. Chceme­li pouze zjistit, jaké moduly
budou v daném případě zavedeny, můžeme modprobe spustit s volbou -n: vanvancito /
/sbin/insmod
/sbin/insmod
/sbin/insmod
/sbin/insmod
/sbin/insmod
140# modprobe -n -v bttv
/lib/modules/2.4.22/kernel/drivers/i2c/i2c-core.o
/lib/modules/2.4.22/kernel/drivers/media/video/videodev.o
/lib/modules/2.4.22/kernel/drivers/sound/soundcore.o
/lib/modules/2.4.22/kernel/drivers/i2c/i2c-algo-bit.o
/lib/modules/2.4.22/kernel/drivers/media/video/bttv.o
6.3.3 Automatické zavádění a odstranění modulů jádrem ­ kmod
Kromě manuálního zavádění ovladačů nástroji z balíčku modutils je také možno jádro sestavit s
podporou automatického zavádění modulů. Moduly pak mohou být natahovány aktuálně podle
potřeby. Záležitosti týkající se podpory modulů nalezneme při konfiguraci jádra v sekci "Loadable
module support", jedná se o volba "Kernel module loader". Ve starších jádrech Linuxu (dnes už historické řady 2.0.x) jsme se setkávali s démonem kerneld
(což byl samostatný proces běžící mimo jádro), v novějších jádrech ale má toto na starostí vlákno
jádra kmod. Kmod nabízí oproti kerneld sice omezenou funkčnost ­ v podstatě pouze v případě
potřeby spustí modprobe ­ což se ovšem běžného uživatele nijak nedotkne. Jediná pro běžného
uživatele pozorovatelná změna je ta, že kerneld sám odstraňoval po uplynutí určité doby
nepoužívané moduly, zatímco na systémech používajících pro správu modulů kmod se
nepužívaných modulů zbavíme pomocí periodického spuštění rmmod s příslušnými parametry z
cronu ­ cron tabulka pak může obsahovat např. následující záznam: # každých 10 minut se zbavíme nepoužívaných modulů
# s příznakem autoclean
*/10 * * * *
root
/sbin/rmmod -as
www.linuxzone.cz strana 84 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
Ještě doplňme, že při zavádění modulu máme možnost u modulu nastavit příznak "autoclean"
(volba -k). Pokud je tento příznak nastaven, může být modul odstraněn právě spuštěním rmmod s
volbou -a; máme tedy možnost zavést modul i takovým způsobem, aby nebyl po určité době
automaticky odstraněn i když není používán. Protože kmod pro zavádění modulů používá modprobe, uplatní se i při automatickém zavádění
modulu jádrem konfigurace uložená v konfiguračním souboru /etc/modules.conf (viz
následující odstavec věnovaný předávání parametrů ovladačů). 6.3.4 Pře dávání parametrů ovladačů
Řada ovladačů umožňuje nastavení různých parametrů, jako jsou např. I/O adresy či přerušení atd.
Nástroj modinfo umožňuje prohlížet informace o modulu jako je popis modulu nebo zejména
možné parametry (volba -p): vanvancito / 109# /sbin/modinfo --p parport_pc
io int array (min=1,max=8), description "Base I/O address (SPP regs)"
io_hi int array (min=1,max=8), description "Base I/O address (ECR)"
irq string array (min=1,max=8), description "IRQ line"
dma string array (min=1, max=8), description "DMA channel"
Příslušné parametry pak můžeme zadat utilitě insmod či modprobe při zavádění modulu, např.
následující příkaz zavede modul parport_pc a požaduje inicializaci dvou paraleních portů, první
na adrese 0x378 bude používat číslo přerušení 7, druhý na adrese 0x278 a číslo přerušení (IRQ)
bude autodetekováno ovladačem: vanvancito / 114# /sbin/insmod parport_pc.o io=0x378,0x278 irq=7,auto
Naopak pokud by byl ovladač zakompilován v jádře přímo, potřebné nastavení bychom předali
jádru při startu jako parametr. Pokud používáme jako zavaděč systému GRUB (což je případ
standardní instalace Mission), doplníme je na konec řádku s direktivou kernel: kernel /vmlinuz-2.4.22-1.2188.lz.1.nptl ro root=/dev/md2 rhgb parport=0x378,7 \
parport=0x278,auto
Pokud pro zavadení jádra používáme např. zavaděč LILO, v konfiguračním souboru lilo.conf
bychom uvedli následující řádek: append "parport=0x378,7 parport=0x278,auto"
Pokud používáme pro zavádění modulů utilitu modprobe anebo máme v jádře zapnutou podporu
automatického zavádění modulů (ať už starší kerneld či novější kmod), což je způsob který
www.linuxzone.cz strana 85 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
používá drtivá většina instalací Linuxu, pak patřičné parametry ovladačů můžeme uvést v
konfiguračním souboru /etc/modules.conf. Pak bychom do konfiguračního souboru uvedli
třeba následující: alias parport_lowlevel parport_pc
options parport_pc io=0x378,0x278 irq=7,auto
Nástroje balíčku modutils podporují řadu dalších voleb, které tady nejsou zmíněny, stejně tak zde
není detailně rozebrána syntaxe a možnosti konfiguračního souboru modules.conf. Pokud
bychom zde ale chtěli probrat všechny možnosti, text by se tím redukoval na výtah manuálových
stránek a ztratil na přehlednosti. Zájemce o detailnější popis tedy odkáži na příslušné manuálové
stránky balíčku modutils a dokumentaci jádra. 6.4 Proces bootování jádra
V této části se zaměříme na vlastní proces bootování modulárního jádra, vysvětlíme použití
ramdisku initrd a představíme si nástroj mkinitrd pro generování obrazu ramdisku initrd. Pokud se přidržíme architektury Intel, vypadá proces bootování takto: BIOS načte a spustí z
diskového zařízení (pevný disk, floppy, ...) zavaděč uložený v boot sektoru diskety nebo MBR
(master boot record) pevného disku. Tento zavaděč (boot loader ­ Grub, LILO apod.) pak do paměti
načte vlastní jádro Linuxu a spustí jej. Jádro poté inicializuje nezbytný hardware, konzoli a zejména
připojí kořenový svazek v režimu pouze pro čtení. Poté jádro spustí proces init, který očekává v
souboru /sbin/init na kořenovém svazku. Proces init pak v závislosti na konfiguraci (soubor
/etc/inittab) dále řídí start a konfiguraci systému ­ což obvykle zahrnuje kontrolu
souborového systému kořenového svazku, znovupřipojení kořenového svazku v režimu pro zápis,
kontrolu a připojení ostatních svazků, inicializace dalšího hardware a v závěrečné fázi startu
systému spuštění dalších procesů podle konfigurace (obvykle minimálně getty, který na konzoli
čeká na přihlášení uživatele, případně další systémové procesy běžící na pozadí ­ může také spustit
manažer grafického prostředí X Window System jako je v případě Mission gdm ­ Gnome Display
Manager ­ (nebo jeho alternativy kdm či starší xdm). Podrobným popisem fungování programu
init se zde nebudeme zabývat, pouze dodejme, že Linuxové distribuce většinou (včetně Linuxu
Mission) používají init odvozený od Systému V (na rozdíl od initu používaného v systémech
BSD). Další informace týkající se fungování initu a úrovni běhu systému čtenář nalezne v
programové dokumentaci. Proces init má PID (číslo procesu 1) a zůstává pak na vrcholu
hierarchie procesů rodičovským procesem pro všechny další spouštěné procesy. 6.4.1 Initrd, prvotní koř enový svazek a skript linuxrc
Výše uvedený popis ovšem vychází z předpokladu, že samotné jádro přímo obsahuje ovladače
hardware potřebné pro počáteční inicializaci systému ­ mimo jiné ovladač řadiče pevného disku, na
kterém se nachází kořenový svazek. Vzhledem k tomu, že systém je obvykle zaváděn z pevného
www.linuxzone.cz strana 86 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
disku a přitom existuje velké množství zejména SCSI řadičů z nichž každý používá odlišný ovladač,
je pochopitelné, že nelze kvůli limitované velikosti jádra sestavit takové monolitické jádro, které by
obsahovalo podporu pro všechen běžně používaný hardware. V minulosti se tento problém řešil tím,
že existovalo několik variant bootovacích disket, uživatel si pak pro instalaci systému vybral tu,
která obsahovala jádro s podporou odpovídajícího hardware. Dnes ovšem při instalaci systému vystačíme s jedním jádrem, modulárním. Problém tkví v tom,
jakým způsobem patřičný modul do jádra zavést, když během startu jádra ještě není připojen
kořenový svazek na kterém jsou moduly uloženy. Tento problém se řeší za pomocí ramdisku a
speciálního blokového zařízení /dev/initrd. Celé to funguje tak, že zavaděč systému současně s
jádrem zavede do paměti i komprimovaný obraz prvotního kořenového svazku ("initial root") a
tento je pak pro jádro dostupný právě pomocí zařízení /dev/initrd. Jádro pak komprimovaný
obraz prvotního kořenového svazku načte z /dev/initrd, rozbalí jej a uloží do normálního
ramdisku (zařízení /dev/ram0, paměť kterou zabíral /dev/initrd je pak možné uvolnit).
Souborový systém je pak ze zařízení /dev/ram0 připojen jako prvotní souborový systém v režimu
pro čtení i zápis. Pokud na tomto svazku existuje spustitelný soubor linuxrc, jádro jej spustí
(obvykle se jedná o skript ­ na prvotním kořenovém svazku je pak také uložena speciální omezená
verze příkazového interpretu). Na prvotním kořenovém svazku také mohou být obsaženy potřebné
moduly, které jsou prostřednictvím skriptu linuxrc zavedeny da jádra. Po vykonání skriptu
linuxrc jádro dle konfigurace připojí namísto prvotního kořenového svazku "normální" kořenový
svazek. Pokud na tomto regulérním kořenovém svazku existuje adresář /initrd, je obsah
prvotního kořenového svazku přesunut do tohoto adresáře ­ takže může zůstat nadále dostupný.
Protože je již připojen regulérní kořenový svazek, jádro dokončí start systému spuštěním programu
init, tak jak je popsáno výše. 6.4.2 Jak vytvoř it obraz initrd
Abychom pochopili, jak initrd funguje, popíši zde nejprve ruční postup vytvoření obrazu prvotního
kořenového svazku. Následně přijde na řadu utilita mkinitrd, která initrd usnadňuje. Nejjednodušší metodou jak vytvořit obraz prvotního kořenového svazku je s použitím zařízení
"loop", které umožňuje připojit souborový systém uložený nikoliv na fyzickém blokovém zařízení,
ale v souboru (detaily viz např. manuálová stránka příkazu mount). Nejprve si tedy vytvoříme
soubor potřebné velikosti. [root@mission /tmp]# dd if=/dev/zero of=initrd bs=300k count=1
.. a pomocí mke2fs v něm vytvoříme souborový systém (je vhodné použít volbu -m0, protože
šetříme místem a je zytečné rezervovat část svazku): [root@mission /tmp]# mke2fs -F -m0 initrd
www.linuxzone.cz strana 87 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
Poté jej příkazem mount připojíme: [root@azucar /tmp]# mount -t ext2 -o loop initrd /mnt
Nyní již připravíme adresářovou strukturu a nakopírujeme potřebné soubory, celý svazek může
vypadat např. takto ­ příklad uvádí obsah prvotního kořenového svazku používaného pro boot
systému, kde je kořenový svazek umístěn na zařízení /dev/md0 (jedná se o diskové pole
realizované jaderným ovladačem softwarového RAIDu typu RAID 1). Adresář /bin obsahuje
příkazový interpret nash a utilitu insmod pro zavádění modulů do jádra (obojí staticky linkované).
Adresář /dev obsahuje minimální sadu souborů reprezentujících speciální zařízení, které
potřebujeme. Disky tvořící RAID svazek jsou připojeny k řadiči Symbios 53C1010 a proto je zde (v
adresáři /lib) i potřebný ovladač ­ modul sym53c8xx.o a samozřejmě ovladač SCSI disků
sd_mod.o a podpora SCSI zařízení obecně ­ modul scsi_mod.o. Dále potřebujeme patřičný
ovladač raidu ­ modul raid1.o. Boot systému řídí skriptu linuxrc, kterému se budeme detailně
věnovat níže. Adresář /sysroot nám poslouží jako přípojný bod normálního kořenového svazku
(potřebujeme jej v případě, že použijeme volání jádra pivot_root, toto ještě upřesníme níže). |-|
|
|
|-|
|
|
|
|
|
|
|
|
|-|-|
|
|
|
|
|
|-|-|-|-`--
bin
|-- insmod
|-- modprobe -> /sbin/nash
`-- nash
dev
|-- console
|-- md0
|-- null
|-- ram
|-- systty
|-- tty1
|-- tty2
|-- tty3
`-- tty4
etc
lib
|-- sym53c8xx.o
|-- ext3.o
|-- jbd.o
|-- raid1.o
|-- scsi_mod.o
`-- sd_mod.o
linuxrc
loopfs
proc
sbin -> bin
sysroot
Jakmile máme prvotní kořenový svazek připraven, můžeme je pomocí programu gzip
komprimovat. Pak zbývá nakonfigurovat zavaděč systému tak, aby komprimovaný obraz prvotního
kořenového svazku zavedl jako initrd současně s jádrem. Používáme­li jako zavaděč systému
www.linuxzone.cz strana 88 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
GRUB, uplatníme v konfiguračním souboru grub.conf direktivu initrd např. takto: # soubor grub.conf
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
#
all kernel and initrd paths are relative to /boot/, eg.
#
root (hd0,0)
#
kernel /vmlinuz-version ro root=/dev/md2
#
initrd /initrd-version.img
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Mission (2.4.22-1.2188.lz.1.nptl)
root (hd0,0)
kernel /vmlinuz-2.4.22-1.2188.lz.1.nptl ro root=/dev/md2 rhgb
initrd /initrd-2.4.22-1.2188.lz.1.nptl.img
Používáme­li jako zavaděč OS LILO, opět uplatníme v konfiguračním souboru direktivu initrd a
soubor lilo.conf může vypadat např. takto: # soubor lilo.conf
#
boot=/dev/md0
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
default=mission
image = /bzImage
label = mission
initrd = /boot/initrd.gz
root=/dev/md0
read-only
6.4.3 Skript linuxrc, interpret nash
Soubor linuxrc, který jádro spustí po připojení prvotního kořenového svazku může být jakýkoliv
spustitelný soubor ­ ale obvykle se jedná o skript pro nějaký odlehčený příkazový interpret ­
konkrétně v Mission se jedná o interpret nash. Ten podporuje jen několik málo vestavěných
příkazů, jako je echo, mount, /umount, raidautorun, mkrootdev a pivot_root. (viz
manuálová stránka interpretu nash). Skript linuxrc se postará o natažení potřebných modulů a
inicializaci RAID svazku a v našem příkladu může vypadat např. takto: #!/bin/nash
# Natažení podpory SCSI
insmod /lib/scsi_mod.o
# Natažení ovladače SSI disků
www.linuxzone.cz strana 89 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
insmod /lib/sd_mod.o
# Natažení ovladače řadiče Symbios 53C1010
insmod /lib/sym53c8xx.o
# Natažení ovladače RAID 1
insmod /lib/raid1.o
# Natažení ovladačů souborového systému ext3
insmod /lib/jbd.o
insmod /lib/ext3.o
# Připojení souborového systému /proc
mount -t proc /proc /proc
# Vyvolání autodetekce diskových polí softwarého RAIDu
raidautorun /dev/md0
# Vytvoření blokového zařízení reprezentujícího skutečný kořenový svazek
# (předali jsme jej jádru jako parametr prostřednictvím zavaděče systému)
mkdevices /dev
mkrootdev /dev/root
# poté, co jsme v předchozím kroku zjistili kde se nachází skutečný kořenový
# a vytvořili jsme odpovídající blokové zařízení jako /dev/root
# nastavíme umístění kořenového svazku v jádře na /dev/ram0
# (tím zajistíme, že se neuplatní mechanismus change root - vysvětelní viz
# text dále)
echo 0x0100 > /proc/sys/kernel/real-root-dev
# připojíme skutečný kořenový svazek
mount -o defaults --ro -t ext3 /dev/root /sysroot
# nyní vyvoláme záměnu prvotního kořenového svazku umístěného na ramdisku
# initrd za skutečný kořenový svazek
pivot_root /sysroot /sysroot/initrd
# odpojíme /proc (po záměně kořenového svazku je dostupný jako /initrd/proc)
umount /initrd/proc
6.4.4 Změna kořeno vého svazku ­ change_root nebo pivot_root
Nyní se podíváme, jakým způsobem dochází k záměně prvotní kořenového svazku za regulérní
kořenový svazek. Nejprve si připoměňme, jakým způsobem jádru sdělujeme, odkud má připojit
normální kořenový svazek. Zde máme na výběr z několika možností. Jednak se při sestavení jádra
uloží do jeho obrazu výchozí nastavení (podle aktuálního umístění kořenového svazku v době
kompilace), toto nastavení můžeme změnit pomocí utility rdev. Dále můžeme předat jádru při
startu parametr ve formátu "root=zařízení" (toto je obvyklý způsob), o předání tohoto parametru se
obvykle postará zavaděč systému (viz dokumentace zavaděče systému). Pokud při bootování
používáme ramdisk initrd, máme ještě jednu možnost: svazek odkud se má připojit normální
kořenový svazek můžeme specifikovat během vykonávání skriptu linuxrc zápisem do /
proc/sys/kernel/real-root-dev (k tomu samozřejmě musíme nejprve souborový systém
/proc připojit). A teď už pojďme k popisu mechanismu nahrazení prvotního kořenového svazku normálním
kořenovým svazkem. Aby to nebylo tak jednoduché, současná jádra podporují dva mechanismy.
Starší mechanismus (označovaný jako "change_root") funguje tak, že po ukončení vykonávání
skriptu linuxrc jádro připojí regulérní kořenový svazek a prvotní kořenový svazek (pokud jej ještě
www.linuxzone.cz strana 90 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
některý proces používá a na normálním kořenovém svazku existuje adresář /initrd) přesune do
adresáře /initrd v normálním kořenovém svazku. Touto variantou se zabývat nebudeme, protože
mechanismus change_root je jádrem podporován jen kvůli zpětné kompatibilitě se staršími systémy.
Druhý, novější mechanismus se nazývá "pivot_root". V tomto případě se skript linuxrc po
zavedení potřebných modulů postará ještě o následující: •
•
•
•
vytvoření přípojného místa pro regulérní kořenový svazek, připojení regulérního kořenového svazku na přípojné místo (na tomto svazku musí existovat
přípojný bod pro prvotní kořenový svazek, zpravidla se k tomuto použije adresář initrd v
kořenu), přes /proc/sys/kernel/real-root-dev nastaví umístění kořenového svazku na /
dev/ram0 ­ tímto zajistíme, že po ukončení skriptu linuxrc se už neuplatní mechnismus
change root, který jádro podporuje z důvodů zpětné kompatibility. provede volání jádra pivot_root, které vyvolá změnu kořenového svazku. 6.4.5 Mkinitrd ­ nástroj pro generování initrd
Pokud vám to doposud připadalo složité, nezoufejte. Současné Linuxové distribuce používají
modulární jádra, ovšem aby uživatel nemusel po rekompilaci jádra obraz initrd pracně vytvářet
manuálně, tak jak jsme to popsali výše, používá se utilita mkinitrd. Za předpokladu, že nebudete
používat nějaké velmi netradiční konfigurace systému ­ se ručním úpravám ramdisku initrd
nemusíte obávat. Nástroj mkinitrd je skript, který ze souboru /etc/fstab zjistí na jakém
zařízení se nachází kořenový svazek a ze souboru /etc/modules.conf načte seznam
používaných modulů. Na základě toho pak sám vygeneruje komprimovaný obraz initrd. Na
uživateli pak je aby obraz ramdisku umístil do adresáře boot a upravil konfiguraci zavaděče. Cílem této části manuálul bylo přiblížit proces bootování modulárního jádra a přípravu obrazu
ramdisku initrd, další informace čtenář nalezne v příslušné programové dokumentaci
(manuálové stránky initrd(4), nash(8), pivot_root(2), pivot_root(8), mkinitrd(8) a také dokumentaci
jádra ­ soubor linux/Documentation/initrd.txt, linux/Documentation/kernel­parameters.txt apod.). 6.5 Start systému: jakou roli hraje proces init?
V předcházející kapitole jsme se měli možnost seznámit s mechanismem bootování jádra, na tuto
kapitolu nyní volně navážu a budeme se zabývat další fází startu systému ­ vysvětlíme roli procesu
init a způsoby, jakým jsou při startu konfigurovány a spouštěny služby. 6.5.1 Inicializace systému, hierarchie procesů
Jakmile je do paměti nějakým způsobem jádro UN*Xového systému zavedeno a spuštěno provede
jádro inicializaci svých interních datových struktur, inicializuje hardware, připojí kořenový svazek a
www.linuxzone.cz strana 91 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
vytvoří prostředí procesu 0 ­ systém dále běží jako proces 0 (zatím vše stále běží v režimu jádra).
Proces 0 potom vytvoří potomka ­ proces s PID 1, ten přejde z režimu jádra do uživatelského
režimu a pomocí algoritmu exec spustí program uložený v souboru /etc/init anebo /
sbin/init. Init (proces s PID 1) pak dále řídí start systému a v závislosti na konfiguraci spouští
další služby. (Pozn.: různé varianty initu se instalují buď na jedno nebo na druhé místo, na což si
musíme dát pozor pokud bychom nahrazovali init jeho jinou variantou). Cestu k programu init lze
také předat při startu jádru jako parametr ve tvaru např. init=/sbin/init. Toto se nám může
hodit, potřebujeme­li z nějakého důvodu obejít standardní startovací sekvenci (např. po havárii
systému, je­li pourušen program init). Pak můžeme namísto initu nechat jádro spustit přímo
příkazový interpret (např. init=/bin/ash.static). V předchozím odstavci jsem použil několik důležitých pojmů, u kterých se v krátkosti zastavíme.
Procesem je míněna běžící instance programu, v UN*Xových systémech (tedy systémech UNIX a
systémech jim podobných včetně Linuxu) má každý proces přiděleno své číslo PID (Process ID).
Proces standardně vzniká voláním jádra fork(). Původní proces, který fork() zavolá se nazývá
rodičovským procesem (parent) a nově vytvořený proces se nazývá potomek (child). Vzniká tak
hierarchie procesů, kde každý proces má svého rodiče (a tento je zaznamenán v kontextu procesu
jako PPID procesu ­ Parent Process ID). Proces může běžet buď v režimu jádra nebo v režimu
uživatelském; proces může z režimu uživatelského přejít do režimu jádra pomocí tzv. volání jádra
(např. již výše zmíněný fork() nebo exec()). Rozdíl mezi režimem jádra a režimem
uživatelským je v tom, že v režimu jádra jsou přístupné i paměťové struktury jádra. Vidíme tedy, že proces 0 vzniká nestandardním způsobem ­ jádro jej vytváří přímo bez použití
algoritmu fork, teprve proces 1 (init) už vzniká obvyklou posloupností algoritmů fork (rozdvojení
procesu) a následným uplatněním algoritmu exec (vykonání programu) v kódu potomka. Po
spuštění initu se z procesu 0 stane tzv. swapper. Ve výpisu procesů běžících v systému bychom jej
hledali marně, protože tento proces zůstane před uživatelem skrytý. Na vrcholu hierarchie procesů
stojí proces s PID 1, tedy init. V případě, že je ukončen proces, jehož potomci v systému ještě
existují, systém nastaví PPID (Parent Process ID) u těchto procesů na 1 ­ jejich rodičem se pak tedy
stane init. 6.5.2 Úroveň běhu systému (runlevel)
Systém se vždy nachází v určité "úrovni běhu" systému (angl. runlevel). Program init podporuje
7 úrovní běhu, které jsou primárně označené číslicemi 0 až 6 (přesněji řečeno u některých variant
initu je možné použít i úrovně 7 až 9, ovšem z historických důvodů se tyto nepoužívají). V každé
úrovni jsou definovány určité služby, které se mají spustit, některé úrovně mají zvláštní význam (0 ­
halt, zastavení systému; 6 ­ reboot; 1 ­ single user, jednouživatelský režim). Konkrétně v Linuxu
Mission to funguje takto: •
•
•
0 ­ "halt" ­ zastavení systému, 1 ­ "Single user mode" ­ jednouživatelský režim užívaný pro administraci, 2 ­ "Multiuser, without networking" ­ víceuživatelský režim bez připojení k síti, www.linuxzone.cz strana 92 / 159
Impossible: Linux Mission 1.0
•
•
•
•
6. Pod pokličkou ­ orientace v systému pro pokročilé
3 ­ "Full multiuser mode" ­ víceuživatelský režim včetně připojení k síti, 4 ­ "unused" ­ standardně nepoužito, 5 ­ "X11" ­ totéž co úroveň 3 ale navíc spouští X, možnost přihlašování přímo v grafickém
prostředí X Window System, 6 ­ "reboot" ­ restart systému. Administrátor má možnost konfigurovat služby, které budou v daných úrovních běhu spouštěny,
nastavit některou z úrovní běhu jako výchozí a samozřejmě i iniciovat přechod z jedné úrovně běhu
systému do druhé. 6.5.3 BSD versus System V
Existují dva přístupy ke konfiguraci programu init: první se historicky používal a používá v
systémech odvozených od rodiny UNIXových systémů BSD a je jednodušší ­ spouštění služeb,
které v dané úrovni běhu systému mají běžet se realizuje v jednom skriptu. Druhá varianta vznikla a
používá se v systémech odvozených od UNIX System V. Tato varianta je sofistikovanější (neříkám,
že lepší, o tom, která z variant je lepší vedou admini s chutí od nepaměti sáhodlouhé spory).
Funguje to tak, že pro každou úroveň běhu je vyhrazen určitý adresář, do kterého se umisťují buď
skripty nebo odkazy na skripty, které startují jednotlivé služby a v momentě přechodu do dané
úrovně se skripty v určeném pořadí vykonají. Cílem autorů initu ze Systému V bylo vyhnout se potenciálním nepříjemnostem, ke kterým může
dojít pokud se třeba při automatické instalaci software zasahuje do startovacích skriptů ­ pokud je
ten skript jeden, pak chybný zásah do skriptu (třeba syntaktická chyba apod.) může při startu
způsobit větší problémy než pouhé přidání dalšího skriptu do určeného adresáře (tady se v
nejhorším případě prostě nová služba nespustí, ale jinak vše poběží tak jako dříve). Cenou za toto
drobné zvýšení robustnosti je menší přehlednost tohoto systému v případech, kdy je provozováno
velké množství služeb. Tolik k historii, teď se vraťme zpátky k Linuxu. Protože Linux zahrnuje velké množství distribucí a
mezi jejich tvůrci se vyskytovali jak přiznivci BSD systémů tak i uživatelé Systému V, můžeme si
vybrat. Některé distribuce jako např. Slackware tíhnou k initu ve stylu BSD, jiné, např. Red Hat
tradičně používají init blížící se initu ze Systému V a další, jako např. Suse, nechávají na
administrátorovi aby si zvolil, který přístup se mu jeví vhodnější. Nyní se v krátkosti podíváme jak
to vypadá na Slackware (jako příklad konfigurace ve stylu BSD) a na Red Hatu (jako příklad
konfigurace ve stylu System V). Jinak pro zkušenějšího administrátora samozřejmě není problém
standardní init dodávaný s distribucí vyměnit za jiný, ovšem tím se zde zabývat nebudu, případní
zájemci veškeré potřebé informace stran fungování initu naleznou v programové dokumentaci,
příručkách distribucí apod. 6.5.4 Konfigurace ­ init v Linuxu Mission
Nejprve se podívejme, co a v jakém pořadí init provede: www.linuxzone.cz strana 93 / 159
Impossible: Linux Mission 1.0
•
•
•
•
6. Pod pokličkou ­ orientace v systému pro pokročilé
z konfiguračního souboru /etc/inittab init zjistí, jaká je výchozí úroveň běhu systému
a cestu ke skriptu, který má být vykonán po bootu systému (obvykle je to skript /
etc/rc.d/rc.sysinit) spustí skript /etc/rc.d/rc.sysinit spustí všechny skripty v patřičném adresáři odpovídajícím výchozí úrovni běhu systému
(posledním skriptem v tomto adresáři obvykle je rc.local) na závěr spustí programy definované v souboru /etc/inittab 6.5.5 Konfigurační soubor /etc/inittab
Tento konfigurační soubor má jednoduchou syntaxi, kterou si nejlépe přiblížíme na následujícím
příkladu. Každý řádek obsahuje několik údajů, jako je identifkátor položky, úroveň nebo i více
úrovní běhu, při které se uplatní, způsob spouštění služby a cesta k programu, který má být spuštěn.
Pokud jde o způsob spouštění např. můžeme specifikovat, že se má daný program (či skript)
vykonat pouze jednou při startu systému (např. skript rc.sysinit), nebo že má být program po
jeho ukončení opět spouštěn ve smyčce stále znovu (např. getty). Nebudeme se zde zabývat
detailním popisem jednotlivých položek v konfiguračním souboru /etc/inittab, detaily čtenář
nalezene v příslušné manuálové stránce. # zde nastavíme výchozí úroveň běhu systému, do které systém naběhne
id:5:initdefault:
# cesta ke skriptu, který se spouští při bootu
si::sysinit:/etc/rc.d/rc.sysinit
# zde definujeme, který skript init spustí po vstupu do
# určité úrovně běhu, tento skript pak prochází příslušný adresář
# a zapíná/vypíná služby
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# při stisku CTRL-ALT-DELETE spustíme regulérní shutdown
# (jádro zašle pro stisku této kombinace kláves initu signál SIGINT)
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# pokud obdržíme signál od UPS, že byla dodávka el. proudu
# přerušena, spustíme shutdown s rezervou 2 minut
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure, shuttdown"
# pokud je dodávka napájení obnovena, zrušíme běžící shutdown
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored"
# poznámka: init reaguje na signál SIGPWR, dnes ale
# obvykle spuštění shutdownu v případě výpadku napájení
# obstarává přímo obslužný software UPS a nikoliv init
#
v úrovních 1 až 5 spustíme na na virtuálních konzolích 1 až 6
www.linuxzone.cz strana 94 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
# program mingetty a umožníme tím přihlášení v textovém režimu
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# v úrovni 5 spustíme správce displeje, který se postará o přihlášení
# do systému v grafickém prostředí X Window System, poběží na virtuální
# konzoli číslo 7, neboť tato je první volná
# (prvních 6 obsadí program mingetty)
x:5:respawn:/etc/X11/prefdm -nodaemon
Malá odbočka na vysvětlenou ­ přihlášení uživatele na textovou konzoli probíhá následovně: init
spustí program getty, ten na konzoli vypíše výzvu "login:" a čeká na zadání jména uživatele. Poté
co uživatel zadá jméno, proces getty vyvolá exec() a je nahrazen programem login (ovšem
stále se jedná o tentýž proces, z pohledu initu tedy pořád běží). Program login se postará o
autentizaci, autorizaci a přihlášení uživatele a následně pomocí fork() a exec() vytvoří nový
proces a spustí příkazový interpret (shell). Jakmile uživatel chce ukončit práci se systémem, ukončí
příkazový interpret, rodičovský proces login to zjistí a uživatele odhlásí. Init nyní zaregistruje
ukončení procesu a znovu spustí getty. 6.5.6 Startovací skripty rc.sysinit a rc.local
Skript /etc/rc.d/rc.sysinit se vykonává jen jednou a to při startu systému. Postará se
obvykle o takové věci, jako je kontrola a připojení dalších svazků (na počátku je připojen pouze
kořenový svazek), nastavení parametrů jádra, natažení mapy klávesnice, natažení ovladačů (modulů
jádra), aktivace odkládácího prostoru (swapu) atd. Skript /etc/rc.d/rc.local se obvykle spouští až v závěru startovací sekvence ­ bývá
nalinkován v adresářích úrovní běhu jako poslední. Je možné do něj vložit různá dodatečná
nastavení apod. Také jej lze s výhodou použít jako náhradu startovacího skriptu BSD initu ­ pokud
nám styl initu ze Systému V nevyhovuje, prostě budeme BSD init simulovat tak, že budeme
spouštění veškerých služeb vepisovat pouze do tohoto souboru a v konfiguračním souboru /
etc/inittab prostě do vybraných položek l[1­5] v souboru /etc/inittab uvedeme rovnou
tento skript. Musíme se však smířit s tím, že instalační balíčky s tím nepočítají a tedy to budeme
muset dělat ručně. 6.5.7 Definování služeb v jednotlivých úrovních běhu
Nyní si probereme okomentovanou adresářovou strukturu se soubory, které init ke své práci
používá: /etc/rc.d/
www.linuxzone.cz strana 95 / 159
Impossible: Linux Mission 1.0
|-|
|
|
|
|-|-|-|-|
|
|
|
|
|
|
|-|
|
|
|
|
|
|
|
|
|-|
|
|
|
|-|
|-|
|-|
`--
6. Pod pokličkou ­ orientace v systému pro pokročilé
init.d
|-- anacron
|-- apcupsd
|-- apmd
`-- [ .. zkráceno .. ]
rc
rc.local
rc.sysinit
rc0.d
|-- K01yum -> ../init.d/yum
|-- K03messagebus -> ../init.d/messagebus
|-- K05anacron -> ../init.d/anacron
|-- K05atd -> ../init.d/atd
[ .. zkráceno .. ]
|-- S00killall -> ../init.d/killall
`-- S01halt -> ../init.d/halt
rc1.d
|-- K01yum -> ../init.d/yum
|-- K03messagebus -> ../init.d/messagebus
|-- K05anacron -> ../init.d/anacron
|-- K05atd -> ../init.d/atd
[ .. zkráceno .. ]
|-- K95kudzu -> ../init.d/kudzu
|-- K96pcmcia -> ../init.d/pcmcia
|-- K99microcode_ctl -> ../init.d/microcode_ctl
`-- S00single -> ../init.d/single
rc2.d
|-- K01yum -> ../init.d/yum
|-- K03messagebus -> ../init.d/messagebus
|-- K05atd -> ../init.d/atd
`-- [ .. zkráceno .. ]
rc3.d
`-- [ .. zkráceno .. ]
rc4.d
`-- [ .. zkráceno .. ]
rc5.d
`-- [ .. zkráceno .. ]
rc6.d
|-- K01yum -> ../init.d/yum
|-- K03messagebus -> ../init.d/messagebus
|-- K05anacron -> ../init.d/anacron
|-- K05atd -> ../init.d/atd
|-- [ .. zkráceno .. ]
|-- K95kudzu -> ../init.d/kudzu
|-- K96pcmcia -> ../init.d/pcmcia
|-- K99microcode_ctl -> ../init.d/microcode_ctl
|-- S00killall -> ../init.d/killall
`-- S01reboot -> ../init.d/halt
V adresáři /etc/rc.d/init.d jsou uloženy vlastní startovací skripty jednotlivých služeb, tyto
skripty jsou pak podle potřeby volány s argumentem start či stop podle toho, má­li se daná
služba spustit anebo ukončit. Tyto skripty spouští init automaticky při přechodu mezi úrovněmi
běhu systému, také je může spouštět adminstrátor a podle potřeby pak služby kdykoliv restartovat,
www.linuxzone.cz strana 96 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
vypnout apod. Pokud budeme chtít např. spustit webový server apache, provedeme to na
standardní instalaci Linux Mission příkazem /etc/rc.d/init.d/apache start. Tyto
skripty mohou umět vypisovat i iformace o stavu služby (např. /etc/rc.d/init.d/apache
status nám sdělí, zda apache běží a případně vypíše čísla běžících procesů apache). Tato funkčnost
ale není z pohledu fungování initu potřebná ­ z pohledu initu skript musí akceptovat pouze
parametry start a stop. Takový minimalistický skript může vypadat třeba následovně (v reálu
bychom "service_daemon" nahradili názvem aplikace služby): #!/bin/sh
case "$1" in
start)
echo "Starting service:"
service_daemon && echo "service_daemon"
echo
touch /var/lock/subsys/service
;;
stop)
echo "Shutting down service:"
/usr/bin/killall service_daemon && echo "service_daemon"
echo
rm -f /var/lock/subsys/service
;;
*)
echo "Usage: service {start|stop}"
exit 1
esac
exit 0
Tento příklad je minimalistický, ale funkční. Startovací skripty služeb dodávaných s Mission
využívají knihovnu funkcí definovaných v souboru /etc/init.d/functions, detaily použití
viz kterýkoliv startovací skript v /etc/init.d. Startovací skripty jsou pak pomocí symbolických odkazů linkovány do adresářů jednotlivých
úrovní /etc/rc.d/rc[0-6].d/. Skripty odkazované v těchto adresářích pak init spouští
automaticky při přechodu mezi úrovněmi běhu systému. Např. máme li nastavenou jako výchozí
úroveň běhu systému (runlevel) úroveň 5, init postupně spustí skripty umístěné (nebo prolinkované,
což je pohodlnější) do adresáře /etc/rc.d/rc5.d. Služby by ovšem měly být spouštěny v
určitém pořadí a init také musí nějak poznat, jestli má určitou službu v dané úrovni spustit nebo
vypnout. Podíváme­li se na příklad zkráceného výpisu adresáře /etc/rc.d/rc5.d, všimneme si
na první pohled podivných názvů odkazů: lrwxrwxrwx
lrwxrwxrwx
lrwxrwxrwx
lrwxrwxrwx
lrwxrwxrwx
1
1
1
1
1
root
root
root
root
root
root
root
root
root
root
13
19
13
14
13
čec
čec
čec
čec
čec
23
23
23
23
23
16:35
16:31
16:34
16:33
16:36
K01yum -> ../init.d/yum
K05saslauthd -> ../init.d/saslauthd
K20nfs -> ../init.d/nfs
K24irda -> ../init.d/irda
K35smb -> ../init.d/smb
www.linuxzone.cz strana 97 / 159
Impossible: Linux Mission 1.0
lrwxrwxrwx 1 root
[ .. zkráceno
lrwxrwxrwx 1 root
[ .. zkráceno
lrwxrwxrwx 1 root
lrwxrwxrwx 1 root
lrwxrwxrwx 1 root
lrwxrwxrwx 1 root
lrwxrwxrwx 1 root
root
.. ]
root
.. ]
root
root
root
root
root
6. Pod pokličkou ­ orientace v systému pro pokročilé
19 čec 23 16:43 K35vncserver -> ../init.d/vncserver
17 čec 23 16:31 S10network -> ../init.d/network
13
17
13
20
11
čec
čec
čec
čec
čec
23
23
23
23
23
16:38
16:32
16:33
16:37
16:31
S90xfs -> ../init.d/xfs
S95anacron -> ../init.d/anacron
S95atd -> ../init.d/atd
S97messagebus -> ../init.d/messagebus
S99local -> ../rc.local
Právě podle jména odkazu init poznáme, co se má se skriptem dělat. Začíná­li na "K" (Kill),
znamená to "tuto službu při vstupu do úrovně vypni". Naopak začíná­li odkaz na "S" (Start),
znamená to "tuto službu při vstupu do úrovně zapni". Pořadí je pak dáno číslem v názvu souboru,
posloupnost je tedy stejná, jako vidíme ve výpisu adresáře. Po vstupu do úrovně běhu 5 tedy se tedy
nejprve spustí skripty K01yum s parametrem "stop", poté K05saslauthd a tak dále až povypíná
všechny služby, které má vypnout. Pak dojde ke skriptu S10network, který už spustí s
parametrem "start" a skončí spuštěním skriptu S99local. Pozorný čtenář si jistě povšimnul, že jsem se v předchozím popisu pro zjednodušení dopustil jedné
nepřesnosti: o spouštění skriptů v adresářích /etc/rc.d/rc[0-6].d/ se nestará init přímo, ten
pouze volá skript /etc/rc.d/rc a jako argument mu předá číslo úrovně běhu (viz položky l0 až
l6 v souboru inittab). 6.5.8 Chkconfig ­ zjednodušení manipulace s odkazy
Pokud se Vám zdá přímá manipulace se symbolickými odkazy příliš nepohodlná, můžete využít
utilitu chkconfig. Autor tohoto nástroje se inspiroval nástrojem stejného jména v operačním
systému Irix (což je UNIX System V firmy SGI). Chkconfig funguje tak, že ze startovacích
skriptů služeb umístěných v /etc/rc.d/init.d načte zakomentovaný řádek s řetězcem
chkconfig, viz úryvek skriptu /etc/rc.d/init.d/xinetd: #!/bin/bash
#
# xinetd
This starts and stops xinetd.
#
# chkconfig: 345 56 50
# description: xinetd is a powerful replacement for inetd.
[ ... zkráceno...]
Vidíme zde trojici čísel, která znamená následující: xinetd bude spouštěn v úrovních 3,4,5,
startovací skript bude mít pořadí při spouštění 56 (v adresářích úrovní 3 až 5 bude tedy odkaz
S56xinetd --> ../init.d/xinetd) a pořadí při vypínání bude mít 50 (v adresářích úrovní
0,1 a 6 bude odkaz K50xinetd --> ../init.d/xinetd). Následující příklad ukazuje část
výpisu příkazu chkconfig --list, kde vidíme skutečně vidíme, že xinetd bude zapnut v
úrovních 3,4 a 5: www.linuxzone.cz strana 98 / 159
Impossible: Linux Mission 1.0
xfs
xinetd
cups
0:off
0:off
0:off
1:off
1:off
1:off
6. Pod pokličkou ­ orientace v systému pro pokročilé
2:on
2:off
2:on
3:on
3:on
3:on
4:on
4:on
4:on
5:on
5:on
5:on
6:off
6:off
6:off
Samozřejmě, Linux Missio také obsahuje nástroj s grafickým rozhraním, které umožňuje
konfigurovat úrovně běhu a spouštěné služby ­ jedná se o utilitu redhat-config-services: Prostřednictvím tohoto nástroje je možné editovat úrovně běhu 3 až 5 (do konfigurace ostatních
totiž není obykle nutné zasahovat). 6.5.9 Nastavení prostř edí spouštěných procesů ­ /etc/initrc
Pokud bychom chtěli modifikovat prostředí procesů, které init spouští přímo (tedy jsou uvedeny
v konfiguračním souboru /etc/inittab), můžeme vytvořit skript /etc/initscript. V
tomto skriptu nastavíme prostředí a následně jej pomocí exec nahradíme procesem, takový skript
může vypadat takto: #
#
nastavíme prostředí, init předá při spuštění 4 argumenty:
#
takže bychom mohli prostředí nastavit odlišně pro různé případy
umask 022
ulimit -c 0
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# nahradíme skript zadaným programem (čvrtý argument skriptu)
eval exec "$4"
www.linuxzone.cz strana 99 / 159
Impossible: Linux Mission 1.0
6. Pod pokličkou ­ orientace v systému pro pokročilé
6.5.10 Ovládání initu, př echod z jedné úrovně do druhé
Protože init jako proces 1 musí být spuštěn po celou dobu běhu systému a nemůžeme jej
jednoduše restartovat, musí existovat mechanismus, jak initu sdělit, že je potřeba znovu načíst
konfigurační soubor nebo že má systém převést do jiné úrovně běhu. Máme zde na výběr ze dvou
možností. První (omezenou) možností, je zaslání určitého signálu procesu init (po zaslání signálu
SIGHUP init načte ze souboru /etc/initrunlvl nebo /var/log/initrunlvl nové číslo
úrovně běhu). Druhou, preferovanou možností je použití utility telinit, se kterou init
komunikuje přes rouru /dev/initctl. Pro přechod do úrovně běhu 3 bychom zadali telinit
3. Pokud bychom provedeme změny v konfiguraci /etc/inittab, vynutíme si znovunačtení
konfigurace příkazem telinit q. Další podronosti čtenář nalezne v příslušné manuálové stránce.
(Jinak telinit je ve skutečnosti pouze symbolickým odkazem na binárku initu, v jakém
režimu má fungovat (init nebo telinit) si init snadno otestuje pomocí svého PID ­ pokud je jiné
než 1, funguje jako telinit.) Výchozí úroveň běhu také můžeme zadat jako parametr při startu
jádra a to jej pak předá initu ­ pokud bychom tedy potřebovali např. obejít nastavení v souboru
inittab a nabootovat systém rovnou do jednouživatelského režimu, zadáme na promptu zavaděče
GRUB prostřednictvím příkazu kernel "1" jako parametr jádra. Linux Mission také obsahuje utilitu runlevel, která vypíše aktuální a předchozí úroveň běhu
systému. Informace čerpá ze souboru /var/log/utmp), následující příklad znamená, že systém
nabootoval rovnou do úrovně 5 (proto je místo hodnoty přechozí úrovně písmeno N): $ /sbin/runlevel
N 5
7. Administrace systému
7.1 Správa software
Linuxové distribuce obecně a stejně tak i Linux Mission, neobsahují jen vlastní operační systém ­
obsahují také celou řadu aplikací. Množství software, který uživatel při instalaci systému instaluje,
tak bývá dosti úctyhodné a je potřeba, aby byl po ruce nějaký nástroj, který správu instalovaného
software zastřešuje. Jednotlivý software je distribuován formou tzv. softwarových balíčků
(packages). Takovým balíčkem může být např. poštovní klient Evolution, který je konrétně s
dodáván jako balíček evolution-1.4.5-7.lz.1. Už z názvu balíčku je jasné, o jakou verzi
programu se jedná. Rozsáhlejší programové celky ovšem mohou být rozděleny i do více balíčků. Například kancelářský
balík OpenOffice.org, který je s Linuxem Mission dodáván sestává ze tří balíčků: www.linuxzone.cz strana 100 / 159
Impossible: Linux Mission 1.0
•
•
•
7. Administrace systému
openoffice.org-i18n-1.1.0-16 ­ obsahuje slovníky pro korekci pravopisu a
lokalizace (národní prostředí), openoffice.org-libs-1.1.0-16 ­ obsahuje sdílené knihovny používané
jednotlivými applikacemi OpenOffice.org openoffice.org-1.1.0-16 ­ obsahuje vlastní aplikace OpenOffice.org (textový
procesor, tabulkový procesor a další...) Linux Mission používá pro správu instalovaného software systém RPM. Tento systém si můžeme
představit jako databázi, která obsahuje informace o softwarových balíčcích, které jsou v systému
nainstalovány. Databáze obsahuje podrobné informace o tom, jaké konkrétní soubory přísluší
jednotlivým instalovaným balíčkům a obsahuje také informace o závislostech mezi nimi ­ t.j. pokud
např. aplikace "X" potřebuje ke svému fungování knihovnu, která je součástí jiného softwarového
balíčku "Y", bude před instalací "X" požadovat, aby byla nejprve instalován balíček "Y". Se systémem správy software RPM můžeme pracovat buď přímo (z příkazové řádky), nebo
prostřednictvím dalšího, nadstavbového software. Všechny tyto nástroje si nyní postupně
představíme. 7.1.1 Systém RPM
Jak už jsem naznačil výše, jednou z možností je pracovat s RPM přímo z příkazové řádky. K
dispozici máme několik nástrojů: •
•
•
•
utilita rpmquery slouží k získání informací o balíčcích, např: rpmquery -l evolution vypíše seznam souborů, které obsahuje balíček poštovního klienta Evolution rpmquery -f /etc/ntp.conf vypíše ke kterému balíčku patří soubor /etc/ntp.conf rpmquery --whatrequires evolution vypíše, které jiné balíčky na Evolution závisejí rpmquery --requires evolution naopak vypíše, co potřebuje balíček Evolution utilita rpmverify slouží k ověření integrity instalovaného balíčku, např: rpmverify evolution ověří, zda je balíček evolution kompletní a zda v instalaci nedošlo k nějakým změnám
rpmverify -a zkontroluje integritu všech instalovaných balíčků utilita rpmbuild slouží k sestavení balíčků ze zdrojových kódů instalaci nebo upgrade balíčku provedeme pomocí utility rpm, např: rpm -i evolution-1.4.5-7.lz.1.i386.rpm nainstaluje balíček ze souboru evolution-1.4.5-7.lz.1.i386.rpm rpm -Uvh evolution-1.4.5-7.lz.1.i386.rpm nahradí již instalovaný balíček evolution novější verzí ze souboru evolution-1.4.5-
www.linuxzone.cz strana 101 / 159
Impossible: Linux Mission 1.0
7. Administrace systému
7.lz.1.i386.rpm Přímá práce s rpm má ale své nevýhody ­ tou hlavní je to, že při instalaci nových balíčků závislosti
je na nás, abychom vyřešili případné závislosti. Proto tyto utility zpravidla pro instalaci software
přímo nepoužíváme ­ máme k dispozici další nástroje, které jsou mnohem komfortnější. Detailní
popis těchto utilit uživatel nalezne v manuálové stránce rpm. 7.1.2 Přidá ní / odstranění software dováváného s Linux Mission
Pohodnou manipulaci se software dováváným s Linux Mission poskytuje utilita redhatconfig-packages, kterou můžeme spustit z hlavního menu přes položky "Systémová
nastavení" ­> "Přidat/odstranit aplikace" (při spuštění této utility budeme dotázáni na heslo
uživatele root, protože obyčejní uživatelé nemohou zasahovat do konfigurace systému): Rozhraní je obdobné tomu, s jakým jsme se setkali už při instalaci Mission. Softwarové balíčky
jsou rozděleny do tématických skupin, kliknutím na odkaz "Detaily" otevřeme dialogocé okno s
výpisem jednotlivých balíčků. Ty, které jsou již instalovány jsou v seznamu zatrženy. Chceme­li
některý balíček přidat, jednoduše jej kliknutím myši označíme, chceme­li nějaký balíček
odinstalovat, jednoduše jej kliknutím myši odznačíme. S případnými závislostmi mezi balíčky si
nemusíme lámat hlavu, protože systém to vyřeší za nás ­ pokud některý z balíčků, který jsme si k
instalaci vybrali potřebuje ještě nějaké další, budou automaticky instalovány také. Jakmile jsme s
výběrem balíčků i instalaci / odstranění hotovi, dialog zavřeme a pokračujeme stistem tlačítka
"Aktualizovat". Poté se objeví okno s informacemi o tom, kolik balíčků bude instalováno /
odinstalováno a kolik je k tomu zapotřebí volného místa na disku. www.linuxzone.cz strana 102 / 159
Impossible: Linux Mission 1.0
7. Administrace systému
Nyní si ještě můžeme nechat zobrazit detaily (tady uvidíme, jaké další balíčky systém vybral k
instalaci, aby vyhověl závislostem mezi balíčky, které jsme si zvolili) a pokud jsme spokojeni,
potvrdíme zahájení instalace / odebrání balíčků stiskem tlačítka "Pokračovat". Pak už jen podle
instrukcí vložíme potřebné instalační médium a počkáme, až bude instalace ukončena. 7.1.3 Yum
Yum je velmi šikovný nástroj pro správu software a aktualizace systému. Jedná se o utilitu pracující
v textovém režimu, se kterou lze pracovat interaktivně, ale také je možné jej spouštět na pozadí a s
jeho pomocí provádět automatické updaty systému. Yum naváže spojení se serverem, na kterém se
nachází úložiště dostupných balíčků a aktualizací pro danou verzi systému Mission (nemusíme nic
konfigurovat, po instalaci systému je již vše nakonfigurováno ­ jen pro úplnost, konfigurační soubor
je umístěn v souboru yum.conf) a stáhne si potřebné informace o dostupných balíčcích. Na
základě těchto informací pak sám vyřeší případné závislosti mezi balíčky, které hodláme instalovat /
aktualizovat. Yum pracuje v několika režimech: www.linuxzone.cz strana 103 / 159
Impossible: Linux Mission 1.0
•
7. Administrace systému
instalace: pokud bychom chtěli instalovat aktuální verzi balíčku recode, spustili bychom
yum např. takto (nově instalujeme balíček recode): # yum install recode
Gathering header information file(s) from server(s)
Server: Linuxzone Linux 0.9 - i386 - Base
Server: Linuxzone Linux 0.9 - i386 - Released Updates
Finding updated packages
Downloading needed headers
Resolving dependencies
Dependencies resolved
I will do the following:
[install: recode 3.6-12.0.i386]
Is this ok [y/N]: y
Running test transaction:
Test transaction complete, Success!
recode 100 % done 1/1
Installed: recode 3.6-12.0.i386
Transaction(s) Complete
•
update: v tomto režimu můžeme aktualizovat buď konkrétní balíček či skupinu balíčků,
např. tímto příkazem spustíme aktualizaci balíčku gimp: # yum update gimp
anebo také můžeme yum nechat vyhledat všechny dostupné aktualizace a všechny
instalované balíčky, pro které existují aktualizace updatovat najednou: # yum update
•
pokud chceme pouze zjistit, jestli existují aktualizace něčeho, co máme instalováno,
spustíme yum takto: # yum check-update
Gathering header information file(s) from server(s)
Server: Linuxzone Linux 0.9 - i386 - Base
Server: Linuxzone Linux 0.9 - i386 - Released Updates
Finding updated packages
Downloading needed headers
Name
Arch
Version
Repo
------------------------------------------------------------------------gimp
i386
1:1.2.5-2
updates-released
•
V tomto příkladu vidíme, že bychom měli aktualizovat balíček gimp. pokud si chceme jen prohlédnout, jaké balíčky jsou dostupné či získat různé informace o
www.linuxzone.cz strana 104 / 159
Impossible: Linux Mission 1.0
•
•
7. Administrace systému
dostupných balíčcích, spustíme yum v režimu list nebo info režim search lze využít k vyhledání balíčku, pokud si nepamatujeme jeho přesný název
(yum vyhledá daný řetězec v názvech a popisech balíčků) pro odstranění balíčků slouží režim remove Poznámka: Yum je velmi flexibilní nástroj, podrobný popis jeho možností najdete programvé
dokumentaci.
Při prvním spuštění si yum stahuje souhrnné informace o balíčcích (tzv. hlavičky), které jsou na
daném serveru (úložišti) dostupné ­ což nějakou chvíli trvá, pokud máte pomalé spojení do
Internetu.
Protože některé balíčky jsou poměrně velké, nemusí být stahování aktualizací tímto způsobem
zejména pro uživatele používající vytáčené připojení k Internetu to pravé. V tom případě si lze
vypomoci tím, že si potřebné aktualizace doneseme na CD a yum nakonfigurujeme tak, aby
pracoval s lokálním úložištěm aktualizací (detaily viz programová dokumentace). 7.1.4 Instalace software tř etí strany
Pokud chceme instalovat nějaký software, který není dodáván s OS Mission, je nejvhodnější získat
jej ve formě .rpm balíčku. Ten pak nainstalujeme jednoduše tak, že otevřeme okno správce souborů
a balíček otevřeme dvojklikem levého tlačítka myši. Nejprve se objeví dialogové okno, ve kterém
jsme dotázáni na heslo uživatele root (obyčejný uživatel není oprávněn instalovat nový software).
Jakmile heslo zadáme, objeví se okno se souhrnými informacemi o balíčku a stačí stiskem tlačítka
"Pokračovat" potvrdit instalaci. U software, který není primárně určen pro Linux Mission (nebo jemu příbuznou distribuci Fedora
Core 1) se může stát, že narazíme na problémy se závislostmi. Nabízí­li výrobce software software
ve staticky linkované verzi (t.j. nepoužívající sdílené knihovny), sáhneme v takovém případě po této
verzi. 7.1.5 Upozornění na dostupnost aktualizací Linux Mission
Pokud jsme připojeni k Internetu, ve stavovém panelu desktopu GNOME i KDE se ve výchozím
nastavení nachází na pravém okraji ikona appletu, který signalizuje dostupnost aktualizací. Pokud
jsou k dispozici aktualizace, svítí zde vykřičník v červeném poli, pokud na něj klikneme levým
tlačítkem myši, otevřeme okno se seznamem dostupných aktualizací. 7.2 Vytvář ení uživatelů a skupin
K vytváření uživatelských účtů a skupin slouží utilita redhat-config-users, kterou spustíme
z hlavního menu přes "Systémová nastavení" ­> "Uživatelé a skupiny". www.linuxzone.cz strana 105 / 159
Impossible: Linux Mission 1.0
7. Administrace systému
Nového uživatele v systému vytvoříme kliknutím na ikonu "Přidat uživatele", tím vyvoláme dialog,
do kterého zadáme potřebné údaje: •
•
•
•
•
•
•
uživatelské jméno (z praktických důvodů by nemělo být příliš dlouhé, nesmí obsahovat
háčky a čárky); plné jméno uživatele ­ tato položka je nepovinná; heslo, tady platí, že bezpečné heslo by nemělo být triviální ­ tedy mělo by obsahovat
kombinaci malých a velkých písmen a čísel a to takovou, aby nebylo snadno uhodnutelné.
Mělo by být také dostatečně dlouhé ­ osm znaků postačuje; zvolíme výchozí přihlašovací shell ­ t.j. příkazový interpret, který se spustí po přihlášení
uživatele na textovou konzoli nebo v okně terminálu; zvolíme, zda chceme pro uživatele vytvořit domovský adresář, kde bude moci ukládat svoje
data (domovské adresáře zpravidla vytváříme tak jak je přednastaveno jako podadresáře v /
home); zvolíme, zda bude pro uživatele vytvořena také vlastní skupina; každý uživatel je v systému identifikován číslem UID (UserID), tady máme možnost zadat
UID přímo ručně (pouze pro ty, kteří vědí co dělají ­ pozor na to, abychom nechtěně
nevytvořili dva účty se stejným UID). www.linuxzone.cz strana 106 / 159
Impossible: Linux Mission 1.0
7. Administrace systému
Obdobně novou skupinu uživatelů založíme kliknutím na ikonu "Přidat skupinu". V tom případě
pouze zadáme název skupiny a volitelně můžeme ručně nastavit GID (GroupID). Z příkazové řádky můžeme nastavovat hesla uživatelů pomocí utility passwd, změnit shell
můžeme pomocí příkazu chsh. Pro úplnost doplním, že konfigurační soubory týkající se
uživatelských účtů jsou umístěny v /etc/passwd (seznam uživatelů), /etc/group (seznam
skupin) a /etc/shadow (soubor se stínovými hesly). 7.3 Konfigurace sítě
Pokud jsme při instalaci Mission nekonfigurovali síťová zařízení anebo prostě chceme konfiguraci
sítě změnit, použijeme utilitu "Nastavení sítě" (redhat-config-network). Najdeme ji přes
položky "Systémová nastavení" > "Síť" hlavního menu. Před spuštěním tohoto nástroje se nás
systém dotáže na heslo uživatele root, protože obyčejní uživatelé nemohou měnit konfiguraci sítě.
Chceme­li upravit konfiguraci některého zařízení, vybereme jej myší a stiskneme tlačítko "Upravit".
www.linuxzone.cz strana 107 / 159
Impossible: Linux Mission 1.0
7. Administrace systému
Pro vytvoření nového síťového připojení použijeme tlačítko "Nový" a následně vybereme typ
síťového zařízení (ethernet, modem, ...). 7.3.1 Konfigurace zař ízení v síti Ethernet
V případě připojení k síti Ethernet pak v dalším kroku zvolíme: •
•
•
zda se má zařízení automaticky aktivovat po startu počítače, zda budou obyčejní uživatelé smět toto zařízení zapínat a vypínat (např. pomocí "Systémové
nástroje" > "Ovládání síťových zařízení" z hlavního menu) zda pro konfiguraci daného síťového zařízení budeme využívat protokol DHCP anebo
budeme síťové zařízení konfigurovat ručně. (Protokol DHCP umožňuje prostřednictvím
DHCP serveru v síti automaticky přidělovat klientům IP adresy a předat další parametry
nastavení sítě jako je výchozí brána či servery DNS apod.) Pokud jsme zvolili ruční konfiguraci síťového rozhraní, vyplníme parametry síťového rozhraní jako
je IP adresa a maska sítě a zpravidla také adresu výchozí brány (t.j. brány, přes kterou bude
směrován veškerý provoz směřující mimo lokální síť.) www.linuxzone.cz strana 108 / 159
Impossible: Linux Mission 1.0
7. Administrace systému
Nyní můžeme konfiguraci uložit a zkusit nově nakonfigurované zařízení aktivovat. 7.3.2 Konfigurace vytáčeného připo jení
V případě konfigurace vytáčeného připojení (dialup) zvolíme v prvním kroku jako typ zařízení
modem a dále pokračujeme takto: •
•
•
nejprve se systém pokusí modem detekovat a následně nám předloží parametry vybraného
zařízení; pokud se nepodaří systému modem detekovat, zobrazí chybové hlášení a v tom
případě budeme muset cestu k zařízení upravit ručně (např. mám­li externí modem připojen
k prvnímu sériovému portu, bude se jednat o zařízení /dev/ttyS0). Lze zde také zvolit
rychlost modemu, zda se bude při vytáčení používat tónová nebo pulsní volba apod. v dalším kroku pokračujeme vyplněním telefoního čísla, uživatelského jména a hesla (tyto
údaje získáme od poskytovatele připojení) a ještě názvu poskytovatele připojení v dalším kroku zvolíme, zda nám bude automaticky přidělována IP adresa, nebo zda budeme
používat statickou IP adresu (zpravidla je IP adresa přidělována dynamicky). www.linuxzone.cz strana 109 / 159
Impossible: Linux Mission 1.0
7. Administrace systému
Nyní můžeme konfiguraci uložit a zkusit nově nakonfigurované zařízení aktivovat. Pokud jsme při
konfiguraci povolili obyčejným uživatelům zařízení zapínat/vypínat, budou jej zapínat a vypínat
pomocí "Systémové nástroje" > "Ovládání síťových zařízení" z hlavního menu. 7.3.3 Ostatní nastavení
Pomocí záložky "DNS" v hlavním okně aplikace "Nastavení sítě" můžeme upravit konfiguraci
resolveru, t.j. zadat IP adresy serverů služby DNS, kterých se bude náš systém dotazovat při
překladu IP adres na doménová jména a naopak. Pomocí "Počítače" můžeme upravovat statický
seznam IP adres a jmen počítačů (sem se obvykle zapisují IP adresy a jména počítačů umístěných
na lokální síti). 7.3.4 Profily
Zejména uživatelé přenosných počítačů ocení možnost definování síťových profilů, je tak možné
definovat několik konfigurací sítě, mezi kterými je možné se přepínat. 7.4 Konfigurace tisku
Konfiguraci tiskárny vyvoláme přes položky "Systémová nastavení" ­> "Tisk" z hlavního menu.
Stisknutím tlačítka "Nový" spustíme konfiguraci nové tiskové fronty: •
nejprve vyplníme jméno fronty (bez mezer, pokud možno krátké) a volitelně popis,
www.linuxzone.cz strana 110 / 159
Impossible: Linux Mission 1.0
7. Administrace systému
•
v dalším kroku zvolíme, zda se jedná o lokální nebo síťovou tiskárnu a zvolíme zařízení, ke
kterému je tiskárna připojena,
•
v předposledním kroku vybereme typ tiskárny (ovladač) ­ buď v seznamu tiskáren najdeme
podle výrobce přímo model odpovídající naší tiskárně, anebo můžeme zvolit ponechat jako
výrobce volbu "Obecný" a vybrat některý z dostupných typů,
www.linuxzone.cz strana 111 / 159
Impossible: Linux Mission 1.0
•
7. Administrace systému
poté už jen potvrdíme souhrnné informace, po dokončení konfigurace systém odešle na
tiskárnu testovací stránku a pokud je vše v pořádku, můžeme konfigurační nástroj opustit. 8. Grafické rozhraní X Window System
Po startu systému Mission se na monitoru objeví úvodní obrazovka, kde je uživatel vyzván k zadání
svého uživatelského jména a poté hesla. Pokud je uživatelské jméno i heslo zadáno správně (pozor
na malá a velká písmena), je uživatel přihlášen a spustí se zvolené desktopové prostředí. Linuxové
systémy totiž zpravidla disponují více než jedním desktopovým prostředím, která se mezi sebou liší
organizací, ergonomií a filozofií práce. Znamená to, že uživatel si může vybrat, jaký typ a vzhled
desktopu mu vyhovuje. Linux Mission obsahuje dva nejčastěji používané desktopy: GNOME a
KDE. Jako implicitní (výchozí) je nastaven desktop GNOME. www.linuxzone.cz strana 112 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
V dolní části úvodní obrazovky je několik ikon, které zpřístupňují volbu jazyka, volbu sezení (výběr
některého z dostupných desktopových prostředí), možnost ukončení běhu systému a možnost
restartování systému. 8.1 Desktop GNOME
Výchozí vzhled desktopu GNOME je ilustruje následující obrázek. V dolní části obrazovky je
imístěn stavový a ovládací panel, který obsahuje spouštěč hlavního menu, zástupce běžně
používaných kancelářských aplikací a další ovládací prvky, se kterými se seznámíme níže. V levé
horní části obrazovky jsou pod sebou umístěny ikona reprezentující zástupce domovského adresáře
přihlášeného uživatele ("Domov"), ikona "Začněte zde" zpřístupňuje některá nastavení systému a
pod ní je umístěn koš. 8.1.1 Ovládací a stavový panel GNOME
Následující obrázek ukazuje detail panelu. Panel GNOME ve výchozím nastavení obsahuje: 1. Spouštěč hlavního menu. Kliknutím na ikonu s logem Linuxu Mission vyvoláme hlavní
www.linuxzone.cz strana 113 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
menu, pomocí kterého můžeme spouštět aplikace nebo provádět akce jako zamknutí
obrazovky nebo odhlášení uživatele. 2. Spouštěč internetového prohlížeče Mozilla. 3. Spouštěč poštovního klienta Evolution. 4. Spouštěč aplikace OpenOffice.org Writer (textový procesor kompatibilní s aplikací
Microsoft Word). 5. Spouštěč aplikace OpenOffice.org Impress (prezentace ­ obdoba aplikace Microsoft
PowerPoint). 6. Spouštěč aplikace OpenOffice.org Calc (tabulkový procesor kompatibilní s aplikací
Microsoft Excel). 7. Přepínač pracovních ploch.
Desktopová prostředí v Linuxových systémech zpravidla podporují tzv. virtuální pracovní
plochy. Znamená to, že i když máme před sebou jen jednu obrazovku, můžeme pracovat s
několika pracovními plochami­ jako kdybychom měli monitorů více. V daný okamžik na
monitoru vidíme jen jednu z nich a prostřednictvím přepínače ploch se mezi nimi můžeme
přepínat. V praxi tak můžeme mít na první ploše např. spuštěný kancelářský balík
OpenOffice.org a na další ploše můžeme pracovat s Internetem atd. Ušetříme si tím neustálé
zmenšování, zvětšování a přesouvání oken jednotlivých aplikací ­ jednoduchým kliknutím
myši jen přepínáme pracovní plochy. Okna aplikací lze samozřejmě mezi jednotlivýmí
pracovními plochami přesouvat a to buď přes menu okna anebo přímo přetažením
zmenšeného symbolu vybraného okna v přepínači ploch myší z jedné plochy na druhou. 8. Seznam oken spuštěných aplikací.
Klikneme­li na tlačítko reprezentující zvolenou aplikaci levým tlačítkem myši, okno
minimalizujeme (pokud bylo aktivní), vyvoláme okno aplikace na popředí (bylo­li překryto
jinými okny nebo nebylo aktivní) anebo okno otevřeme (byli li minimalizované).
Klikneme­li na tlačítko reprezentující zvolenou aplikaci pravým tlačítkem myši, vyvoláme
menu jehož prostřednictvím můžeme opět provádět běžné operace jako např. okno aplikace
minimalizovat, maximalizovat, zarolovat či měnit velikost okna. pracovní plochu. 9. Správce tisku. Kliknutím na ikonu vyvoláme rozhraní správce tisku, kde můžeme sledovat
tiskovou frontu anebo upravit nastavení tiskáren. 10.ovladač hlasitosti. Prostřednictvím tohoto appletu můžeme ovládat zvukovou kartu. 11.Aktualizace systému. Tato ikona signalizuje, zda jsou dostupné aktualizace systému (pokud
je systém připojen k Internetu a jsou dostupné aktualizace software, svítí červený vykřičník).
12.hodiny. 8.1.2 Ovládání oken
Na dalším obrázku jsou označeny ovládací prvky oken aplikací: www.linuxzone.cz strana 114 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
1. Zde je přístupné menu, prostřednictvím kterého lze provádět všechny dostupné manipulace
jako je minimalizace / maximalizace, změna velikosti okna, zarolování okna, přesun okna na
jinou pracovní plochu apod. Abychom nemuseli kvůli každé takové akci vyvolávat menu,
jsou nejčastější úkony rychle přístupné pomocí dalších ovládacích prvků. 2. Pomocí horní lišty okna můžeme oknem pohybovat po pracovní ploše (přidržením levého
tlačítka myši), dvojklik na lištu způsobí zarolování (odrolování) okna a pomocí pravého
tlačítka myši vyvoláme menu (stejně jako u 1). 3. Pomocí této ikony okno minimalizujeme (skryjeme). 4. Pomocí této ikony okno maximalizujeme (okno pokryje celou obrazovku). 5. Pomocí této ikony vyvoláme uzavření okna případně ukončení aplikace. 6. Přidržením levého tlačítka myši v tomto místě (ale také kdekoliv na hraně okna) můžeme
měnit velikost okna. Aktivní okno, t.j. okno se kterým právě pracujeme je vždy zvýrazněno (odlišnou barva horní lišty).
Chceme­li se přepnout do jiného okna, klikneme na něj myší. Alternativně můžeme mezi okny
přepínat opakovaným stiskem kombinace kláves Alt+Tab. 8.1.3 Pracovní plocha
Klikneme­li na pozadí pracovní plochy levým tlačítkem myši, vyvoláme tím pracovní menu,
pomocí kterého můžeme na plochu umisťovat spouštěče (zástupce aplikací či složek), vytvářet nové
složky (adresáře), otevřít okno správce souborů, spustit terminál s příkazovým interpretem
(příkazová řádka), měnit pozadí pracovní plochy a také ručně připojovat / odpojovat diskety, média
CD/DVD a další. www.linuxzone.cz strana 115 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Pomocí levého tlačítka označujeme objekty na ploše a dvojklikem na zvolený objekt spustíme
aplikaci (jedná­li se o spouštěč aplikace), otevření složky ve správci souborů (jedná­li se o adresář),
otevření dokumentu atd. 8.1.4 Hlavní menu
Jak už bylo řečeno výše, hlavní menu GNOME vyvoláme kliknutím na ikonu s logem Mission
umístěnou v panelu úplně v levém dolním rohu obrazovky. V dolní části menu jsou důležité
položky umožňující uzamknutí obrazovky (spustí se šetřič obrazovky a pro opětovné odemčení
obrazovky bude vyžadováno zadání hesla uživatele) a dále položka odhlášení uživatele. Z hlavního menu je možné spouštět buď již předdefinované aplikace, které jsou pro přehlednost
rozděleny do tématických skupin (včetně systémových aplikací pro konfiguraci systému), anebo
vyvolat dialog pro spuštění libovolné aplikace pomocí položky "Spustit aplikaci...". Takto můžeme
spouštět aplikace s grafickým rozhraním, ale i nástroje pracující v textovém režimu (v tom případě
zatrhneme volbu "Spustit v terminálu"). Aplikaci také můžeme předat ke zpracování libovolný
soubor (viz položka "Spustit se souborem"). www.linuxzone.cz strana 116 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
8.1.5 Správce souborů Nautilus
Desktop GNOME obsahuje správce souborů Nautilus. Jak už bylo zmíněno výše, okno správce
souborů vyvoláme např. kliknutím pravého tlačítka myši na pozadí pracovní plochy a zvolením
položky "Otevřít nové okno" v pracovním menu, dvojklikem na ikonu "Domov", případně
dvojklikem na zástupce jiné složky (adresáře) umístěného na pracovní ploše, nebo také z hlavního
menu (položka "Domovský adresář"). Nautilus podporuje několk variant vyobrazení objektů (ikony,
seznam, adresářový strom atd.) a samozřejmě také podporuje mechanismus "drag & drop" (t.j.
přesun objektů přetažením myší). 8.1.6 Odhlášení ze systému
Chceme­li ukončit práci se systémem, vyvoláme z hlavního menu položku "Odhlásit se". Tím
otevřeme následující dialog, kde potvrdíme jednu ze tří možností: •
•
•
Odhlásit se: sezení uživatele bude ukončeno, uživatel odhlášen a objeví se opět přihlašovací
obrazovka Linuxu Mission. Vypnout počítač: sezení uživatele bude ukončeno, uživatel odhlášen a následně bude
ukončen běh systému. Restartovat počítač: sezení uživatele bude ukončeno, uživatel odhlášen, bude ukončen běh
systému a počítač se restartuje. www.linuxzone.cz strana 117 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
8.2 Desktop KDE
Jak už bylo řečeno dříve, Linux Mission neobsahuje jen deskopové prostředí GNOME, ale také
KDE. Linux Mission standardně spouští desktop GNOME, chcete­li pracovat s tímto alternativním
prostředím, musíte jej zvolit (dříve než se jako uživatel přihlásíte zadáním uživatelského jména a
hesla). Slouží k tomu menu, které vyvoláte kliknutím myši na symbol "Sezení" ­ nachází se vlevo
dole na úvodní přihlašovací obrazovce: V menu zvolíme položku "KDE". Pokud bychom později chtěli nastavit desktopové prostředí KDE
jako výchozí, spustíme utilitu switchdesk (je dostupná v hlavním menu mezi "Systémovými
nástroji" jako "Desktop Switching Tool"). Jak je vidět na následujícím obrázku, na první pohled je vzhled desktopu včetně menu a
ovládacího / stavového panelu organizován obdobně jako desktop GNOME. Také základní filosofie
práce je stejná (včetně konceptu virtuálních ploch). To je záměr, neboť to usnadní orientaci zejména
začínajícím uživatelům. pokročilý uživatel si samozřejmě může vzhled a chování desktopu nastavit
podle svého gusta. www.linuxzone.cz strana 118 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
9. Př íkazový interpret Bash: nebojte se př íkazové ř ádky
V této kapitole se budeme zabývat příkazovým interpretem Bash, což je nejrozšířenější příkazový
interpret (shell) ve světě Linuxu a je také uživatelům Mission nastavován jako výchozí. Postupně se
probereme všemi jeho taji a prozkoumáme nejrůznější zákoutí tohoto mocného nástroje, který je o
hodně víc než jen interpret příkazů... Příkazový interpret neboli shell je jedním z nejsilnějších nástrojů v Unixových systémech. Kdo si
někdy v Microsoft Windows otevřel "MS DOS Shell", může si myslet, že Unixové shelly, mezi něž
patří i BASH, budou něčím obdobným. Avšak tento názor není zdaleka přesný. Unixový shell je velmi univerzální nástroj, pomocí něhož může uživatel nejen jednoduše
komunikovat se systémem a ovládat jej, ale především ho může využít také jako programovací
jazyk, tedy ke psaní nejrůznějších skriptů, které mu v konečném důsledku výrazně usnadní práci s
řešením nějakého problému. Existuje celá řada shellů, které se v mnoha věcech mohou lišit. Troufám si říct, že nejrozšířenějšími
shelly v Linuxu jsou BASH a TCSH. (To potvrzují i výsledky ankety realizované na serveru
Linuxzone ­ 86% hlasujících preferovalo BASH). Každý z shellů má něco navíc oproti ostatním a
nabízí určité specifické možnosti, které jiný nenabízí. V základních věcech se však chovají téměř
úplně stejně. V tomto textu se ale budeme věnovat výhradně shellu BASH. Téměř každá naučný text o programování začíná nudnou kapitolou o historii a vývoji daného jazyka
nebo nástroje. Pokusím se tento trend porušit, abychom se obratem dostali k praktickým
www.linuxzone.cz strana 119 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
záležitostem. Ve zkratce snad jen řeknu, že BASH (Bourne­Again Shell) je rozšířením staršího BSH
(Bourne Shell), který se dříve hojně používal snad na všech Unixech. BSH nedisponoval některými
důležitými vlastnostmi, jako např. pokročilejší editací příkazové řádky nebo správou úloh. BASH je
jedním z nástupců tohoto nástroje a efektivně řeší a odstraňuje nedostatky BSH. (pozn.: Seznam
všech shellů, které jsou dostupné ve vašem systému můžete najít v souboru /etc/shells; do
každého z těchto shellů se přepnete tak, že jednoduše zadáte na příkazové řádce jeho název.) Než přikročíme ke psaní skriptů a dalším pokročilým operacím, díky nimž si shelly získaly takovou
popularitu, musíme se nejprve co nejvíce sblížit s BASHem a pochopit principy jeho fungování. Pohyb v historii příka zů
Začneme tím, že se podíváme na ukládání historie příkazů. Přepněte se do textové konzole anebo
otevřete okno terminálu (položka "Otevřít terminál" pracovního menu, které vyvoláte kliknutím
pravého tlačítka myši kdekoliv na volnou pracovní plochu). Měli byste vidět výzvu příkazového
řádku. Já ji budu pro jednoduchost nahrazovat znakem dolaru, tedy $. Nyní napište samostatně několik příkazů. Například ls (enter), ps (enter), w (enter). Když se teď
budeme chtít probírat historií příkazů a znovu použít například příkaz ls, stačí jen třikrát stisknout
šipku nahoru a máme ho opět na příkazové řádce. Tímto způsobem tedy listujeme v historii.
Samozřejmě, že když si to rozmyslíme a budeme chtít raději vypsat procesy, stačí stisknout šipku
dolů a jsme na ps. Může se stát, že ve vašem systému nebudou šipky při pohybu v historii reagovat, resp. nebudou pro
pohyb v historii použitelné. V takovém případě zkuste použít následující příkaz: $ set -o emacs
Od této chvíle by měl být váš problém vyřešen a šipky by měly reagovat správně. Když už máme
nastaven Emacsový styl procházení historie (nazvaný podle editoru Emacs), neměli bychom také
opomenout kombinaci CTRL+R. Když v shellu zadáte tuto kombinace, můžete v historii vyhledat
příkaz, jehož podobou si nejste jisti. Stačí jen zadat část tohoto příkazu a v historii bude objeven (je
to elegantnější a přeci jen jednodušší než history | grep hledany_text). Výpis historie příka zů
Umíme se v historii pohybovat pomocí šipek. Jak skvělé... Co takhle si ale historii vypsat, abychom
měli přehled v tom, co vlastně máme za možnosti. K tomu slouží příkaz history. Jestli mohu
doporučit, používejte spíše zápis history | tail, který vypíše posledních deset použitých
příkazů. V opačném případě se vypíše kompletní historie, která může být (v závislosti na nastavení
shellu) velmi dlouhá. Výpis příkazů vypadá jednoduše. Na levé straně máme označení příkazu pořadovým číslem v
www.linuxzone.cz strana 120 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
historii, kde jsou příkazy počítány od prvního vzestupně. Spuštění příka zu z historie
Ne vždycky může být výhodné prohledávání historie pomocí šipek. Někdy je jednoduší jen odkázat
shell na číslo příkazu z historie (tento příkaz může být například velmi daleko od současné pozice a
je tedy mnohem jednodušší nechat si vypsat historii a následně spustit příkaz pomocí jeho
identifikátoru než hodinu ťukat na šipku nahoru). Zvolený příkaz z historie vyvoláme pomocí
příkazu ! následovaného pořadovým číslem v historii. Tedy například !356 spustí příkaz, který se
v historii nachází na 356. místě. Vcelku zajímavou možností je také použití příkazu !-x, kde x je pozice příkazu v historii odzadu.
Například tedy !-16 spustí šestnáctý příkaz odzadu (= od současné pozice) bez ohledu na jeho
identifikační číslo. Vykřičník má mnoho použití a můžeme jej uplatnit i ve variantě !text, kdy bude spuštěn poslední
příkaz z historie, který začíná specifikovaným textem. Tedy například !ls může spustit ls -la,
apod. Další variantou je použití !?text?, kdy bude vyhledán a spuštěn poslední příkaz v historii,
který obsahuje specifikovaný text. Abych nebyl obviněn ze zatajování informací, uvedu ještě, že můžeme použít příkaz !!, pomocí
kterého spustíme poslední provedený příkaz v historii. Je to tedy jakási obdoba šipky nahoru. Další zajímavostí je také možnost spuštění většího počtu příkazů automaticky. Tedy vlastně
znovuspuštění určité části historie. Tuto část můžete předem vyeditovat a upravit dle svých
požadavků. Slouží k tomu příkaz fc. Nejjednodušší variantou je, že spustíte pouze fc a v
defaultním textovém editoru (nejčastěji vi) se vám objeví poslední příkaz. Ten můžete dle libosti
upravit a při skončení práce s editorem bude proveden. Užitečnější možností je zadání rozmezí v historii, tedy fc od do, kde od představuje startovní
pozici (číslo příkazu v historii) a do koncový bod. V editoru se pak objeví příkazy, které se nachází
v tomto rozmezí, opět je můžete upravit a po opuštění editoru budou postupně provedeny. Poznámka: chcete­li pracovat s jiným editorem než je vi, můžete nastavit proměnnou prostředí
FCEDIT nebo EDITOR (o tom, jak nastavit proměnnou se dočtete dále). Pokud nevíte, jak s
editorem vi pracovat, prostudujte si manuálovou stránku vi nebo můžete spustit vimtutor. Výpis př íkazu z historie
V předchozím oddíle jsme si uvedli několik možností, jak spustit nějaký příkaz z historie. Co však
uděláme, když chceme příkaz jenom vypsat? Můžeme chtít například vypsat poslední uvedený
příkaz nebo padesátý příkaz odzadu. Jak to ale uděláme, abychom jej nespustili? www.linuxzone.cz strana 121 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Je to velmi prosté. Použijeme příkaz echo. Tato utilita vrací jako svůj výstup zadaný text nebo
zpracované funkční proměnné. Například tedy pro výpis padesátého příkazu odzadu stačí napsat
echo !-50 nebo pro výpis posledního použitého příkazu echo !! (nebo jednoduše stiskneme
šipku nahoru :­)). Délka historie a její ukládá ní
Když si vypíšete nastavení vašeho systému, najdete v něm proměnné HISTSIZE a HISTFILE. Stačí
napsat set | grep hist, resp. echo $HISTSIZE a echo $HISTFILE a sami uvidíte.
Proměnná HISTSIZE určuje velikost historie na vašem systému. Tedy počet příkazů, který bude do
historie zaznamenán. HISTFILE zase určuje cílový soubor, kde se bude historie hledat a kam se
bude ukládat. Obě tato nastavení můžete dle svých požadavků změnit. Stačí napsat HISTSIZE=xxx, kde xxx
představuje konkrétní číselnou hodnotu. Obdobně lze změnit také proměnná HISTFILE. Úlohy a ř ízení procesů
Nyní se podíváme na úlohy, jejich správu a řadu souvisejících věcí, probereme spouštění úloh na
popředí a na pozadí a přesouvání úlohy mezi těmito dvěma režimy. Linux, respektive Unixové systémy obecně, dokáže zpracovávat větší množství úloh najednou. Pro
uživatele je pak dobré vědět co jeho systém dělá, kdy to dělá, proč to dělá a především jak je možné
tuto činnost efektivně řídit. Příkazový interpret BASH mu k tomu nabízí celou řadu nástrojů. Nejprve si ale povězme, co to ta úloha vlastně je... Stručně řečeno, je to jeden nebo více spuštěných
procesů. Jedna úloha tedy nevynucuje přítomnost pouze jednoho procesu, ale může jich využívat
více. Úloha může být spuštěna na popředí nebo na pozadí. Uživatel pak tedy logicky potřebuje nástroje,
pomocí kterých bude schopen spustit úlohu jak na popředí, tak na pozadí a také mezi těmito dvěma
stavy libovolně přepínat. Stejně tak je důležité mít nějaký nástroj na pozastavení běžící úlohy. Pozastavení běhu úlohy
Snad na všech unixových systémech je implicitně k tomuto účelu nastavena kombinace kláves
CTRL+Z. Toto nastavení lze samozřejmě změnit pomocí příkazu stty, ale tím se zde zabývat
nebudeme. Můžeme si ukázat, jak takové pozastavení běhu úlohy vlastně vypadá: $ pr
CTRL+Z
[1]+ Stopped
pr
$ cat
www.linuxzone.cz strana 122 / 159
Impossible: Linux Mission 1.0
CTRL+Z
[2]+ Stopped
cat
$ jobs
[1]- Stopped
[2]+ Stopped
pr
cat
8. Grafické rozhraní X Window System
Jako první jsme spustili příkaz pr, který očekává zadání nějakého vstupu ze STDIN (standardního
vstupu). Pozastavili jsme jeho běh pomocí kombinace kláves CTRL+Z a spustili další příkaz ­ cat
­ který taktéž očekává zadání další informace ze STDIN. I běh této úlohy pozastavíme stisknutím
uvedené klávesové zkratky a necháme si vypsat seznam spuštěných úloh. K tomu standardně slouží
příkaz jobs. Jak vidíme, ve výpisu dostaneme seznam všech pozastavených úloh, které jsou
číslovány od nejstarší k nejnovější. Úloha, se kterou systém pracoval naposledy, má u sebe
znaménko +, úloha, se kterou pracoval na předposledy, je označena ­. Ostaní úlohy nemají na tomto
místě žádné označení. Provádění úlohy na popř edí/pozadí
Budeme­li chtít nyní některou z úloh oživit, stačí ji například převést do popředí. K tomu můžeme
využít příkazu fg. Zadáme­li tento příkaz bez parametru, bude systém komunikovat s poslední
úlohou ze seznamu (tj. s úlohou označenou znaménkem +). U výše uvedeného příkladu by to tedy vypadalo následovně: $ fg
cat
A program by nyní opět čekal na zadání vstupních informací ze standardního vstupu ­ STDIN.
Obdobně můžeme také převádět úlohy na pozadí. Slouží k tomu příkaz bg. Jeho použití je obdobné
jako u předchozího. Bylo by ale jistě dobré upozornit, že nemusíte nutně pracovat jen s poslední úlohou. Klidně můžete
zvolit jakoukoliv jinou úlohu, kterou jste dříve pozastavili v běhu. Stačí pak u příkazu bg nebo fg
jednoduše uvést znak procenta následovaný číslem úlohy v seznamu, tedy například: $ bg %1
Tento příkaz převede na pozadí první spuštěnou úlohu, tedy v našem případě pr. "Musí zemřít !"
Aby toho nebylo málo, povíme si ještě, jak je to vlastně s ukončováním běžících úloh. To, že
nějakou úlohu pozastavíme, totiž ještě zdaleka neznamená, že by byla ukončena. Stále zatěžuje
www.linuxzone.cz strana 123 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
systémové zdroje a stále máme možnost s ní dále pracovat. Když ji však ukončíme, uvolní se
systémové prostředky a úloha přestane figurovat ve výpisu. Tím se tedy zruší i její pořadové číslo a
to je uvolněno pro další úlohy, které spustíme. Nutno podotknout, že pokud skončí svůj běh úloha s
nižším číslem, zůstává úlohám na vyšších místech jejich identifikátor nadále přiřazen. Vraťme se ale zpět k ukončování běžících úloh. K tomuto účelu využíváme primárně příkazu kill
s parametrem identifikujícím příslušnou úlohu. Tato identifikace je stejná, jako v předešlých
případech, tedy opět %x, kde x symbolizuje pořadové číslo spuštěné úlohy. Je také nezbytné
upozornit, že abychom se dozvěděli o ukončení úlohy, je nutné stisknout dvakrát klávesu Enter,
čímž se dostaneme ke kýženému výpisu informace o ukončení běžící úlohy. Není to způsobeno
žádnou závadou, ale prostou činností shellu. Po prvním stisknutí klávesy Enter zjistí příkazový
interpret, že příslušná úloha byla pozastavena a upozorní nás na to. Po dalším stisknutí dojde ke
zjištění, že úloha byla ukončena a vypíše nám tuto informaci. Úlohy v popře dí a na pozadí
Ve stručnosti jsme si už řekli několik obecných informací o úlohách běžících na popředí a úlohách
běžících na pozadí. V krátkosti tedy jen doplním, že běh na pozadí je takový stav, kdy úloha je
spuštěna, ale nepřijímá žádný vstup z terminálu a nebrání v další činnosti na tomto terminálu.
Zatímco běh na popředí je logicky pravým opakem ­ přijímá vstup z terminálu a blokuje jej pro
sebe. Pro úplnost ještě doplním, že pozastavená úloha je taková, která momentálně neběží, ale ještě
neukončila svou činnost. Uvedli jsme si už jeden způsob, jak převádět běžící úlohu z popředí na pozadí. Neřekli jsme si ale,
jak spustit úlohu na pozadí už od začátku. Je to velmi prosté. Stačí za příkaz napsat znak &. Systém
nám pak vypíše číslo této úlohy, takže ji budeme moci dle libosti průběžně sledovat. V praxi to pak
může vypadat nějako takto: $ cat &
[1] 1797
Od této chvíle bude úloha spuštěna na pozadí. Zasílání signálů
Po dalším týdnu jsme zpět se seriálem o programování v BASHi. V dnešní části se podíváme na
signály v Linuxu. Rozlišíme si je a povíme si, jak s nimi pracovat. To ale není vše. Aby toho nebylo
málo, nahlédneme dnes konečně i pod pokličku skutečného programování a ve stručnosti zavítáme
do světa proměnných... Unixové operační systémy mohou procesům zasílat nejrůznější signály (viz také kapitola "Řízení
procesů, signály" v části "Pod pokličkou ­ orientace v systému pro pokročilé"), kterými je informují
o nějaké situaci a tím řídí jejich činnost. Asi nejčastěji používaným signálem je SIGTERM, avšak s
www.linuxzone.cz strana 124 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
pomocí programu kill můžeme zasílat i jiné signály. Seznam signálů, které podporuje váš systém, získáte pomocí příkazu kill -l: $ kill -l +---------------+--------------+--------------+-------------+
| 1) SIGHUP
| 2) SIGINT
| 3) SIGQUIT
| 4) SIGILL
|
| 5) SIGTRAP
| 6) SIGIOT
| 7) SIGBUS
| 8) SIGFPE
|
| 9) SIGKILL
| 10) SIGUSR1 | 11) SIGSEGV | 12) SIGUSR2 |
| 13)SIGPIPE
| 14) SIGALRM | 15) SIGTERM | 17) SIGCHLD |
| 18) SIGCONT
| 19) SIGSTOP | 20) SIGTSTP | 21) SIGTTIN |
| 22) SIGTTOU
| 23) SIGURG
| 24) SIGXCPU | 25) SIGXFSZ |
| 26) SIGVTALRM | 27) SIGPROF | 28) SIGWINCH | 29) SIGIO
|
| 30) SIGPWR
|
|
|
|
+---------------+--------------+--------------+-------------+
Jak vidíte na výpisu, každý signál má své unikátní jméno, kterému předchází předpona SIG. K
zaslání tohoto signálu některému procesu můžete u příkazu kill využívat buď číslo tohoto signálu
nebo jeho jméno bez prefixu SIG. Například tedy kill -9 %7 je ekvivalentní s příkazem kill
-KILL %7. Jestliže použijete příkaz kill bez specifikace zasílaného signálu, bude automaticky odeslán signál
číslo patnáct, tedy SIGTERM. Ten "požádá" proces o jeho ukončení a dá mu možnost, aby po sobě
"uklidil", tedy zlikvidoval dočasné soubory a další specifické věci. Jestliže je však tento signál
programem ignorován, bude zaslán jiný ­ signál číslo devět, tedy SIGKILL. Ten už program
ignorovat nemůže a dojde k jeho okamžitému ukončení (bez "uklizení"). Už jsme si povídali o pozastavování úloh a procesů. Pokud nemůžeme z nějakého důvodu
pozastavit proces využitím klávesové kombinace CTRL+Z, stačí, když danému procesu zašleme
signál SIGSTOP. K opětovnému spuštění můžeme zaslat signál s číslem osmnáct, tedy SIGCONT. Dalším signálem, který stojí za bližší pohled z hlediska terminálových aplikací, je SIGWINCH. Ten
je programu zaslán v případě, že terminál změní svoje parametry, tedy například při změně velikosti
okna emulátoru terminálu, čímž dojde ke změně počtu sloupců a řádků. V řadě aplikací musí být
zaslání tohoto signálu následováno příkazem pro překreslení obrazovky (nejčastěji klávesová
kombinace CTRL+L). Jen ještě malá poznámka na závěr ­ zasílat signály může uživatel pouze svým procesům. Výjimku
tvoří samozřejmě privilegovaný uživatel root, který může zasílat signály všem procesům bez
výjimky. Důvod je prostý ­ ochrana procesů jiných uživatelů před nevyžádaným ukončením či
změně chování. www.linuxzone.cz strana 125 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Konečně programujeme aneb proměnné v teorii i praxi
Po krátkých povídáních o úlohách, procesech, běhu na pozadí a na popředí, tedy stručně řečeno o
principech fungování příkazového interpretu v systému Linux, se konečně dostáváme k praktickým
záležitostem, které zužitkujeme při psaní skriptů. Nejprve zavítáme do světa proměnných. Co je proměnná?
Každý, kdo někdy alespoň přičuchl k programování nebo absolvoval střední školu, jistě ví, že
proměnná zastupuje nějakou proměnlivou hodnotu. Můžeme ji na začátku přiřadit jednu výchozí
hodnotu a tu pak v průběhu programu nějakým způsobem měnit. Například pokud proměnnou a
nastavíme na počáteční hodnotu 7 a v průběhu programu zadáme příkaz a=a*3, bude hodnota této
proměnné 21 a nikoliv sedm, jako na začátku. Jak prosté. Proměnná je tedy nějaký pojmenovaný prostor, pro nějž nadefinujete hodnotu (textovou nebo
číselnou) a tuto hodnotu využíváte, dokud není změněna. Cesty k programům
Asi nejjednodušším využitím proměnné v příkazovém interpretu je nastavení cesty ke spustitelným
souborům. Protože se na různých platformách či v různých distribucích Linuxu může lišit toto
umístění, není nikde pevně zakomponováno a je nastaveno pomocí proměnné PATH. Díky této
proměnné docílíme toho, že po zadání nějakého příkazu není prohledáván celý adresářový strom
našeho systému, ale je postupně nahlédnuto do všech specifikovaných adresářů, v nichž máme
umístěny spouštěné programy a v prvním adresáři, kde je takový program nalezen, toto hledání
skončí a příkaz se provede. Pokud nalezen není, oznámí nám interpret chybu, respektive vypíše
hlášku o nenalezení požadovaného programu. Taková jednoduchá cesta pro vyhledávání by mohla vypadat například nějak takto: /usr/local/bin:/usr/bin:/usr/X11R6/bin:/usr/sbin:/bin:/sbin
Jak vidíte, jednotlivé adresáře jsou odděleny dvojtečkou (typický oddělovač pro systémy Unix). V
praxi to pak vypadá tak, že nejprve je prohledáván adresář /usr/local/bin, v případě
nenalezení pak /usr/bin, apod. Postupuje se tedy krok za krokem od začátku cesty. Přesné nastavení vaší cesty pro vyhledávání spustitelných programů, získáte výpisem proměnné
PATH, což provedete pomocí příkazu echo $PATH na příkazovém řádku. Systém vám pak
jednoduše vypíše celou cestu, tedy dvojtečkou oddělený seznam všech adresářů, které budou
postupně prohledávány. www.linuxzone.cz strana 126 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Změna hodnoty proměnné
Již víme, co je to proměnná a jaké jsou její základní vlastnostmi v operačním systému Linux. Zatím
umíme vypsat obsah proměnné, ale ještě nevíme, jak ho změnit. Je to prosté. Na příkazovém řádku
zadáme identifikátor proměnné a po vzoru klasické matematické syntaxe zapíšeme novou hodnotu.
Zde je nutno odlišit dva různé případy: •
Nahrazení obsahu proměnné: V tomto případě dojde k přepsání aktuální hodnoty proměnné novou hodnotou. Docílíme
toho prostým zápisem promenna=hodnota. Tedy například: $ PATH=/sbin:/bin
•
Tím dojde k nastavení hodnoty proměnné PATH tak, aby spustitelné soubory byly vždy
vyhledávány pouze v adresářích /sbin a /bin nezávisle na předchozím nastavení této
proměnné. Doplnění stávajícího obsahu proměnné Toto je druhá varianta, se kterou se setkáme. Například pokud je hodnota proměnné PATH
nastavena pouze na vyhledávání v adresářích /sbin a /bin, můžeme doplnit, že se mají
spustitelné soubory vyhledávat ještě v adresáři /usr/local/bin a /usr/bin. Docílíme
toho obdobným zápisem, jako v minulém případě, avšak budeme uvažovat adiční zápis, tedy
promenna=$promenna:hodnota Všimněte si znaku dolaru u identifikátoru proměnné za rovnítkem. Tento zápis bude
příkazovým interpretem nahrazen aktuální hodnotou proměnné a k té se následně přidá
dopsaná hodnota. V praxi tedy bude celý zápis vypadat nějak následovně: $ PATH=$PATH:/usr/local/bin:/usr/bin
Další proměnné prostř edí
Když už jsme si tolik pověděli o proměnné PATH, neměli bychom v našem povídání opomenout
také proměnnou MANPATH. Její využití je obdobné, jako u předešlé, avšak neslouží k vyhledávání
spustitelných souborů, ale k vyhledávání umístění manuálových stránek. Veškerá práce s touto
proměnnou je samozřejmě zcela analogická k předchozímu výkladu. Také nesmíme opomenout proměnnou HOME. V ní je totiž uložena cesta k domovskému adresáři
uživatele. Obsah této proměnné neměňte. Ve starších Unixech, resp. v Bourne­shellu, který byl
předchůdcem dnešního příkazového interpretu ­ BASH ­ nebylo možné odkazovat na domovský
adresář pomocí vlnovky, tedy např. cd ~. Místo toho se používal zápis cd $HOME. Efekt je
www.linuxzone.cz strana 127 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
stejný. Enormně důležitou systémovou proměnnou, nebo abych byl přesný ­ konfigurační proměnnou ­ je
také PWD. Zde je uložena cesta k aktuálnímu adresáři. Použijete­li tedy echo $PWD, výstup bude
shodný s příkazem pwd. Opět hodnotu této proměnné neměňte. Některé proměnné jsou zkrátka určeny k tomu, aby si je uživatel nastavil dle svého přání (nebo
spíše potřeb) a tím si systém upravil na míru. Jiné proměnné však měnit nesmíme, chceme­li
zachovat dobrou funkčnost našeho příkazového interpretu. Teď se podívejme na proměnnou MAILCHECK. Ta slouží k nastavení intervalu, kdy příkazový
interpret kontroluje, zda nemáte novou poštu. Nastavíme­li tedy hodnotu této proměnné na 600
(hodnota je uváděna v sekundách), bude BASH každých deset minut provádět kontrolu na nově
příchozí poštu. Ovšem, když už jsme začali o těch e­mailech, nesmíme opomenout také proměnnou MAILPATH.
Opět se zde dostáváme k analogii s proměnnou PATH nebo MANPATH. Hodnotou této proměnné je
totiž řada dvojtečkou oddělených adresářů, v nichž bude interpret příkazů hledat soubory s poštou. Co si probereme dál... Proměnnou HISTSIZE. O té jsme si již povídali hned v prvním díle našeho
seriálu. Ale pro úplnost si stručně zopakujeme, že slouží k nastavení velikosti historie
uchovávaných příkazů. Nebo přesněji ­ když nastavíme hodnotu HISTSIZE na deset, budeme mít v
historii příkazů uložených posledních deset použitých příkazů. Doporučuji ale zvolit poněkud vyšší
hodnotu. :­) Líbí se vám výzva vašeho intepretu příkazů nebo byste ji raději změnili na něco jiného, lepšího?
Žádný problém! Máme tady proměnné PS1 a PS2. Nejprve se podíváme na první z nich. Pokud
zapíšete například PS1='Tohle je vyzva: ', bude se jako výzva příkazového řádku (tzv.
primární prompt) objevovat tato věta. Všimněte si mezery mezi dvojtečkou a apostrofem. Tato
mezera bude totiž oddělovat výzvu interpretu od zadávaného textu na konzoli. Ale máme zde ještě druhou proměnnou PS2. Ta se uplatní např. tehdy, odešleme­li neúplný příkaz ­
Bash nám tím dává najevo, že očekává jeho doplnění. Standardně je sekundární prompt nastaven
znak >. Tedy například: $
>
>
>
for soubor in *wav;
do
play $soubor
done
Tímto příkladem jsem tošku předběhl výklad, nicméně vidíme, že jsem vlastně interpretu zadal
krátký program (skript), který obsahoval cyklus for. Bash ví, že u cyklu for musím uzavřit tělo
cyklu mezi klíčová slova do a done a proto s provedením příkazu čekal, dokud jsem jej nezadal
www.linuxzone.cz strana 128 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
celý ­ a po tu dobu se místo obvyklého promptu $ zobrazoval sekundární prompt >. Jinak smysl
tohoto příkazu byl jednoduchý: vezmi všechny soubory v současném adresáři, které končí na "wav"
a přehraj je postupně přehrávačem zvukových souborů pro příkazovou řádku. Proměnné ovlivňující nastavení terminálu
Nastavení každého terminálu je, tak jako spousta jiných věcí v Linuxu, definováno pomocí
proměnných. Ty určují, jak bude systém s vaším terminálem komunikovat a jak jej bude vlastně
interpretovat. Základní proměnné, které určují vlastnosti terminálu, jsou DISPLAY, TERM, LINES a COLUMNS.
Poslední dvě nechte nastaveny na implicitních hodnotách. Určují funkční rozměr obrazovky
terminálu, tedy přesněji ­ LINES udává počet řádků terminálu a COLUMNS specifikuje počet znaků
na řádku. Proměnná DISPLAY je využívána grafickým rozhraním X Window Systemu a určuje, na kterou
obrazovku bude směrován grafický výstup programů, které na tomto počítači běží. X Window
System je totiž schopný obstarávat chod několika obrazovek využívaných jedním uživatelem.
Obsah této proměnné je tvořen jménem počítače a číslem displeje (dvě čísla oddělená tečkou). Tyto
údaje jsou odděleny dvojtečkou. Poslední proměnnou, která nám ještě zbývá, je TERM. Ta systému sděluje, který terminál používáte
a jaké jsou jeho vlastnosti (možnost používání barev, možnost pohybu kurzoru, apod.). Znalost
těchto proměnných a jejich využití je nezbytná, pokud chcete svůj terminál přizpůsobit svým
přáním a požadavkům. Obyčejné (obecné) proměnné
Teď se ale pojďme podívat na trochu jinou problematiku, kterou jsou tzv. obyčejné (obecné)
proměnné. Linux, stejně jako unixové operační systémy, svého uživatele nijak netlačí do kouta,
pokud jde o využívání proměnných. Nemusíme se soustředit pouze na systémové proměnné se
speciálním významem, můžeme si vytvořit libovolné množství vlastních obyčejných proměnných.
Jejich jména však nesmí kolidovat se systémovými proměnnými. Proč ale vůbec vytvářet nějaké vlastní proměnné? Tady už se dostáváme hlavně k problematice
tvorby skriptů. Můžeme si například do proměnné nastavit počet iterací nějakého cyklu,
prohledávanou lokalitu na disku, název vygenerovaného souboru, apod. Další využití je také v jisté možnosti zjednodušení práce se systémem. Můžeme si například v
příkazovém interpretu nastavit, že proměnná ADRESA bude obsahovat adresu k nějakému adresáři
na disku. To uděláme jednoduše ­ ADRESA=$HOME/Desktop/test/vypis. V tuto chvíli
můžeme jednoduše používat příkazy jako cd $ADRESA nebo třeba rm $ADRESA/test.txt.
Nemusíme se tedy vypisovat s dlouhým názvem adresáře, který třeba často používáme. www.linuxzone.cz strana 129 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
O proměnných prostředí už jsem se zmínil v minulosti. Princip je jednoduchý. Proměnné jsou
většinou přístupné pouze z právě aktuálního příkazového interpretu. Pokud se rozhodnete je
využívat i ze spuštěných programů, musíte je nejprve vyexportovat do vašeho prostředí. Prostředí je
jakýsi souhrn informací o aktuální konfiguraci, který je složen z některých proměnných interpretu.
Tyto proměnné jsou pak dostupné běžícím programům. Můžeme se například rozhodnout vytvořit proměnnou WWW_HOME (tu využívají některé webové
prohlížeče k nastavení domovské stránky) a její obsah vyexportovat. Vypadá to tedy následovně: $ WWW_HOME='http://www.linuxzone.cz'
$ export WWW_HOME
Jak prosté. Od této chvíle bude příslušná proměnná přístupná aplikacím, které z příkazového
interpretu spouštíme. Konfigurace interpretu ­ startovací skripty
Při spuštění interpretu je vždy proveden jeden nebo více startovacích skriptů. To, který skript bude
proveden, záleží na nastavení přihlašovacího interpretu. Tedy toho, se kterým budete pracovat po
přihlášení do systému. Ten pak čte další konfigurační soubory. Protože náš seriál je věnován příkazovému interpretu BASH, nebylo by jistě na škodu říci, které
konfigurační soubory spouští. Jako první je spuštěn /etc/profile. Následně je vyhledáván (v
uvedeném pořadí) některý ze souborů: ~/.bash_profile, ~/.bash_login nebo
~/.profile. Při nalezení některého z nich přestane s vyhledáváním a obsah tohoto souboru
načte. Jestliže není BASH nastaven jako přihlašovací interpret, spouští skript uložený v souboru .
bashrc, který se nachází v domovském adresáři uživatele. Kromě startovacích skriptů však existují také takové skripty, které se provádějí vždy při ukončování
interpretu. V případě BASHe je tímto skriptem ~/.bash_logout. Zde můžeme uvést další
parametry, které se provedou při ukončování naší práce. Speciální znaky a řídí cí sekvence
Nyní se podíváme na jednotlivé druhy uvozování speciálních znaků, proměnných a příkazů.
Probereme si apostrofy, uvozovky, zpětné lomítko a obrácené apostrofy a samozřejmě odlišnosti
mezi těmito způsoby uvozování. Jestliže chceme v příkazovém interpretu BASH pracovat se
speciálními znaky nebo proměnnými, měli bychom si ze všeho nejdříve vysvětlit rozdíl mezi
jednotlivými druhy uvozování hodnot, protože právě s nimi budeme pracovat asi nejvíce. Máme celkem čtyři možnosti uvození: •
Apostrofy (') www.linuxzone.cz strana 130 / 159
Impossible: Linux Mission 1.0
•
•
•
8. Grafické rozhraní X Window System
Uvozovky (") Zpětné lomítko (\) Obrácené apostrofy (`) Různé možnosti uvozování se od sebe liší svými vlastnostmi. A musíme podotknout, že právě tato
odlišnost, která v sobě zároveň skrývá i ohromnou všestrannost, je jednou z nejsilnějších zbraní
příkazového řádku a umožňuje nám provádět hotová kouzla. Nejvíce však tyto možnosti oceníte při
vlastním psaní skriptů. Pojďme si teď ale povědět něco o jednotlivých způsobech: Apostrofy
První důležitou věcí je, že řetězec uvozený apostrofy není v žádné své části nahrazen zástupnou
hodnotou. Pokud tedy uvedeme znaky jako * nebo ., budou tyto interpretovány vždy pouze jako
znak a nebude za ně nic dosazeno. Stejně tak pokud napíšete echo '$HOSTNAME', bude
výstupem pouze řetězec $HOSTNAME a nikoliv hostname vašeho počítače. Veškerý text, který je uveden mezi apostrofy, je interpretován jako jeden souvislý celek. Pokud jsou
zde tedy uvedeny mezery, nijak to neovlivní práci systému. Kdybyste kupříkladu zadali příkazu
grep parametry linux zone lz.txt, bude si myslet, že hledaný řetězec je pouze linux a
zone spolu s lz.txt jsou dva různé textové soubory. Jestliže však zapíšete grep 'linux
zone' lz.txt, bude mít příkaz jasno a bude v souboru lz.txt vyhledávat řetězec linux
zone. Nutno podotknout, že tuto konverzi zástupných znaků na hodnoty neprovádí samotná
aplikace, ale právě interpret příkazů, tedy v našem případě BASH. Jak je to prosté... Jediným znakem, který nemůžeme vložit mezi apostrofy, je další apostrof. Ve chvíli, kdy bychom
jej totiž do zadaného textu vložili, představoval by párový apostrof k prvnímu a tím by zadaný
řetězec ukončil. Uvozovky
Tady je to náročnější. Uvozovky sice také zajistí, že bude celý text brán jako argument, ale nebude
to tak jednoduché, jako v případě apostrofů. Zde již budou zachovány některé funkce interpretu
příkazů. Například pokud vyzkoušíte "*", dočkáte se výstupu znaku *. Nejlépe je to patrno například u
echo "*". Jak to tedy s tím nahrazováním je? Vypnuto je nahrazování jmen, ale příkazy historie, proměnné, znaky uvozené zpětným lomítkem
nebo obrácené apostrofy (viz dále) zůstávají nadále aktivní a budou interpretovány tak, jako
kdybyste je zapsali přímo na příkazový řádek samostatně bez uvození. Jednotlivé způsoby mezi sebou můžeme i efektivně kombinovat. Často se používá kombinace
uvozovek a obrácených apostrofů (viz dále). Pokud například zkusíte zadat: ls "`echo /
www.linuxzone.cz strana 131 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
home`", dočkáte se skutečně výstupu seznamu souborů v adresáři /home. Zpětné lomítko
Zde je situace velmi jednoduchá a pokud jste někdy zkoušeli alespoň trochu programovat, zřejmě už
víte, co můžete čekat. Zpětné lomítko uvozuje vždy jeden znak, který je interpretován jako speciální. Existuje celá řada
takových kombinací. Například \u symbolizuje uživatelské jméno právě aktivního uživatele, \n
zase nový řádek. Když budeme chtít vypsat obrácené lomítko, můžeme k tomu využít zápisu \\ a
pro apostrof pak zase \', čímž předejdeme tomu, aby interpret příkazů pokládal lomítko nebo
apostrof, které chceme vypsat, za speciální přepínač. Další důležitou vlastností zpětného lomítka je možnost vypnutí speciálního významu některých
znaků. Pokud tedy zapíšeme \* nebo \~, budou znaky * a ~ interpretovány jen jako obyčejné
znaky bez jakéhokoliv nahrazování. Obrácené apostrofy
Posledním typem uvození jsou obrácené apostrofy. Díky nim můžeme vsunout výstup jednoho
příkazu do druhého. Příkaz zadaný mezi obrácenými apostrofy je tedy nahrazen svým výstupem,
který může být například předán ke zpracování dalšímu příkazu. Tedy kupříkladu echo
`whoami`. Mezi obrácenými apostrofy opět můžeme dle libosti využívat řadu speciálních znaků nebo příkazů
historie a proměnných, které budou dále interpretovány. Znalost různých vstupů uvozování textu, speciálních znaků a příkazů, je naprosto nezbytná při psaní
skriptů nebo pokročilých operacích v příkazovém interpretu Linuxu. Doporučuji proto, abyste se
před dalším studiem dobře seznámili s uvedenými způsoby a rozdíly mezi nimi. Zkuste také říci, co se objeví po zadání následujících příkazů. Následně si své odhady ověřte přímo
v BASHi: 1) $
2) $
3) $
4) $
5) $
echo -n "Hostname meho pocitace je $HOSTNAME"
echo -n 'Hostname je: $HOSTNAME'
ls '`echo /bin`'
ls *
cd "~" Podmíněné versus sekvenční provádění příka zů
V této části našeho průvodce programováním příkazového interpretu BASH budeme zabývat
www.linuxzone.cz strana 132 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
podmíněným prováděním příkazů. ještě předtím se však podíváme na sekvenční provádění příkazů,
které nás mírně vtáhne do celé problematiky. Kdo někdy alespoň zkoušel programovat, jistě se dostal do kontaktu s cykly a podmínkami. Ten,
kdo se zatím programování nevěnoval, však rychle pochopí, o co vlastně jde. Podmíněné provádění
příkazu znamená, že daný příkaz, nebo sekvence příkazů, je proveden v závislosti na splnění
podmínky. Můžeme to vyjádřit schématem: KDYŽ PLATÍ PODMÍNKA, PROVEĎ PŘÍKAZ.
Pokud je tedy zadaná podmínka splněna, bude příkaz proveden, v opačném případě jej bude
interpret ignorovat. Cyklické provádění je založeno na podmínkovém. Jedním z jeho základních schémat je:
PROVÁDĚJ PŘÍKAZ DOKUD PLATÍ PODMÍNKA. U samotné podmínkové konstrukce dojde k
provedení pouze jednou v závislosti na splnění porovnávané podmínky. Avšak v případě cyklu se
příkaz (nebo blok příkazů) opakuje do doby, dokud je (nebo dokud není ­ závisí na konkrétním
cyklu) splněna zadaná podmínka. Sekvenční provádění příka zů
BASH nám kromě výše uvedených možností nabízí také tak zvané sekvenční provádění příkazů.
Jde vlastně o to, že mu zadáme několik příkazů a ty jsou ­ nezávisle na okolnostech a výsledcích
předešlých příkazů ­ postupně prováděny tak, jak jsou napsány. Abychom mohli sekvenční provádění vyzkoušet, vytvoříme si jednoduchý skript. Veškeré skripty v
BASHi musí na prvním řádku obsahovat: #!/bin/bash
Jedná se o cestu k interpretu příkazů (pokud byste někdy pracovali se systémem, kde je umístěn
jinde ­ což se může stát ­ vyhledejte si jej příkazem whereis bash a zapište platnou cestu pro
váš systém). Jako další již zadáváme jednotlivé příkazy a konstrukce, které chceme v BASHi
provést. Nezapomeňte však po skončení práce změny v souboru uložit a změnit mu práva na
spustitelná (např. chmod 777 skript.sh). Nyní soubor spustíme ­ ./skript.sh ­ a provede
se jeho obsah. Sekvenční provádění příkazů má, jak je patrno, jednu ohromnou nevýhodu. Pokud například
vytvoříme sekvenci těchto příkazů: cd trial
mkdir adresar
cd adresar
cp /etc/passwd /home/kmartin/test/triol/adresar
rm passwd
www.linuxzone.cz strana 133 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Je zřejmé, že jsme se dopustili několika chyb nebo alespoň jedné chyby a jedné "špatnosti". Tou
špatností je uvedení příkazu cd trial na začátku skriptu. Co když umístíme skript nějakým
omylem do jiného adresáře než do /home/kmartin/test, kde by se měl logicky nacházet? V
takovém případě se dočkáme hned dvou chybových hlášek a zůstaneme na původním umístění. Druhou závažnou věcí je překlep, kterého jsme se dopustili při kopírování souboru /etc/passwd.
Cílový adresář je podadresářem v trial, nikoliv triol. Docílíme tedy další chybové hlášky a
žádný soubor se nezkopíruje (pokud samozřejmě v /home/kmartin/test nemáme ještě nějaký
adresář triol :­)). Z těchto dvou chyb nám plynou dvě poučení ­ vždy je dobré uvádět cesty v absolutní formě (tj.
cd /home/kmartin/test). Tím předejdeme možným komplikacím při přenášení skriptu. Dále
pak vždy pečlivě kontrolujte to, co píšete ­ některé překlepy mohou být i osudné... A mimochodem,
z vlastní zkušenosti doporučuji nepoužívat při sekvenčním provádění příliš mnoho příkazů rm. Na
to už doplatilo hodně lidí. Vždy je lepší si smazat soubory či adresáře ručně. Nikdy nevíte, co se
může stát... Podmíněné provádění př íkazů
Tolik tedy v krátkosti k sekvenčnímu provádění příkazů. Nyní přejděme dál. Podíváme se na
podmíněné provádění příkazů. Pozor, nebude řeč o podmínkách jako takových, tedy příkazech if
& spol. Nejprve si vysvětlíme, jak BASH zpracovává příkazy, respektive vyhodnocuje úspěšnost
jejich provedení. Jestliže na příkazové řádce zadáme nějaký příkaz a potvrdíme klávesou Enter, máme logicky pouze
dvě možné varianty odpovědi ­ buď se příkaz provede bez komplikací nebo se neprovede a BASH
ohlásí chybu. Pokud toto provedeme interaktivně, jistě dokážeme celou situaci vizuálně vyhodnotit. Pokud však
pracujeme se skripty, musíme vyhodnocovat tuto situaci automaticky. Slouží k tomu proměnná $?. Pro začátek můžete vyzkoušet na příkazové řádce zadat: $ cd /etc
$ echo $?
Co bude výstupem? Pokud nepoužíváte nějakou zcela extrémně zmutovanou distribuci Linuxu, pak
se vám na obrazovce objeví 0. Nula jako návratový kód symbolizuje bezchybné provedení
předchozího příkazu. Když však zadáme: $ cd /hura_slava_bash_je_nejlepsi!!!
$ echo $?
www.linuxzone.cz strana 134 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Zřejmě bude výstupem 1. Pochybuji, že někdo z vás má v rootu standardně adresář /
hura_slava_bash_je_nejlepsi!!!. Číslo jedna jako návratový kód symbolizuje chybné
provedení předchozího příkazu. Můžeme dokonce jít tak daleko, že příkaz samotný bude vyjádřením svojí pravdivostní hodnoty: $
$
$
$
true
echo $?
false
echo $?
Když vyzkoušíte výše uvedené příkazy, získáte postupně odpovědi 0 a 1. Všechny tyto triky
zužitkujeme při konstrukci podmínek a cyklů. Nicméně pozor, návratová hodnota příkazu nemusí
být pouze nula nebo jednička. Různé chybové hlášky jsou interpretovány různými čísly. Například
pro příkaz, jehož výstupem je "command not found" získáme po zadání echo $? hodnotu
127. Když už jsme se naučili zjišťovat návratový kód příkazu, můžeme toho využít při konstruování
složitějších příkazů. BASH toto umožňuje velmi efektivně, zkrátka můžeme zadat několik příkazů,
které se provedou postupně v závislosti na návratové hodnotě předchozího příkazu. Seznamy
Nyní jsou na řadě seznamy k jejichž realizaci používáme operátory && a ||. Oba tyto operátory
slouží také k podmíněnému zpracování příkazu ­ na základě návratové hodnoty příkazu předešlého.
Často používaná kombinace je například make && make install. Operátor && zajistí, že se
následující příkaz provede v případě, že ten předchozí byl proveden úspěšně. Operátor || funguje
opačně ­ příkaz se provede, pokud předchozí skončil neúspěšně. Jak už jsem řekl, časté využití těchto operátorů je při instalaci. Zkrátka jen spustíme skript s názvem
například instaluj.sh, který provede sekvenci příkazů ./configure && make && make
install a program bude nainstalován. Nemusíme tedy nezkušeného uživatele zatěžovat s
nějakými instalačními procedurami. Tyto operátory však můžeme využít i k jiným účelům. Například: cd archiv && rm -r
neco. V tomto případě máme naprostou jistotu, že skript, který bude obsahovat tento řádek, smaže
podadresář neco v adresáři archiv. Nemusíme se tedy bát toho, že jej spustíme v nějakém jiném
adresáři a napácháme tím nějakou škodu ­ s největší pravděpodobností totiž jeho provádění skončí
ihned po prvním příkazu, který dopadne neúspěšně. A podívejme se ještě na jeden zajímavý operátor ­ !. O vykřičníku už jsme si povídali v souvislosti
s historií příkazů. Avšak nezaměňujte tato dvě jeho využití. Pokud nějakému příkazu předřadíme
vykřičník, dosáhneme přepólování návratové hodnoty tohoto příkazu, přičemž na činnosti příkazu
www.linuxzone.cz strana 135 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
samotného se nic nezmění. Podívejme se na příklad: $ echo "neco"
neco
$ echo $?
0
$ ! echo "neco"
neco
$ echo $?
1
Využití tohoto operátoru je vhodné zejména ve skriptech, které předáváte dalším lidem. Je totiž
zřetelnější a jasnější než operátory && a ||, které jej dokážou v mnoha ohledech zastoupit/nahradit. Příkazový zápis, kde jednotlivé položky jsou od sebe odděleny operátory && nebo ||, nazýváme
seznam. Podmínkové konstrukce
Konečně se tedy dostáváme k podmínkovým konstrukcím, jež můžeme v BASHi vytvářet. Základní forma podmínkové konstrukce je tvořena klíčovými slovy if, then, else a fi. Za if
následuje seznam příkazů, od nichž se očekává návratová hodnota 0 nebo 1. Následuje slovíčko
then, které říká interpretu, co má v případě úspěšného provedení příkazu udělat. Potom je
podmínková konstrukce buď ukončena (slovíčkem fi) nebo je dále prodloužena o větev else,
která je následována seznamem příkazů, co budou vykonány při nesplnění podmínky. Dále pak existuje ještě klíčové slovo elif, které je synonymem pro else if, tedy zápis další
podmínky, která rozšiřuje podmínku původní. Dnes se však zaměříme především na jednoduché
podmínky se základním větvením. Uveďme si pro ilustraci malý příklad: if cd zkouska
then
echo "Adresar zmenen."
fi
Pokud vytvoříte skript, který by obsahoval tuto konstrukci, docílíte výpisu hlášky "Adresář
změněn." ve chvíli, kdy dojde k přejití do adresáře zkouska. Pokud k tomuto přechodu nedojde
(skript se nenachází ve stejném adresáři, jako podadresář zkouska), nevypíše se nám na
obrazovku zkrátka nic ­ jen chybová hlášku systému, že adresář nebyl nalezen. Jak je to prosté. O trochu složitější pak bude následující podmínková konstrukce, která nám již nějaký výstup
zprostředkuje: www.linuxzone.cz strana 136 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
if cd zkouska
then
echo "Adresar zmenen."
else
echo "Chyba - adresar nebyl nalezen."
fi
Podobně, jako v předchozím případě, také zde nám skript po svém spuštění vypíše na obrazovku
hlášku "Adresář změněn.", když dojde k přejití do podadresáře zkouska. Pokud však tento adresář
nebude nalezen, vypíše se nám chybová hláška systému a text "Chyba ­ adresář nebyl nalezen.". Abychom si to však ještě trochu ztížili, přidáme další větev, které bude vévodit naše avizované
elif: if cd zkouska
then
echo "Adresar zmenen."
elif cd /home/martin
then
echo "Jsi doma."
else
echo "Chyba - adresar nebyl nalezen."
fi
V tomto případě jsme přidali konstrukci, která při neúspěšném provedení příkazu "cd zkouska"
zajistí provedení příkazu "cd /home/martin". Podle výsledku této procedury se pak rozhodne o
koncové akci. Možné výstupy jsou tedy tři: •
•
•
"Adresář změněn." ­ pokud se přepneme do adresáře zkouska "Jsi doma." ­ pokud se přepneme do domovského adresáře "Chyba ­ adresář nebyl nalezen." ­ pokud žádný z uvedených adresářů neexistuje nebo není
přístupný z dané pozice Příka z test
Nyní navážeme na problematiku podmínkových konstrukcí příkazového interpretu BASH a budeme
se zabývat příkazem test, který se v podmínkách skriptů velmi často vyskytuje a jehož dobrá
znalost použití je pro psaní vlastních skriptů nezbytná ­ právě tento příkaz se totiž v podmínkových
konstrukcích používá asi nejčastěji. Povíme si, jak testovat vlastnosti a atributy souborů a vše si
předvedeme na řadě praktických ukázek. Již umíme používat konstrukce podmínkových příkazů a jejich větvení. Dnes naše znalosti
obohatíme o testování souborů a adresářů pomocí příkazu test. Právě tento příkaz se totiž v
podmínkových konstrukcích používá asi nejčastěji. Než přejdeme k popisu jeho činnosti,
předvedeme si drobný příklad. www.linuxzone.cz strana 137 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
if test -d home
then
cd home
else
echo "home není adresar... :-/"
fi
Příkazem test s parametrem -d zjistíte, zda analyzovaný soubor je adresářovým souborem. Nebo
abych byl přesnější ­ návratová hodnota příkazu bude 0, pokud uvedený argument je adresářem.
Můžeme tedy tento příkaz využít pro zjištění vlastností souboru či adresáře. Pokud nás zajímá, zda je testovaný argument klasickým souborem, využijeme k tomu parametr -f.
Když chceme testovat, je­li argument symbolickým odkazem, máme k dispozici parametr -L. Tím jsme tedy vyčerpali seznam voleb, které slouží k rozlišení typů souborů. Avšak tím možnosti
příkazu test nekončí. Můžeme jej využít i k otestování práv ­ volba -x prověří, zda má daný
uživatel právo na spuštění souboru, volba -r nás zase informuje o tom, jestli můžeme soubor číst a
volbou -w prověříme, zda máme právo na zápis do souboru. Tedy například: if test -w /etc/shadow
then
echo "Enjoy :-)"
else
echo "Sem samozrejme pristup nemate."
fi
Máme k dispozici ale i řadu dalších voleb. Často využívanou je například -s, která nám sdělí, jestli
má soubor nenulovou délku (tedy hodnota true, tj. 0, bude vrácena v případě, že soubor není
prázdný). Můžeme využít i volbu -e, která nás zase informuje pouze o existenci souboru, nezávisle
na jeho obsahu ­ pokud je tedy soubor prázdný, bude podmínka splněna a interpret nám vrátí
hodnotu 0 (stejně jako v případě, že soubor prázdný není). To ale stále není všechno. Můžeme jednotlivé podmínky spojovat ­ slouží k tomu volby -a, která
symbolicky zastupuje AND a znamená, že musí být splněny všechny podmínky (respektive
podmínka na levé i pravé straně výrazu) a volba -o, která logicky zastupuje OR a vyjadřuje, že
podmínka bude splněna, pokud bude vyhovovat alespoň jedna z možností. Pro názornost si uveďme
příklad: Chceme zjistit, jestli soubor nic.txt existuje a má nulovou délku. Využijeme k tomu volby -e a
negovanou volbu -s. Ano, volby můžeme i negovat. Jednoduše jim předřadíme vykřičník, čímž
změníme jejich "polaritu". V praxi to tedy bude vypadat následovně: if test -e nic.txt -a ! -s nic.txt
then
echo "Soubor existuje, ale ma nulovou delku\!"
www.linuxzone.cz strana 138 / 159
Impossible: Linux Mission 1.0
else
fi
8. Grafické rozhraní X Window System
echo "Soubor neexistuje nebo neni prazdny\!"
Jak je to snadné... Ale může to být ještě snazší. Konstrukci příkazu test totiž můžeme efektivně
nahradit hranatými závorkami. Tato možnost se využívá velmi často, protože usnadňuje orientaci v
kódu a zvyšuje jeho přehlednost. Navíc ušetříme dva stisky kláves, což už přece jenom stojí za
to. ;­) Když se tedy rozhodneme přepsat výše uvedený příklad do této formy, získáme následující podobu: if [ -e nic.txt -a ! -s nic.txt ]
then
echo "Soubor existuje, ale ma nulovou delku\!"
else
echo "Soubor neexistuje nebo neni prazdny\!"
fi
Tolik tedy k příkazu test a jeho použití. Shrňme si ještě v tabulce nejčastěji používané volby,
které nám tento příkaz nabízí. Upozorňuji, že jejich výčet není zdaleka úplný. Test je
plnohodnotným příkazem Unixu, takže jeho uplatnění je velmi široké. Pro podrobný popis tohoto
příkazu si prostudujte jeho manuálovou stránku, nebo ještě lépe ­ info stránku. Volba Význam
a
Zastupuje AND ­ musí být splněny podmínky na obou
stranách
d
Identifikuje adresář
e
Zjistí, zda soubor existuje (nezkoumá jeho délku)
f
Zjistí, zda se jedná o běžný soubor
L
Zjistí, zda se jedná o symbolický odkaz
o
Zastupuje OR ­ musí být splněna alespoň jedna podmínka
r
Zjistí, zda má uživatel právo na čtení souboru
s
Zjistí, zda soubor existuje a má nenulovou hodnotu
w
Zjistí, zda má uživatel právo na zápis do souboru
x
Zjistí, zda má uživatel právo na spuštění souboru
www.linuxzone.cz strana 139 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Podmínky a větvení ­ př íkaz case
Nyní už umíme otestovat téměř vše :­), takže se můžeme podívat, jak podmínky využít při větvění
programového kódu pomocí příkazu case a také na práci s cykly. Tento příkaz vlastně není ničím jiným než zjednodušeným zápisem podmínkové konstrukce if then - else. Používáme jej tam, kde se interpret rozhoduje mezi větším počtem možností.
Ukážeme si pro ilustraci jednoduchý příklad: ZVIRE=pes
case $ZVIRE in
kocka)
echo "Kocky mam rad na smetane."
;;
kralik)
echo "Kralik na smetane chutna stejne, jako kocka."
;;
pes)
echo "Pes je nejlepsi s knedlikama."
;;
*)
echo "Tak tohle jsem jeste nejedl."
;;
esac
Jestliže tento skript spustíme, výstupem bude "Pes je nejlepsi s knedlikama.". Jak vidíme, každá
takováto konstrukce je uvozena nějakým prvotním přiřazením. Následně zkoumáme toto přiřazení a
na základě vyhodnocení podmínky získáme výsledný výstup. Pokud žádná z uvedených podmínek
nevyhovuje, provede se větev s hvězdičkou. Celou konstrukci pak ukončíme slovíčkem esac (pro
ty, kteří pomaleji chápou ­ řada konstrukcí při psaní skriptů se ukončuje uvozujícím slovíčkem
napsaným pozpátku, viz např. if - fi. Totéž platí i u case - esac). To však stále není všechno. Příkaz case totiž umožňuje ve výčtu porovnávaných výrazů uvést
paralelně více podmínek pro jednu možnost. Aby to bylo srozumitelnější, ukážeme si opět jeden
příklad: PES=knirac
case $PES in
dobrman)
echo "BDSM obojek z nej dela zabijaka."
;;
www.linuxzone.cz strana 140 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
knirac|foxterier)
echo "Rad kroupe mysi."
;;
dalmatin)
echo "Viz Disney."
;;
*)
echo "To neznam... neni to kocka?"
;;
esac
Jestliže hodnota proměnné $PES bude knirac nebo foxterier, bude vždy provedena stejná
podmínka a vypíše se tedy stejný text ­ "Rad kroupe mysi." Stačí použít rouru a můžeme takto
oddělit libovolné množství výrazů, pro něž bude daná podmínka platit. Zkuste si teď sami vytvořit skript, který vytiskne větu "Perfektni serial" v případě, že hodnota
proměnné TV bude nastavena na simpsonovi nebo pratele. Jestliže bude hodnota této
proměnné nastavena na esmeralda, vytiskne se "To je ale blbost, FUJ!" (nezapomeňte na zvláštní
chování vykřičníku). V případě, že bude nastavena jiná hodnota, zobrazí se "To neznam, ale urcite
je to pekna blbost. Radsi sed u PC a uc se BASH." Cykly
A konečně příchazejí na řadu cykly... Co je to vlastně cyklus? Cykly slouží k opakovanému
provádění příkazu nebo sekvence příkazů. Toto opakované provádění je závislé na platnosti nebo
neplatnosti dané podmínky. V zásadě můžeme cykly rozdělit na dvě skupiny ­ s podmínkou na začátku a s podmínkou na konci.
Jestliže je podmínka uvedena na začátku, znamená to, že se její platnost ověří před samotným
provedením těla cyklu a jestliže podmínka nevyhovuje, cyklus se neprovede. Když ale máme
podmínku uvedenou až na konci cyklu, provede se tento cyklus logicky minimálně jednou, protože
interpret postupuje po jednotlivých řádcích kódu a než se dostane k podmínce, projde už jednou
celým cyklem. Teprve pak se rozhodne, zda se vrátí ještě na začátek cyklu a celý jeho obsah
provede ještě jednou nebo jestli bude pokračovat v provádění zbytku programu. Tímto dělením se
však nebudeme dále zabývat, neboť v BASHi nemá příliš velký význam. Cyklus for
Tento cyklus nachází své nejčastější uplatnění při práci se skupinou souborů. Tedy například ­
pokud chcete vytvořit zálohu všech souborů v nějakém adresáři v podobě soubor.zaloha, je
cyklus for ideálním prostředkem. Ukážeme si to hned na jednoduchém příkladu: www.linuxzone.cz strana 141 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
for soubor in *
do
cp $soubor $soubor.zaloha
done
V tomto případě je hvězdička postupně nahrazena jednotlivými názvy souborů z aktuálního
adresáře. Pro každý tento soubor je pak jednotlivě provedena akce, která je uvedena mezi klíčovými
slovy do - done. Cyklus while a until
Zatímco cyklus for prochází seznam jednotlivých položek, cyklus while, respektive until,
provádí zadanou akci, dokud platí příslušná podmínka. Kupříkladu můžeme chtít procházet
jednotlivé adresářové úrovně, v nichž se nachází adresář logy. Tedy například: while cd logy
do
pwd
done
Výpis pak bude následující: /etc/logy/
/etc/logy/logy/
/etc/logy/logy/ logy/
/etc/logy/logy/ logy/logy/
bash: logy: No such file or directory
Jestliže je návratová hodnota posledního příkazu v seznamu rovna nule, provede se akce, uzavřená
mezi klíčovými slovy do - done. Cyklus until funguje zcela analogicky, pouze s tím rozdílem, že cyklus je prováděn, dokud
návratová hodnota není rovna nule. Jak je to prosté, že... Cykly s pevně daným počtem opakování
Nejedná se o nic jiného, než předchozí cykly, se kterými se však pojí proměnná, která udává počet
jednotlivých provedení cyklu. Budeme například chtít vytvořit padesát adresářů se jménem pokus-xx, kde xx bude nahrazeno
číslicí od 01 do 50. Provedeme to následovně: POCET=0
while [ $POCET -ne 50 ]
do
www.linuxzone.cz strana 142 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
POCET=`expr $POCET + 1`
mkdir pokus-$POCET
done
Syntaxe příkazu i jeho použití je zřejmé. Jediným prvkem, který je zde nový, je přepínač -ne (not
equal). Ten symbolizuje, že daný cyklus se bude provádět, dokud se hodnota proměnné $POCET
nebude rovnat padesáti. Existují i další přepínače ­ ty shrnuje následující tabulka: Př epínač Význam
­eq
je rovno
­gt
je větší
­lt
je menší
­ge
je větší nebo rovno
­le
je menší nebo
rovno
Skupiny př íkazů
Příkazový interpret umožňuje seskupit několik jednotlivých příkazů do skupin příkazů. To nám
umožňuje zadat provedení většího množství příkazů najednou s tím, že jako návratový status
skupiny příkazů obdržíme návratový status posledního vykonaného příkazu ze skupiny příkazů. V
konečném důsledku to může vést k ovlivnění běžícího programu nebo například k zajištění
efektivního běhu programu na pozadí či v rámci vnořeného interpretu příkazů. Vnořený interpret příkazů je takový, který je spuštěn v rámci aktuálního interpretu příkazů. Přestože
dědí všechny vlastnosti aktuálního interpretu, změny, které ve vnořeném interpretu provedeme,
nemají vliv na aktuální interpret. Než si předvedeme nějaký ukázkový příklad, měl bych ještě zmínit, že BASH nám pro uzavření
příkazů do skupiny umožňuje použít jak složené, tak kulaté závorky. Pokud zvolíme závorky
složené, docílíme toho, že jednotlivé příkazy budou prováděny v rámci aktuálního interpretu
příkazů ­ budou tedy jen uzavřeny do jednoho celku. Pokud se rozhodneme pro závorky kulaté,
budou příkazy provedeny v rámci vnořeného interpretu, takže budou uzavřeny do jednoho celku a
navíc jejich chování nebude mít vliv na aktuální interpret. A teď už přejděme k jednoduchému příkladu, ať si vše předvedeme v praxi. Nejdříve si vytvořte
adresář "adresar", se kterým budete dále pracovat. Nyní jako první proveďte tuto skupinu příkazů: ( cd adresar; pwd ); pwd
www.linuxzone.cz strana 143 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Následně vyzkoušejte: { cd adresar; pwd }; pwd
Měli byste vidět jeden zásadní rozdíl. Pokud jste se před zahájením běhu skriptu nacházeli například
v adresáři /home/allah, po spuštění první konstrukce byste měli obdržet následující výpis: /home/allah/adresar
/home/allah
Zatímco po spuštění druhé konstrukce by výstup vypadal následovně: /home/allah/adresar
/home/allah/adresar
Vidíme tedy rozdíl mezi prací s aktuálním a vnořeným interpretem příkazů v praxi. Je to prosté. Jaké má však celá věc využití v praxi? Něco málo jsem už naznačil. Avšak využití
těchto konstrukcí je mnohem širší. Často se například setkáváme s možností spuštění skupiny
příkazů na pozadí. To se hodí zejména při práci s dlouhotrvajícími automatizovanými programy.
Podívejme se na jednoduchý příklad: ( cd /home/allah; for mesita in `find . -type d -print`;\
do ls -laF $mesita >> /home/buddha/allah-info.txt; done ) 2> /dev/null &
Na první pohled se může zdát celá skupina mírně nepřehledná, ale už na druhý pohled názor jistě
změníte. Všimněte si především, že jsem použil kulaté závorky, abych nezatěžoval svůj aktuální
interpret a předal tak veškerou činnost vnořenému interpretu příkazů. Když je skupina příkazů
přesunuta na pozadí, získá interpret příkazů ihned návratový kód nula. Možnosti zjednodušení ­ aliasyfunkce
Ne vždy se nám zrovna chce psát rozsáhlejší skupiny příkazů. Z tohoto důvodu nabízí Unixy jedno
velké zjednodušení, které čtenářům tohoto seriálu nebudu ani příliš podrobně představovat ­ jedná
se o aliasy. Ty umožňují přiřadit jednomu slovu nebo příkazu vlastnosti jiného příkazu či právě
skupiny příkazů. Tyto aliasy se ukládají mj. do souboru .bashrc. Pro ilustraci uvedu jeden z nich, který najde své
uplatnění mezi těmi, kteří na svém PC využívají dual­boot: alias cecko="mount /dev/hda1 /mnt/cecko"
www.linuxzone.cz strana 144 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Když nyní na příkazovém řádku napíšeme cecko, provede se ve skutečnosti příkaz mount /
dev/hda1 /mnt/cecko a připojí se tak disk C z MS Windows (pokud je samozřejmě umístěn
na /dev/hda1 ­ což ovšem dosti často bývá). Samozřejmě tento příkaz může použít pouze
uživatel root. Ostatní se budou moci spokojit pouze s daty z fstab, takže mohou napsat například
alias cecko="mount /mnt/cecko", pokud je /mnt/cecko ve fstab definováno. Aliasy jsou jistě srozumitelné každému, kdo s Linuxem, resp.Unixy obecně, pracuje déle než týden.
Poněkud náročnější, jsou ale funkce. Funkce
Syntaxe funkcí je o něco málo složitější než je tomu v případě aliasů. Avšak jejich upotřebení je
mnohem efektivnější. Umožňují totiž zpracovávat argumenty příkazu zapsané na příkazové řádce a
dokáží vracet návratové hodnoty programům, které je zavolaly. Předvedeme si jednu velmi
oblíbenou funkci, na kterou můžete často narazit: function apath
{
[ -d $1 ] && export PATH=$1:$PATH
}
Slovíčko function předchází názvu funkce, kterou definuje. Za tímto názvem pak následuje
složená závorka ­ z čehož plyne, že funkce bude provedena v rámci aktuálního interpretu a změny,
které budou provedeny, přetrvají i po jejím ukončení. Výraz $1 zastupuje první parametr uvedený
na příkazovém řádku (další parametr by byl uložen v proměnné $2, apod.). Celá uvedená funkce závisí na jednom parametru ­ jménu zadaného adresáře. Pokud tento adresář
existuje ­ což testuje konstrukce [ -d $1 ] (viz příkaz test) ­ bude přidán k obsahu proměnné
PATH. Jak prosté. Ještě bych měl zmínit, že běh funkce končí ve chvíli dosažení ukončovací složené závorky anebo
při provedení příkazu return, který do těla funkce můžeme začlenit. V tom případě bude
návratová hodnota funkce odpovídat návratové hodnotě naposledy provedeného příkazu ­ avšak
můžeme návratovou hodnotu také explicitně definovat, například return 0, apod. Jestliže se
rozhodneme pro explicitní definici, bude mít vyšší prioritu než skutečná hodnota a bude tedy
navrácena místo ní. Štábní kultura
Při psaní skriptů shellu by se měla dodržovat určitá "štábní kultura", tedy soubor typografických
pravidel, která mají zajistit, že se ve vašem skriptu vyzná i někdo jiný než vy. To je samozřejmě
důležité zejména při psaní Open Source / Free Software programů, kdy do zdrojových kódů
nahlížejí mnohdy třeba i desetitisíce lidí z celého světa. www.linuxzone.cz strana 145 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
Základem všeho jsou komentáře. Ve skriptech je uvozuje znak #, tedy "křížek". Vše, co následuje
na daném řádku za tímto křížkem, bude interpretem ignorováno. Je vhodné používat komentáře na
začátku každého skriptu ­ sem se hodí napsat k čemu příslušný skript slouží. Pak je také vhodné
komentovat každou složitější konstrukci, aby nikdo nemusel složitě pátrat, co která část programu
vlastně dělá. Další důležitou věcí je odsazování vnořených struktur. Pokud píšeme cykly nebo podmínky, neměli
bychom zapomínat, že jejich tělo je oproti podmínce odsazeno vždy alespoň (nejlépe) o dvě mezery.
Tato hodnota je empiricky ověřena jako nejvhodnější a je lepší než použití tabulátoru, který je v
různých editorech interpretován odlišně a zabírá zbytečně mnoho místa. Související části zdrojového kódu by měli patřit k sobě a jednotlivé celky by měly být vzájemně
odděleny prázdným řádkem. Zvýší se tak přehlednost zdrojového kódu. Tato pravidla platí samozřejmě nejen pro psaní skriptů v BASHi, ale při jakémkoliv programování.
Snažte se je proto dodržovat. Kdo nezvládne "štábní kulturu", ten nezvládl programování. Předveďme si dva malé ukázkové příklady. Rozhodněte sami, který z nich je asi ten lepší. :­) #!/bin/bash
select JIDLO in kure husa kachna pes fazole
do
if [ $JIDLO = "pes" ]
then
echo "NO FUJ\!"
break
fi
echo "Hmmm... taky bych si dal."
done
A teď druhá verze...
#!/bin/bash
# Tento skript zkouma vase psychopatologicke sklony,
# ktere jsou zavisle na vasi oblibene strave.
# Autorem je MUDr. Johnny Tux, DrSc. - [email protected]
select JIDLO in kure husa kachna pes fazole
do
# zkoumani sklonu k tyrani pejsku a kocicek
if [ $JIDLO = "pes" ]
then
echo "NO FUJ\!"
break
fi
echo "Hmmm... taky bych si dal."
www.linuxzone.cz strana 146 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
done
# ---=== EOF ===---
Interaktivní výběr
Výše uvedeným příkladem se dostáváme zároveň k další užitečné věci ­ interaktivnímu výběru z
nabídnutých možností. Slouží k tomu konstrukce select-do-done. Do určité míry je syntaxe
této konstrukce shodná s příkazem case. Výše uvedený příklad asi jasně demonstruje, jak vlastně
funguje. Speciální proměnné
Velmi užitečnou věcičkou jsou speciální proměnné, které BASH využívá. O některých jsme si už
povídali a dnes se zaměříme na podrobnější rozbor dvou takových proměnných. Jsou jimi $@ a $#. Do proměnné # se ukládá počet argumentů na řádce. Proměnná @ pak obsahuje všechny tyto
parametry oddělené mezerou (správně bych měl říci, že oddělovacím znakem je první znak
proměnné IFS (inter­field­separator), ale to je standardně právě mezera, takže se tím nebudeme dále
zabývat). Ukážeme si opět jednoduchý příklad: #!/bin/bash
# Ukazkovy skript. :-)
echo
echo
echo
echo
"Tento skript se jmenuje $0."
"Pri spusteni mu bylo zadano $# parametru:"
$@
"$1 $2 $3 $4 $5 $6 $7 $8 $9 $10"
# EOF
V uvedeném příkladu využíváme jak výše uvedené proměnné, tak i proměnné, reprezentující
jednotlivé poziční parametry, tedy 0­9. První taková proměnná ­ $0 obsahuje první parametr na
příkazové řádce, tedy zřejmě název skriptu ­ například ./skript.sh. Proměnné $1­$9 obsahují
jednotlivé další parametry z příkazové řádky. Jak ale vidíte, využili jsme v příkladu i proměnnou $10. Vyzkoušejte jak bude interpretována,
pokud zadáte na příkazovou řádku skutečně deset parametrů. Nebudu vás napínat. Výstupem bude
nesmysl ­ obsah proměnné $1 následovaný číslicí 0. Jak to tedy napravit? Nebojte se, není to zase
tak těžké. Stačí namísto $1 zapsat ${10} Alternatvině také můžeme použít šikovný příkaz shift,
který každou proměnnou přečísluje. Ukážeme si předchozí příklad ve variantě pro patnáct
argumentů s použitím příkazu shift. www.linuxzone.cz strana 147 / 159
Impossible: Linux Mission 1.0
8. Grafické rozhraní X Window System
#!/bin/bash
# Ukazkovy skript - v.2. :-)
echo "Tento skript se jmenuje $0."
echo "Pri spusteni mu bylo zadano $# parametru:"
echo $@
echo "$1 $2 $3 $4 $5 $6 $7 $8 $9"
shift 6
echo "$4 $5 $6 $7 $8 $9"
# EOF
Teď se tedy každá poziční proměnná počínaje parametrem číslo 7 a výše přečísluje tak, že se ocitne
na pozici o 6 nižší. Takže z proměnné číslo číslo deset bude proměnná číslo čtyři, z jedenáctky
pětka a podobně. Tímto příkladem náš tutoriál programování interpretu BASH ukončíme. www.linuxzone.cz strana 148 / 159
Impossible: Linux Mission 1.0
10. Tip: Pracujeme se skenery
10. Tip: Pracujeme se skenery
Chystáte se pořídit si ke svému linuxovému desktopu skener? Problematice skenování jsme se již
jednou věnovali, tentokrát se pro změnu podíváme na možnosti využití USB skenerů ­ řeč bude
konkrétně o skenerech Epson, které jsou pod Linuxem velmi dobře podporovány. Úvodem si řekneme pár slov o architektuře rozhraní SANE, potom projdeme postup zprovoznění
USB skeneru s důrazem na skenery Epson a nakonec si představíme některé aplikace, bez kterých
se při skenování neobejdeme, včetně nástroje Image Scan!, který je určen speciálně pro skenery
Epson. Původní článek věnovaný problematice skenování pod Linuxem, který popisuje zprovoznění
SCSI skeneru pod Linuxem najdete zde. Rozhraní SANE a TWAIN
Protože výrobci skenerů používají řadu proprietárních protokolů, aplikace obvykle nepracují se
skenery přímo, ale používají standardizované aplikační rozhraní. Výrobce skeneru pak ke svému
produktu obvykle dodává ovladače, které určité rozhraní podporují. Běžně se setkáme se dvěma
API, jedním je TWAIN, které je běžné v prostředí MS Windows, naopak pod Linuxem se používá
téměř výhradně rozhraní SANE. SANE (z angl. Scanner Access Now Easy) tedy definuje jednotné aplikační rozhraní (API), přes
které aplikace se skenery (a nejen skenery, také případně také kamerami apod.) pod Linuxem a
řadou dalších (nejen UN*Xových) systémů pracují. Detailní specifikace rozraní je k dispozici na
domovské stránce projektu SANE (http://www.mostang.com/sane). Naopak na platformách
Microsoft Windows či Apple dominuje rozhraní TWAIN a tato dvě rozhraní jsou zcela rozdílná.
Autoři SANE toto API vytvářeli s tím, aby toto rozhraní snadno umožňovalo přistupovat k
zařízením i přes síť, s čímž architektura TWAINu nepočítá. Existují ale projekty WinSANE a SaneTWAIN, které skenery připojené k Linuxovým systémům
zpřístupňují na počítačích s Microsoft Windows (WinSANE či SaneTWAIN pak vystupuje jako
TWAIN kompatibilní ovladač a i na počítačích s Microsoft Windows je pak možné používat
obvyklé TWAIN kompatibilní aplikace; nemohu se zde ale vyjádřit ke kvalitě těchto nástrojů,
protože s těmito platformami nepracuji ­ pokud máte někdo zkušenosti, můžete je napsat do diskuse
pod článkem.) Architektura SANE
SANE rozlišuje mezi "frontendem" a "backendem". Frontend nebo klient je jakákoliv aplikace,
které prostřednictvím SANE API přistupuje ke skeneru. Součástí distribuce SANE je např. utilita
scanimage (určená pro příkazovou řádku) nebo xsane (grafický klient pro X Window System),
ale také démon saned, který zpřístupňuje skener po síti. www.linuxzone.cz strana 149 / 159
Impossible: Linux Mission 1.0
10. Tip: Pracujeme se skenery
SANE backend je ovladač, který komunikuje na jedné straně s aplikací (frontendem či klientem), na
straně druhé přímo ovládá dané zařízení a stará se o přenos a konverzi dat. Backend (ovladač)
obvykle obsahuje podporu pro více příbuzných modelů, např. SCSI skenery UMAX jsou
podporovány ovladačem sane-umax, většina skenerů Epson (SCSI, USB i s paralelním
rozhraním) je podporována ovladačem sane-epson apod. Některé ovladače (backendy)
nekomunikují se vstupními zařízení přímo ­ např. sane-v4l může komunikovat prostřednictvím
rozhraní Video4Linux s kamerou, ovladač sane-net umožňuje přistupovat prostřednictvím sítě
ke skenerům připojeným k okolním počítačům (na kterých běží saned). Jak to může vypadat,
ukazuje následující schéma: počítač 1
počítač 2
+--------------------------------+
+----------------------------+
|
|
|
|
|
xsane (SANE klient)
|
|
xsane (SANE klient)
|
|
|
|
|
|
|
|
|
| síť |
|
|
|
sane-epson ------- saned <----------> sane-net (libsane-net.so)|
| (libsane-epson.so)
|
|
SANE backend
|
|
SANE backend
|
|
|
|
|
|
|
|
+--------|-----------------------+
+----------------------------+
|
skener
Podporované skenery
Pod Linuxem lze provozovat skenery s rozhraním SCSI (toto rozhraní je rychlé, nicméně od SCSI
rozhraní se upouští a dnes jsou v SCSI provedení dostupné pouze dražší modely skenerů), skenery
komunikující přes paralelní port (také od něj se upouští, navíc nevýhodou je pomalost rozhraní)
nebo rozhraním USB (většina dnes dostupných skenerů), ale také třeba s rozhraním IEEE­1394
(FireWire): Přehledné seznamy skenerů podporovaných pod Linuxem jsou k dispozici rovněž na stránkách
projektu SANE (viz také odkazy v závěru článku): •
•
•
sane­backend search ­ možnost vyhledávání podle modelu, listování podporovanými modely
skenerů... stránka věnovaná skenerům vybavených paralením portem stránka venovaná skenerům s rozhraním USB Před koupí skeneru bychom se rozhodně měli ujistit, že skener je skutečně pod Linuxem
podporován (je uveden na seznamu podporovaných skenerů, pozor ­ typ skeneru musí doslovně
souhlasit!) a případně dohledat konkrétní zkušenosti uživatelů v diskusních listech týkajících se
SANE nebo i jinde (groups.google.com). Bohužel rozšíření Linuxu na desktopu stále jěště není
velké, a tak zde uživatelé často narážejí na nezájem výrobců hardwaru podpořit nebo alespoň
umožnit vývoj potřebných ovladačů pro SANE, což ve svém důsledku významně redukuje možnost
www.linuxzone.cz strana 150 / 159
Impossible: Linux Mission 1.0
10. Tip: Pracujeme se skenery
uživatelova výběru. To ovšem neznamená, že by se dnes nedal vybrat skener dle vašich představ a
požadavků na kvalitu nebo i cenu, jenom je potřeba věnovat výběru skeneru větší pozoronost. Skenery Epson
Pokud předchozí odstavec vyzníval poněkud pesimisticky, mohu vás ujistit, že jsou mezi výrobci
skenerů i takoví, kteří v dostatečné míře umožňují nebo dokonce vývoj ovladačů pro Linux
podporují a snad nejlépe je na tom v tomto směru právě Epson. Jak je to tedy s podporou běžně dostupných USB skenerů Epson (detailní informace najdete na
seznamech podporovaných skenerů, viz také odkazy výše): •
•
•
1 většina USB skenerů Epson (např. modely Perfection 1240U/Photo, 1640SU, 1650/Photo,
1660/Photo, 2400/Photo, 2450/Photo) jsou podporovány backendem sane­epson. modely Perfection 1250/Photo a 1260/Photo ­ jsou podporovány backendem pro skenery
(Plustek) a také nástrojem (Image Scan!) Perfection 660 ­ tento model obsahuje čipovou sadu LM9832 a je podporován v rámci
projektu Snapscan (Snapscan). Zprovoznění USB skeneru
Zprovoznění podporovaného USB skeneru nepředstavuje žádný zásadní problém, po připojení
skeneru k USB portu by se měl objevit v seznamu připojených USB zařízení v souboru /
proc/bus/usb/devices a také bychom jej měli vidět v "Prohlížeči hardware", s tím, že je mu
přiřazen ovladač "scanner": Pokud se stane, že skener jako USB zařízení vidíme, ale nemá přiřazen ovladač "scanner", musíme
se sami postarat, aby systému explicitně aby tento ovladač použil. Nejprve si vyhledáme detailní
informace o skeneru ­ spustíme jako uživatel root /usr/sbin/kudzu -s -p a v části výstupu
týkající se skeneru vyhledáme položky "vendorId" a "deviceId", např.: class: OTHER
bus: USB
detached: 0
www.linuxzone.cz strana 151 / 159
Impossible: Linux Mission 1.0
10. Tip: Pracujeme se skenery
driver: scanner
desc: "Seiko Epson Corp. Perfection 2400 Photo"
usbclass: 0
usbsubclass: 0
usbprotocol: 0
usbbus: 1
usblevel: 1
usbport: 0
usbdev: 2
vendorId: 04b8
deviceId: 011b
usbmfr: EPSON
usbprod: EPSON Scanner
Nyní natáhneme modul scanner (příkazem /sbin/modprobe scanner) a předáme mu
identifikaci zařízení jako parametry, např. pro tento konkrétní model skeneru takto: modprobe scanner vendor=0x04b8 product=0x011b
Do budoucna si můžeme ušetřit práci zadáním parametrů do /etc/modules.conf. options scanner vendor=0x04b8 product=0x011b
Pokud vše funguje tak, jak má, uvidíme v systémovém logu podobné hlášení: hub.c: new USB device 00:07.2-1, assigned address 3
usb.c: USB device 3 (vend/prod 0x4b8/0x11b) is not claimed by any active \
driver.usb.c: registered new driver usbscanner
scanner.c: USB scanner device (0x04b8/0x011b) now attached to scanner0
scanner.c: 0.4.13:USB Scanner Driver
Pokud narazíte při zprovozňování USB zařízení na problémy, dobrým zdrojem informací je již
zmiňovaná dokumentace na stránkách www.linux­usb.org. Nyní je tedy skener systémem rozpoznán a zbývá ještě nakonfigurovat sane. Konfigurace SANE je
uložena v adresáři /etc/sane.d/. Soubor dll.conf obsahuje seznam ovladačů, které jsou k
dispozici. Adresář dále obsahuje konfigurační soubory jednotlivých ovladačů ­ nás bude zajímat
soubor epson.conf, který obsahuje konfiguraci ovladače sane-epson. Nám postačí pouze
přidat řádek: usb /dev/usb/scanner0
Funkčnost sane si z příkazové řádky ověříme pomocí nástroje scanimage: $ scanimage -L
device `epson:/dev/usb/scanner0' is a Epson GT-9300 flatbed scanner
www.linuxzone.cz strana 152 / 159
Impossible: Linux Mission 1.0
10. Tip: Pracujeme se skenery
Aplikace
scanimage ­ nástroj pro př íkazovou ř ádku
Součástí distribuce sane je utilita scanimage. Jedná se o nástroj pro příkazovou řádku, který ale
zpřístupňuje všechny funkce a nastavení, které ovladače jednotlivých typů skenerů nabízejí a
samozřejmě také umí přistupovat k skenerů přes síť, pokud to konfigurace umožňuje. Spustíme­li jej
s parametrem --help, získáme nápovědu a pokud spolu s --help zadáme volbou -d zařízení,
vypíše také všechna možná nastavení pro daný typ skeneru. Skenovaný obrázek pak scanimage
posílá na standardní výstup. Podporuje výstup ve formátech PNM a TIFF. $ scanimage -d net:vanvancito:epson:/dev/usb/scanner0 \
-x 100mm -y 100mm --resolution 600 --format tiff --mode color \
--depth 8 --verbose > test.tiff
scanimage: scanning image of size 2360x2362 pixels at 24 bits/pixel
scanimage: acquiring RGB frame
Pro ilustraci tento příkaz oskenuje v barvě čtverec rozměru 10 x 10 cm z pravého horního rohu v
rozlišení 600 dpi, přes síť ze skeneru připojeného k hostiteli "vanvancito" a uloží obrázek ve
formátu tiff do souboru test.tiff: xsane
Toto je nejvíce používané GUI nástroj pro skenování pod Linuxem. Můžeme jej používat jako
samostatnou aplikaci, ale funguje i jako zásuvný modul pro Gimp. (Pak se v menu "Soubor" objeví
položka "Získat", přes kterou xsane plugin spustíme. Xsane obsahuje vše, co bychom od takového
software očekávali: získání náhledu, možnost manipulace s řadou parametrů (jas, kontrast, gamma
korekce atd.), obrázky ukládá ve formátech jpeg, png, pnm, ps, raw a tiff. Pokud máme k počítači
připojenou tiskárnu, můžeme xsane použít v režimu kopírování nebo také jako fax, máme­li fax
modem. Ovládání je poměrně snadné. www.linuxzone.cz strana 153 / 159
Impossible: Linux Mission 1.0
10. Tip: Pracujeme se skenery
Image Scan! ­ software pro skenery Epson
Pro skenery Epson je také k dispozici software přímo od výrobce (viz odkazy ke stažení v závěru
kapitoly). Image Scan! (z příkazové řádky spouštěn jako iscan) je GUI nástroj s poměrně
jednoduchým rozhraním, nicméně je vysoce funkční. Uživatele zejména potěší to, že je vystavěn na
obdobných algoritmech jako obslužný software dodávaný pro platformu Microsoft Windows a i
když na první pohled nenabízí tolik možností jako xsane, je stabilní a také díky přednastavení
parametrů výrobcem pro jednotlivé modely skenerů dává velmi dobré výsledky. Může fungovat
také jako zásuvný modul Gimpu (obdobně jako v případě xsane stačí doplnit symbolický odkaz do
adresáře s pluginy Gimpu). Obrázky umí ukládat ve formátech PNM a PNG, pokud máte tiskárnu
Epson, můžete také využít linuxový software pro tyto tiskárny rovněž z dílny Epsonu ­ Photo Image
Print System pro kvalitní tisk ve foto kvalitě. www.linuxzone.cz strana 154 / 159
Impossible: Linux Mission 1.0
10. Tip: Pracujeme se skenery
Skenování z negativu
Pokud jde o skenování z negativu / pozitivu, můžeme použít jak xsane, tak Image Scan!. Skenování
je ale mnohem snazší s Image Scanem. Xsane sice obsahuje přednastavené parametry pro některé
druhy filmů, ale bez dalších úprav naskenovaných obrázků v Gimpu se většinou neobejdeme.
Naproti tomu autokorekční algoritmy iscanu dávají velmi slušné výsledky alespoň pokud jsem měl
možnost posoudit jak při skenování z negativu na filmech Agfa, Kodak a Konica, tak i při
skenování z pozitivu. www.linuxzone.cz strana 155 / 159
Impossible: Linux Mission 1.0
10. Tip: Pracujeme se skenery
Skener v síti
Sdílení skenerů je jednoduchá. Na straně serveru, ke kterému je připojen skener je potřeba
nakonfigurovat démon saned. Nejprve založíme uživatele a skupinu saned, pod kterou saned
poběží (z bezp. důvodů není rozumné nechat saned běžet pod uživatelem root) a upravíme
přístupová práva ke skeneru tak, aby jej uživatel saned směl používat. Saned používá konfigurační
soubor saned.conf, který obsahuje seznam strojů, ze kterých bude akceptovat spojení. Protože je
ale spouštěn prostřednictvím démona xinetd a Linuxové distribuce zpravidla obsahují
tcp_wrapper, postačí do souboru saned.conf zapsat jediný znak "+" ­ což znamená, že saned
bude akceptovat spojení odevšad. Vlastní kontrolu přístupu k skeneru pak na serveru upravíme v
souborech /etc/hosts.deny a /etc/hosts.allow, které nabízejí mocnější syntaxi (viz
dokumentace tcp_wrapper, např. manová stránka hosts.allow a tcpd). Dále pak musíme
upravit konfiguraci xinetd a definovat zde službu sane: # soubor /etc/xinetd.d/sane
#
# default: on
# description: saned scanner service
service sane
{
flags
= REUSE
socket_type
= stream
wait
= no
user
= saned.saned
www.linuxzone.cz strana 156 / 159
Impossible: Linux Mission 1.0
server
log_on_failure
disable
}
10. Tip: Pracujeme se skenery
= /usr/sbin/saned
+= USERID
= no
Na obou počítačích pak musíme službu zanést do souboru /etc/services, který obsahuje
seznam běžně používaných síťových služeb a jim přiřazených čísel portů. Do /etc/services
přidáme následující řádek: sane 6566/tcp # SANE network scanner daemon
Na klientském počítači se ještě ujistíme, že je v konfiguračním souboru sane dll.conf povoleno
použití síťového ovladače (řádek obsahující slovo "net" musí být odkomentován). Pokud jsme vše
správně nakonfigurovali, můžeme na klientském počítači spustit scanimage s nám již známou
vobou -L a ve výpisu dostupných zařízení by se měl skener připojený k serveru objevit: $ scanimage -L
device 'net:vanvancito:epson:/dev/usb/scanner0' \
is a Epson GT-9300 flatbed scanner
Když už jsme u toho síťování, existuje také projekt sane-cgi, který poskytuje webové rozhraní k
SANE. Závěrem...
Většina dnes běžně dostupných skenerů je dodávána s rozhraním USB, ovšem ne všechny USB
skenery je možné provozovat pod Linuxem. Skenery EPSON patří mezi ty dobře podporované (i
když i tady je vhodné si toto před koupí skeneru ověřit) ­ což je výsledkem solidního přístupu
výrobce k linuxové komunitě. Velkým plusem je v případě skenerů Epson dostupnost software
Image Scan!, který umožňuje i pod Linuxem zcela bezproblémové skenování i z transparentních
předloh. Při psaní tohoto textu jsem měl k dispozici skener Epson Perfection 2400 Photo a výsledný
dojem z tohoto skeneru a jeho využití pod Linuxem je velmi dobrý. Odkazy
Rozhraní SANE, TWAIN:
•
•
Domovská stránka SANE Domovská stránka TWAIN
Podporované skenery:
•
•
•
Skenery podporované SANE Skenery s paralelním portem
Skenery s rozhraním USB
www.linuxzone.cz strana 157 / 159
Impossible: Linux Mission 1.0
•
•
10. Tip: Pracujeme se skenery
Snapscan Ovladač ppSCSI
Obslužný software podporující SANE:
•
•
•
•
•
Xsane ­ aplikace pro X Window System (SANE) Image Scan! ­ software pro skenery Epson (SANE)
QuiteInsane ­ rozhraní SANE pro X11 na bázi Qt
Scan Lite ­ rozhraní SANE v Javě
Sanecgi ­ www rozhraní k SANE
Diskusní skupiny, další dokumentace:
•
•
•
•
•
Diskusní listy SANE Color management plug­in pro Gimp
SANE FAQ
Skenování negativů s Gimpem
Průvodce konfigurací USB zařízení pod Linuxem
Projekty stojící mimo SANE:
•
•
Projekt Primax (skenery nepodporované SANE) Projekt HPOJ ­ podporující HP OfficeJet
Software zajišťující kompatibilitu mezi SANE ­ TWAIN:
•
•
WinSANE SaneTWAIN
www.linuxzone.cz strana 158 / 159
Impossible: Linux Mission 1.0
11. Tip: pracujeme s digitálním fotoaparátem
11. Tip: pracujeme s digitálním fotoaparátem
Pro práci s digitálními fotoaparáty js k dispozici aplikace gtkam, která je přístupná z hlavího menu
přes položky "Grafika" ­> "Digital Camer Tool". Po spuštění se gtkam sám pokusí detekovat
připojené zařízení, alternativně můžeme prostřednictvím dialogu zařízení vybrat ručně. Jakmile je správně nastaveno zařízení, můžeme pomocí jednoduchého grafického rozhraní
prohlížet, stahovat nebo mazat uložené snímky. Gtkam podporuje standard EXIF, je tedy možné
také stáhnout i EXIF data s jednotlivými obrázky. Pro úpravu obrázků lze s výhodou použít kvalitní bitmapový editor Gimp, který je také s Mission
dodáván. www.linuxzone.cz strana 159 / 159

Podobné dokumenty

Příručka správce operačního systému Linux

Příručka správce operačního systému Linux Přesný seznam úloh, které init při zavádění dělá, závisí na verzi tohoto programu i operačního systému. Je na výběr několik možností. Proces init často obstarává tzv. jednouživatelský režim (angl. ...

Více

Softwarový RAID a LVM

Softwarový RAID a LVM již při instalaci GNU/Linuxu. Například v Aurox Linuxu postačí, pokud vybereme volbu Ruční vytvoření oddílů, pomocí programu Disk Druid budeme moci vytvořit RAID, LVM či dokonce LVM na RAID. V nově...

Více

Acronis® Disk Director® 12 User`s Guide

Acronis® Disk Director® 12 User`s Guide Přidání, odstranění nebo rozložení zrcadlených svazků* Základní nebo jednoduchý svazek lze změnit na svazek odolný proti chybám pouhou akcí přidání zrcadlení. Pokud na disku obsahujícím některé ze ...

Více

Jak použít Open Clipart Library ve školství, nám

Jak použít Open Clipart Library ve školství, nám je to betaverze a je docela možné, že až budete číst tyto řádky, bude k dispozici verze finální, zbavená těchto chyb. Momentálně však nelze program v této verzi doporučit do produkčního prostředí –...

Více

Nebezpečný Google – vyhledávání důvěrných

Nebezpečný Google – vyhledávání důvěrných žeb programu. Nejčastěji se k tomu používají skenery typu Nmap nebo amap, ale existuje ještě jedna možnost. Mnoho správců instaluje WWW servery, které za běhu generují statistiky o práci systému, i...

Více

Praktické návody HOWTO Emacs pro začátečníky

Praktické návody HOWTO Emacs pro začátečníky Pro naše účely však mějme za to, že Emacs je textový editor – a to editor velice flexibilní. Později se do tohoto problému ponoříme hlouběji. Emacs napsal Richard Stallman (zakladatel Free Soft-war...

Více

o Linuxu

o Linuxu tohle bude prepinat jazyk po zmacknuti obou SHIFTu nebo docasne pri zmacknuti praveho ALTu. Po zmene jazyka se jeste rozsviti LEDka Scroll Lock jako indikace - ja to celkem pouzivam. Ty prepinace s...

Více