Od zapnutí do promptu bash-e: Krátký popis toho,
co se stane v Linux systému na platformě Intel 386+ kompatibilních PC od
zapnutí napájení do doby přihlášení a výpisu promptu bash-e (nejobvyklejšího
Linux shell-u)
Pozn: Činnosti prováděné do vysokoúrovňové inicializační fáze (viz níže)
jsou specifické pro platformu Intel i386 kompatibilní a na jiných architekturách
se liší.
Základní kroky:
- BIOS vybere zaváděcí zařízení
- Ze zaváděcího zařízení BIOS zavede zaváděcí sektor (boot sektor)
- Boot sektor zavede spouštěcí a dekompresní rutiny a komprimované
jádro Linuxu
- Jádro je dekomprimováno (v chráněném - protected módu)
- Nízkoúrovňová (low-level) inicializace kódem v assembleru
- Vysokoúrovňová (high-level) inicializace kódem v C
- Spuštění procesu init
- odpověď na přihlašovací prompt getty předána úloze login, ten spustí
bash
Hardware:
Po zapnutí se počítač sám testuje - to se nazývá "Power On Self Test" neboli
POST. Běhen této fáze se detekuje HW, přidělují se zdroje PNP ISA a PCI zařízením,
detekují se disky a aktivují se BIOSy některých periferií: Video karta, řadiče
SCSI, ale i např. BOOT ROM síťové karty. Pak program zvaný bootstrap loader,
umístěný v ROM BIOSu, hledá boot sector. Boot sector je první sektor na disku
a obsahuje malý program, který může zavést operační systém. Boot sectory
jsou označeny "magickým číslem" 0xAA55 = 43603 na offsetu 0x1FE = 510. To
jsou poslední dva byte 512 B dlouhého sektoru. Touto značkou HW (disk) říká,
zda sektor je boot sektor nebo ne.
Bootstrap loader má seznam míst, kde hledá boot sektory. U moderních PC
je toto pořadí konfigurovatelné v SETUP programu BIOSu PC, typicky lze volit
mezi floppy disketou (-ami), pevným (-i) diskem, CD-ROM a případně ZIP mechanikou,
USB diskem a zavedením systému ze sítě např. Intel PXE protokolem. Pokud
bootstrap loader nalezne boot sektor, zavede jej do paměti a předá mu řízení.
Tento program pak zavede OS. Na typickém Linuxu sytému to bude první část
programu LILO (Linux LOader) nebo novějšího GRUB (GRand Unified Bootloader)
- viz např. "LILO", "Multiboot-with-LILO", "Multiboot-with-GRUB" mini-HOWTO.
Může to ale být i boot sektor Linuxového jádra - tato varianta se většinou
používá pouze při zavádění systému z diskety n. CD-ROM, protože použití specializovaného
zavaděče (LILO,GRUB) má několik výhod:
- Možnost výběru mezi různými Linuxovými jádry a/n. různými OS.
- Možnost předat jádru parametry na příkazové řádce (až 2 kB).
- Možnost počátečního RAM disku (initrd), takže jádro může být bez většiny
ovladačů.
- Možnost zavést větší komprimované (bzImage) jádro - až 2.5 MB oproti
1 MB.
- Možmost použít počáteční RAMdisk (initrd) pro zavedení potřebných obladačů
LILO/GRUB:
Když počítač zavede boot sektor na normálním Linux systému, to co zavede
je pouze část z LILO/GRUB zavaděčů zvaná "zavaděč první etapy" ("first stage
boot loader" to nazývají Amíci). Je to malý program jehož jediným úkolem
je zavedení a spuštění "zavaděče druhé etapy" ("second stage boot loader").
Dělení na dvě části je proto, že zaváděcí jeden sektor disku je malý na uchování
kódu celého zavaděče.
Zavaděč druhé etapy vypíše prompt (pokud tak byl nainstalován) a následně
zavede vybraný/implicitní operační systém. Pokud je jím Linux, zavede přímo
vybrané Linuxové jádro - obvykle soubor "/boot/vmlinuz-x.y.z", kde
x.y.z je verze jádra. "Z" na konci vmlinuz znamená, že soubor obrazu jádra
je komprimovaný /programem gzip/. LILO/GRUB také umožňují předat jádru "příkazový
řádek" - seznam parametů např. o počtu a konfiguraci řadičů a portů, APM,
rezervaci ISA PNP zdrojů (přerušení, DMA, I/O portů), zavedení počátečního
RAM disku s ovladači nutnými pro start systému, max. počtu používaných procesorů
u SMP systémů, umístění NFS souborového systému pro bezdiskové počítače,
co má jádro provést v případě detekce neobnovitelné chyby, umístění a způsob
připojení kořenového souborového systému (ro, rw), požadavek na start v
jednouživatelském (single-user) módu apod.
LILO příp. GRUB mají své konfigurační soubory na Linux filesystému, a sice
/etc/lilo.conf resp. /boot/grub/menu.lst (u RedHat distribucí
je /boot/grub/menu.lst symbolický link na /boot/grub/grub.conf).
Činnost LILO/GRUB zavaděče končí předáním řízení na tzv. "setup" rutinu
jádra. Ta připraví přechod na protected mód, dekomprimuje jádro a předá mu
řízení.
Po inicializaci registrů a kontrole typu procesoru následuje vysokoúrovňová
inicializace. Během ní se mj. provádí inicializace poplatné architektuře,
inicializace datových struktur, inicializuje se systémová konzole, podpora
dynamického zavádění modulů, počítá BogoMips, inicializace VFS (Virtual File
System), VM (Virtual Memory manager), vyrovnávací cache, IPC (InterProcess
Communication), quota (SubSystém limit a využití disků uživateli), provádí
se kontroly na chyby HW a dělají protiopatření (např. f00f chyba P5), připraví
se start plánovače "na příští chvíli", odstartuje vlákno (thread) pro start
procesu init a přejde do čekací smyčky (idle loop).
Jádro Linuxu - stručně řečeno, pomocí HW dělá to, co programy
potřebují a očekávají ke svému běhu, rychle a efektivně. Procesor může najednou
provádět pouze jednu instrukci, ale Linux systém se chová jako by prováděl
řadu věcí současně. Jádro to realizuje rychlým přepínáním a přidělováním procesoru
mezi úlohami. Interval tiku hodin a tím i nejmenší interval přepínání se
nazývá "jiffie" a je na i386+ systémech 1/100 sec (závisí na HW architektuře
- např. na procesorech Alpha je to 1/1024 sec.) Nejlepší využití procesoru
je dáno tím, že sleduje, co jaký program/proces provádí - který je připraven
k běhu a který na něco čeká; např. na vstup z klávesnice nebo zapsání/přečtení
záznamu z disku. Tato úloha jádra se nazývá plánování (scheduling). Pokud
program nic nedělá, pak není nutno, aby byl v RAM. A také program, který něco
dělá, může mít část/části, které nedělají nic. Adresní prostor každého procesu
je dělen do stránek. Jádro si udržuje informace o tom, které stránky kterých
procesů jsou nejvíce užívány. Stránky, které tak často užívány nejsou, mohou
být přesunuty do odkládací (swap) diskové oblasti. Jiné nepoužité stránky
mohou být vysunuty a udělají jim místo, když jsou opět potřeba v RAM. Tento
mechanismus se nazývá "správa virtuální paměti" (virtual memory management,
VM).
Jádro obsahuje ovladače (drivers) pro mnoho specifických zařízení. Jejich
ovládání prezentuje v jednotné formě aplikačním programům. Jádro také spravuje
systém souborů, interprocesové komunikace, a mnoho síťových věcí. Většina
konfigurace jádra je dána při jeho sestavení - je možné nastavit architekturu,
typ procesoru, podporované sběrnice, souborové systémy, periférie, APM, ACPI,
PNP, SW RAID, typy sítí a síťových protokolů a další.
GNU C knihovna:
Následující věc, která se stane s počítačem při startování je, že je zatažen
a spušten program init. Nicméně, program init, téměř jako všechny programy,
používá funkce z knihoven. Jádro tedy musí být schopno před startem programu
init potřebné knihovny zavést a připravit k použití, a to jak pro starý formát
spustitelných programů, tzv. a.out (Assembler OUTput), tak pro nový
ELF (Executable and Linking Format) formát. Nejznámější jsou standartní
C knihovny - na GNU/Linux systémech se nazývá glibc (Gnu LIBrary C).
Jsou v ní stovky standartních funkcí: matematické, práce s řetězci, datové/časové,
alokace paměti atd. Všechno v Unixu (a Linuxu) je psáno v jazyce C, takže
všechno užívá tyto funkce. Adresář "/usr/lib" obsahuje velké množství souborů
většinou pojmenovaných libněco.so nebo libněco.a atd. Jsou
to knihovny těchto funkcí. Glibc je jenom GNU implementace těchto funkcí.
Tyto knihovní funkce mohou programy použít dvěma způsoby. Jestliže je
program sestavován staticky, knihovní funce jsou kopírovány z knihoven lib
něco.a do vytvářeného spustitelného obrazu. Jestliže je program sestavován
dynamicky (což je náhradní hodnota), pak když je program spušten a potřebuje
knihovní kód, ten je volán ze souboru libněco.so.
Program ldd vypíše jaké sdílné knihovny daný program ke svému běhu potřebuje.
Například, zde jsou knihovny, které užívá program bash:
franta:~$ ldd /bin/bash
libtermcap.so.2 => /lib/libtermcap.so.2 (0x4002c000)
libdl.so.2 => /lib/libdl.so.2 (0x40030000)
libc.so.6 => /lib/libc.so.6 (0x40034000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Program init:
Většina linuxových systémů používá způsob "Systém V" inicializace. Obecně
jádro po dokončení svého zavedení a své inicializaci spustí program /sbin/init
. Úkolem init-u je, aby vše dále bylo správně spuštěno. Zařizuje připojení
("montování" - mount) a případnou kontrolu souborových systémů a swapovacích
oblastí, nastavení hodin, jména systému, startuje systémové démony, síťové
služby a procesy pro přihlášení do systémů (getty/mingetty/xdm). Základním
konfiguračním souborem programu init je /etc/inittab. Tento soubor
popisuje, které procesy jsou startovány během zavedení systému a během normalní
činnosti.
Init rozlišuje několik úrovní běhu (runlevel), každá úroveň může
mít svojí množinu procesů, které v ní jsou startovány. Platné úrovně běhu
jsou 0-6. Další povolené úrovně nejsou v systémech linux a unix využívány.
Položky v souboru inittab mají formát:
id:úrovně běhu:akce:proces
id - je jednoznačná posloupnost 1-4 znaků, která definuje položku
v inittab
úrovně běhu - je seznam úrovní pro ktere se bude provádět specifikovaná
akce.
akce popisuje, která akce bude prováděna:
respawn - pokud proces skončí, bude restartován (např. getty).
wait - proces bude nastartován jednou při vstupu do dané úrovně běhu
a init bude čekat na jeho ukončení.
once - proces bude spuštěn jednou při vstupu do dané úrovně běhu.
boot - proces bude spuštěn během zavádění systému, pole urovně běhu
je ignorováno.
bootwait - proces bude spuštěn během zavádění systému a i čeká na jeho
ukončení (/etc/rc).Pole úrovně běhu je ignorováno.
off - nedělá nic.
ondemand - proces označen ondemand úrovní běhu bude spušten kdykoli
je daná ondemand úrovně běhu (a,b,c) volána.
initdefault - specifikuje úroveň běhu, do které by měl systém vejít
po startu. Pole proces je ignorováno.
sysinit - proces bude prováděn během zavádění systému, ještě před položkami
boot nebo bootwait.
powerwait - proces byde spuštěn při výpadku napětí (init je o tom většinou
informován programen komunikujícím s UPS).Init bude čekat
na ukončení procesu.
powerfail - jako pro powerwait, ale init nečeká na ukončení procesu.
powerokwait - proces bude spuštěn, když je init informován o obnovení
napájení.
powerfailno - proces bude spuštěn, když se init dozví, že záložní baterie
na externí UPS jsou téměř vybité.
ctrlaltdel - proces bude spuštěn, když init přijme signál SIGINT -
typicky stiskem kombinace kláves ctrl-alt-del na systémové
konzoli
kbrequest - proces bude spuštěn, když init přijme signál od ovladače
konzolové klávesnice, že byla stisknutá speciální kombinace
kláves.
proces specifikuje prováděný proces. Ukončení spuštěného procesu
spolu s příčinou zastavení init zaznamenává do souborů /var/run/utmp
a /var/log/wtmp. Pokud ale pole procesu začíná znakem "+", init účtování
nebude zaznamenávat.
Příklad souboru /etc/inittab:
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
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
# Things to run in every runlevel.
ud::once:/sbin/update
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -h now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty --noclear tty1
2:2345:respawn:/sbin/mingetty --noclear tty2
# Run xdm/gdm/kdn in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon
Změna úrovně běhu
Poté co init spustil všechny specifikované procesy, čeká na ukončení některého
svého spuštěného procesu, na signál výpadku napájení nebo na signál úlohy
telinit ke změně úrovně běhu systému. Při výskytu jedné z těchto tří podmínek
znovu načítá soubor /etc/inittab.
Znovunačtení můžeme programu init vnutit příkazem telinit Q nebo q. Příkaz
telinit také může říci programu init, abych přepnul do jiné úrovně běhu.
Init pak vyšle signál SIGTERM všem procesům, které nejsou v nové úrovni běhu
definovány, pak čeká 5 vteřin (dobu možno změnit příkazem telinit) a pak
neukončené procesy zlikviduje signálem SIGKILL. V distribuci RedHat je
inicializační script soubor /etc/rc.d/rc.sysinit. Následně je volán
script, který spustí procesy pro defaultní úroveň běhu. Pro úrovně 0-6 existují
adresáře /etc/rc.d/rcN.d, kde N je 0-6. V nich jsou scripty s názvy
standartně ve tvaru SnnJméno_Služby a KnnJméno_Služby, kde nn je dvouciferné
číslo 00-99. Script /etc/rc.d/rc při změně úrovně běhu spustí všechny
KnnJméno_Služby scripty s parametrem stop a následně všechny scripty s SnnJméno_Služby
s parametrem start.
Poslední důležitá věc, kterou init provede, je start několika getty/mingetty
procesů. Jsou označeny akcí respawned, což znamená, že pokud z nějakého
důvodu skončí, inet je spustí znovu. Většina distribucí přichází s šesti
virtuálními terminály, jejich počet je možný zmenšit i zvětšit. Je také možné
mít textové terminály na sériových linkách nebo připojených modemech. Při
startu v grafickém režimu (run-level 5) je ještě spuštěn proces xdm
(X Display Manager), který provádí služby podobně jako getty a login na
znakových terminálech: vyzve uživatele k zadání jména a hesla, ověří jej
a spustí pro něj takzvaný "správce sezení" - session manager.
Při přechodu systému do úrovně běhu 1 (jednouživatelský mód) init spustí
rootův shell na zařízeni /dev/console, bez nutnosti zadání jména a hesla.
Systém souborů:
V tomto článku bude užito slovo souborový systém ve dvou různých významech.
Jako souborové systémy na diskových oblastech a jiných zařízeních a jako souborový
systém tak jak je prezentován běžícím linuxovým systémem. Na Linuxu se připojují
("montují" - viz povel mount) diskové souborové systémy do systémového souborového
systému. Při startu jádro připojí kořenový souborový systém v read-only modu.
Během startu je kořenový souborový systém zkontrolován programem fsck a následně
znovu připojen (remount) v read-write modu. Po připojení root-fs v read-write
módu jsou připojeny ostatní souborové systémy podle specifikace v /etc/fstab
.
Příklad souboru /etc/fstab :
LABEL=/ / ext3 defaults 1 1
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
LABEL=/var1 /var ext3 defaults 1 2
/dev/rd/c0d0p2 swap swap defaults 0 0
/SWAP swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
/dev/cdrom1 /mnt/cdrom1 iso9660 noauto,owner,kudzu,ro 0 0
/dev/hda1 /mnt/C vfat defaults 0 0
/dev/hda5 /mnt/D vfat defaults 0 0
Démoni jádra:
Příkaz "ps aux" vypíše něco podobného následujícímu:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.5 1384 368 ? S Mar20 0:03 init
root 2 0.0 0.0 0 0 ? SW Mar20 0:01 [keventd]
root 3 0.0 0.0 0 0 ? SWN Mar20 0:01 [ksoftirqd_CPU0]
root 4 0.0 0.0 0 0 ? SW Mar20 0:11 [kswapd]
root 5 0.0 0.0 0 0 ? SW Mar20 0:00 [bdflush]
root 6 0.0 0.0 0 0 ? SW Mar20 0:00 [kupdated]
root 467 0.0 0.0 0 0 ? SW Mar20 0:00 [eth1]
root 551 0.0 0.6 1444 408 ? S Mar20 0:00 syslogd -r -x
root 556 0.0 0.5 2056 344 ? S Mar20 0:01 klogd -2
root 818 0.0 0.6 1612 408 ? S Mar20 0:00 crond
root 901 0.0 0.6 5156 412 tty1 S Mar20 0:00 login -- root
root 905 0.0 3.4 5184 2148 tty4 S Mar20 0:00 login -- franta
root 906 0.0 0.4 1356 276 tty2 S Mar20 0:00 /sbin/mingetty --
root 907 0.0 0.4 1356 276 tty3 S Mar20 0:00 /sbin/mingetty --
root 2174 0.0 2.0 2476 1308 tty1 S 14:30 0:00 -bash2
franta 2587 0.0 2.0 2476 1308 tty4 S 16:43 0:00 -bash2
Je to seznam všech procesů běžících v systému. Proces init je vždy proces
číslo 1. Procesy 2,3,4,5,6 (keventd, ksoftirqd_CPU0, kswapd, bdflush, kupdated)
jsou uzavřeny v hranatých závorkách "[]" a jejich velikost v operační paměti
(pole VSZ a RSS) je 0. Je to proto, že tyto procesy jsou démoni jádra, i když
většina jádra se obyčejně neukazuje na seznamu procesů. Démoni jádra jsou
startováni po initu, takže mají čísla procesů jako normální procesy. Ale
jejich kód a data jsou součástí paměti jádra. Závorky "[]" okolo položek ve
sloupci "COMMAND" jsou proto, že souborový systém /proc neobsahuje informaci
o příkazové řádce pro tyto procesy.
Některé činnosti jež "jaderní" démoni provádějí:
kswapd - přesouvá nepotřebné části běžících programů na swapovací oblasti
pevných disků v případě nedostatku volné operační paměti nebo
naopak do operační paměti potřebné části programu z disku (zapínaní/
vypínání swapovacích oblasti(-í)se provádí programy swap on/off)
bdflush a kupdated - vyprazdňují vyrovnávací paměti na disk(y)
Proces logování událostí systému (systém logger):
Jedny z prvních služeb, které jsou startovány procesem init, jsou démoni
syslogd a klogd. Zapisují zprávy do systémových logů - zprávy jádra jsou
obsluhovány démonem klogd, zatímco syslogd provádí logování zpráv z jiných
procesů, a případně přes síť i z jiných systémů. Hlavní logovací soubor bývá
/var/log/messages, ale konfigurace logovacího systému je řízena souborem
/etc/syslog.conf, který určuje co se bude logovat a kam. Zprávy jsou
identifikovány podle toho, od které služby přichází a jakou mají úroveň
priority. Kofigurační soubor sestává z řádek, které v podstatě říkají, že
zprávy od služby x s prioritou y a vyšší mají
jít do z, kde z může být obyčejný soubor, pojmenovaná
roura, terminál nebo konzole, vzdálený počítač nebo seznam uživatelů.
Getty a Login:
Getty je program který umožňuje připojit se přes sériové zařízení jako je
virtualní terminál, textový terminál, nebo modem. Zobrazí přihlášovací prompt
a když zadáte vaše uživatelské jméno, getty jej předá programu login, který
se zeptá na heslo, ověří to a spustí shell. Je dostupných několik variant
programu getty. Některé distribuce, včetně RedHat používají velmi malou verzi
zvanou mingetty, která pracuje pouze s virtuálními terminály. Login je
program z balíku util-linux (mkswap, fdisk, passwd, kill, setterm,
mount, swapon, rdev, renice, more a další), který také obsahuje dobře pracující
getty zvané agetty (Alternative linux GETTY).
Getty jsou obyčejně startovány v /etc/inittab procesem init. Zpráva
která se vypíše na vrchu obrazovky před přihlašovacím promptem je ze souboru
/etc/issue. Login kontroluje detaily ohledně přihlášení uživatele
v /etc/passwd, a jestliže systém podporuje stínování hesel též v
/etc/shadow. Moderní Unixové systémy včetně Linuxu podporují používání
tzv. PAM (Pluggable Autentication Module), které umožňují obecnou
kontrolu ověřování identity a oprávnění např. ze vzdálených serverů, podle
adresy stroje, z níž se uživatel přihlašuje, jména uživatele, doby přihlášení
apod. To lze využít nejen k přihlašování, ale k autorizaci (oprávnění) uživatele/procesu
vykonávat nějakou činnost.
Bash:
Po zadání správné kombinace přihlašovacího jména a hesla úloha login
ověří v /etc/passwd který shell má spustit. Ve většině případů to
na Linuxových systémech bude bash (Bourne Again SHell - vylepšený
sh). Jeho úkolem je čtení uživatelských příkazů a jejich provádění. Bash
je zároveň uživatelské rozhraní a interpret programovacího jazyka:
- Jako uživatelské rozhraní čte příkazy uživatele a provádí je sám jestliže
to jsou ``interní'' příkazy jako cd, pvd, kill nebo najde a provede program
jestliže jsou to ``externí'' příkazy jako cp, dd nebo startx. Také poskytuje
řadu vymožeností jako udržování historie příkazů, doplňování jmen (souborů,
uživatelů,..), editaci příkazové řádky, klávesová makra apod.
- Jako interpret programujícího jazyka - scripty, které init při startu
systému vykonává, jsou většinou scripty shellu, a jsou prováděny bash-em.
Dobrá znalost kombinace programovacího jazyka spolu s obvyklými systémovými
programy a utilitami pro příkazovou řádku vytváří velmi výkonný nástroj.
Soubor /etc/bashrc řídí systémové chování bash-e. Příkazy zde napsané
ovlivní každého kdo použije bash na tomto systému. Další globální soubor
ovlivňující chování bash-e je /etc/profile. Když bash má po startu
přečteny konfigurační soubory systémové úrovně (system-wide), hledá osobní
konfigurační soubory. Ty jsou v domovském (home) adresáři pod jmény .bash_profile
, .bash_login, .profile a .bashrc (tečka na počátku
znamená, že jsou skryté - pro jejich výpis musíme v příkazu "ls" použít přepínač
"-a" n. "-A"). Úpravou těchto souborů je možné přizpůsobit chování bash-e
potřebám uživatele, např. nastavit proměnné prostředí, implicitní editor,
parametry národního prostředí, spuštění úloh po přihlášení apod. Detaily
viz v "man bash".
Soubor .bash_logout je bash-em čten a prováděn při ukončení přihlašovacího
shellu - sem lze vložit příkazy, jež se mají provést při odhlášení uživatele
ze systému.