UNIX 4. Systém souborů a jádro © Milan Keršlágerhttp:// Obsah: ● systém souborů, metadata, data ● disketa, disk, adresace, sektor, cluster ● struktura FAT a ext4, VFS, mount, fsck, mkfs ● typy jader, syscall, kernel a user space ● start počítače, BIOS, setup, init, runlevel
Systém souborů – FS ● též souborový systém, anglicky filesystem ● data organizovaná do souborů a adresářů ● uloženo na vhodné paměti pro FS ● přístupné přímo v počítači nebo přes síť ● obsahuje data a metadata ● metadata popisují organizaci dat ● uloženo ve vhodném formátu – FAT, ext4, NTFS,... ● v jádře OS ovladač souborového systému
Organizace FS ● soubory a adresáře ● metadata ● popisují organizaci dat a další informace – umístění dat, přístupová oprávnění, čas změny,... ● data ● souvislý blok dat – ideální stav, ale jak budeme doplňovat a mazat data? ● jednotlivé alokační jednotky – klasický přístup
Metadata ● „data o datech“ ● v reálném životě např. katalog v knihovně ● obsahují informace nutné pro orientaci ve FS ● popisují soubory, adresáře a další informace o FS ● konzistence metadat ● důležité pro činnost jádra OS ● při poškození nutno opravit ( fsck, chkdsk )
Paměť pro FS ● typicky nevolatilní RWM (Read-Write Memory) ● data lze zapisovat (přepisovat) a číst ● data jsou zachována i při odpojení napájení – pevný disk, flash – výjimky: FS v RAM (rychlost, export dat z jádra,...) ● možné typy pamětí ● magnetické – pevný disk (sekvenční a přímý přístup) ● optické – CD, DVD, Blu-ray ● polovodičové – RAM, Flash ● samozřejmě i jiné typy
Pevný disk – HDD ● evoluční krok od diskety ● 1956 – IBM ● plovoucí hlava – bezkontaktní čtení/zápis ● typicky pevně vestavěn ● specifická rozhraní ● 1986 – SCSI, 1986 – ATA (max. 128 GB) ● 2002 – ATA/100, 2003 – SATA, 2005 – SAS ● SSD disk ● používá flash paměť → bez mechanických částí
Organizace dat – HDD ● kvůli větší kapacitě zaveden MBR ● Master Boot Record ● logické členění disku na oddíly (partition) ● umístěn v prvních 512 bajtů (první blok) ● různé formáty – DOS MBR → limit 2 GiB – GPT → nástupce (součást EFI standardu) ● v rámci oddílu už stejná organizace jako u FDD ● boot sektor (512 bajtů) ● následuje oblast s vlastním FS (struktura dle typu)
Oddíly (partitions) ● oddíl je logické rozčlenění pevného disku ● protože pevný disk je velký nebo více FS, OS ● dělení bez podpory v HW → SW musí respektovat ● popis rozdělení uložen do tabulky uvnitř MBR ● Master Boot Record (CHS = 0,0,0) → 512 bajtů ● obsahuje zavaděč a tabulku dělení disku na oddíly ● zpětná kompatibilita ● oddíl má strukturu jako disketa ● MBR může být nezávislý na OS → DOS MBR
Adresace dat na disku ● C-H-S ● Cylinder-Head-Sector ● cylindr, hlava, sektor ● používal se dříve ● LBA ● Logical Block Addresing ● lineární číslování ● současná metoda ● ATA/100 → 48 bitů → 128 PiB
Sektor a cluster ● sektor ● nejmenší fyzicky adresovatelný blok (disku) ● typicky 512 bajtů – CD/DVD → 2048 bajtů (2 kiB) – nové pevné disky → 4096 bajtů (4 kiB) ● cluster ● česky alokační jednotka ● nejmenší úsek dat adresovatelný na úrovni FS – 512 bajtů, 1024, 2048, 4096, kiB,...
FAT ● File Allocation Table ● 1986 použit v 86-DOS, koupil Microsoft → MS-DOS ● ECMA a ISO/IEC standard – dlouhé názvy částečně patentovány Microsoftem ● využívá spojový seznam ● struktura: ● boot sektor ● FAT1, FAT2 ● kořenový adresář ● datová oblast ● adresář: ● položka 32 bajtů ● jméno, přípona ● atributy, čas ● první sektor
Spojový seznam FAT FAT Datové bloky Záznam v adresáři: soubor.txt02 Obsah souboru: ABCDE Obsah FAT: odpovídající položka ukazuje na další, ukončeno FF. Obsah souboru je čten po datových blocích odpovídajících zřetězeným položkám ve FAT
Popis funkce FAT ● velikosti položek FAT – FAT12 → 12 bitů, FAT16 → 16 bitů, FAT32 → 32 bitů ● FAT32 používá na číslo datového bloku jen 28 bitů ● velikosti datových bloků – podle formátování: 512, 1024 B, 2 kiB, 4, 8, 16, 32, 64 kiB – max. velikost položky ve FAT krát velikost datového bloku – je maximální velikost souborového systému ● dlouhé názvy v adresářích – používají se další (neplatné) položky v adresáři ● neefektivita při manipulaci s FAT – přesuny hlaviček z datové části na položky FAT a zpět
ext4 ● Extended Filesystem ● čtvrtá generace FS pro Linux ● vychází z UFS (Unix File System) ● struktura: ● boot blok ● skupina (opakuje se) – superblok a deskriptory – metadata popisující FS – bitmapa použitých i-uzlů (i-nodů) a datových bloků – i-uzly – metadata jednotlivých souborů – datové bloky – datové části souborů, adresáře
Skupiny ext4 ● Skupiny se opakují, mají konstantní velikost. ● Superblok a deskriptory jsou jen v některých blocích (při využití SPARSE_SUPER). ● Superblok a bitmapy jsou vždy 1 blok dlouhé. Ostatní položky jsou násobky bloků.
Metadata ext4 ● data a metadata ve skupinách ● umožňuje rychlejší přístup při čtení/zápisu ● rozprostírá metadata po celém disku (havárie) ● metadata o souboru v i-uzlu ● i-uzel není součástí adresáře – lze vytvářet pevné a symbolické odkazy – i-uzlů je konečné množství (definováno při formátování) ● je-li i-uzlů zbytečně mnoho, prodlužuje se fsck (ext3 a starší) ● adresář: ● název + číslo i-uzlu
Superblok ● metadata o celém souborovém systému ● opakuje se na začátku skupiny – v případě poškození lze použít jinou kopii – sparse-super → kopie jen u některých (zrychlení) ● struktura: ● stav souborového systému (clean, dirty) – při připojení test (+fsck) a nastavení na dirty – při odpojení nastavení na clean ● počet připojení, poslední fsck (automatické fsck) ● velikosti a umístění jednotlivých částí
I -uzel ● struktura i-uzlu: ● typ souboru a přístupová oprávnění ● počet odkazů (pro pevné linky, ale i adresáře) ● vlastník, skupina ● velikost ● časové značky – poslední přístup (atime), změna dat (mtime), změna metadat (ctime) ● 12 přímých odkazů na datové bloky ● 1 nepřímý odkaz na datové bloky (první úrovně) ● 1 nepřímý odkaz druhé úrovně ● 1 nepřímý odkaz třetí úrovně
Nepřímé odkazy v I-uzlu
Struktura adresáře ● adresář je vlastně speciální soubor ● pevně daná maximální délka názvu objektu – tj. název souboru nebo podadresáře ● číslo i-uzlu – odkaz na metadata popisující soubor – každý FS čísluje i-uzly vždy znovu od nuly ● obsah adresáře ● lineární seznam položek → pole ● položky někdy organizovány do stromu – kvůli rychlosti prohledávání (ext3, NTFS,...)
VFS ● Virtual Filesystem ● VFS implementuje jádro OS ● shora sjednocuje přístup ke všem FS (API) ● dle situace volá „ovladač“ konkrétního FS ● řeší cache pro soubory a adresáře ● další FS se připojují do existujících adresářů ● příkaz mount, umount, df $ df Souborový systém 1K bloků Použité Volné Uži% Připojeno do /dev/sda % / /dev/sda % /home tmpfs % /dev/shm
Připojování FS ● mount ● typ FS, speciální soubor zařízení, adresář ● mount /dev/sda3 /home ● umount ● slouží k odpojení připojeného FS ● FS nesmí být používán – otevřený soubor, aktuální adresář ● /etc/fstab ● seznam FS připojovaných při startu systému – startovací skript spustí příkaz mount -a
Příklad připojení /home bin etc home huzva texty skripty jane fotky video lib usr / Kořen je připojen na základní FS. Do /home je připojen další disk. Připojený FS může mít odlišnou stavbu (NTFS, FAT, ext3, XFS, síťový NFS, …). VFS pak rozhoduje, jaký ovladač FS se při přístupu k datům použije.
Kořenový systém souborů ● kořenový systém souborů – „ / “ ● připojuje se jako první po startu jádra OS – jádro samo o sobě žádný další FS nepřipojuje – vzniká tak strom adresářů s jediným kořenem ● musí obsahovat vše pro zahájení startu počítače – program init, startovací skripty, konfigurační soubory – skripty připojí další FS → /etc/fstab ● další FS se připojuje do již existujícího adresáře – vznikne stromová struktura různých FS – VFS musí vždy vědět, na jakém FS se nachází
fsck ● kontrola konzistence metadat ● změna dat (a metadat) v několika krocích ● dojde-li k havárii, nejsou data konzistetní – např. zrušíme název v adresáře, ale ne i-nod a dat. bloky – → do /lost+found ● fsck využívá záznamy v superbloku – automatizovaná detekce nutnosti kontroly ● plná kontrola trvá extrémně dlouho ● řeší ext4 (jen použité i-nody) ● preventivní kontroly je nutné plánovat – současné distribuce automatické opravy nepoužívají
mkfs ● vytváření souborových systémů ● typicky volá podřízené nástroje – mkfs.ext4, mkfs.ntfs, mkfs.vfat ● každý FS má vlastní sadu parametrů – nutno dohledat v manuálových stránkách ● mkfs -t ext4 /dev/sda3
Fragmentace ● vzniká při ukládání dat do alokačních jednotek ● nově přidělené A.J. spolu nesousedí ● pohyb hlaviček disku je relativně pomalý ● náhodná stopa = 10 ms, sousední stopa = 1 ms ● řešení: ● ukládat data tak, aby se omezila fragmentace (ext) ● defragmentovat dodatečně (NTFS) ● vnitřní fragmentace (fragmentace volného místa) ● poslední alokační jednotka není zcela obsazena ● řeší se pomocí „tail merge“ (subalokace bloků)
Žurnálování ● ochrana konzistence metadat (někdy i dat) ● po pádu systému opravujeme jen nekonzistence ● není nutné prohlížet všechna metadata ● neslouží jako záloha nebo záruka, že se zapíše vše ● princip funkce ● plánovanou operaci zapíšeme do žurnálu ● provedeme změny v souborovém systému ● zapíšeme do žurnálu záznam o dokončení operace ● zrušíme záznam v žurnálu
Jádro operačního systému
● základní součást operačního systému ● doplňují ho pomocné nástroje ● úkoly jádra a operačního systému 1) umožnit uživateli ovládat počítače ● zajistit spuštění programu, vstupy, výstupy, správu poč... 2) vytvořit abstraktní vrstvu pro programy 3) spravovat prostředky počítače ( přidělovat je procesům ) ● unixová jádra ● programům poskytují systémová volání (syscall) ● Linux: modulární monolitické jádro (viz dále)
Typy jader OS ● monolitické jádro – monolithic kernel ● jeden celek řeší celý problém ● varianta: modulární jádro ● mikrojádro – microkernel ● idea jako u strukturovaného programování ● ještě menší: exokernel, nanokernel, picokernel ● hybridní jádro – hybrid kernel ● něco mezi monolitickým a mikrojádrem ● snaha o využití „toho lepšího“ z obou
Monolitické jádro ● jádro je jeden celek ● původní model (např. Unix) ● v souvislém úseku paměti (kernel-space) ● vše na stejné (absolutní) úrovni oprávnění ● chyba (např. v ovladači) ohrožuje celé jádro ● umožňuje efektivní programátorské triky ● do téže paměti zasahují různé subsystémy ● vývoj náročný na znalost funkce celého jádra ● dnes Linux, FreeBSD a další ● části jako samostatné moduly → modulární jádro
Mikrojádro ● jádro minimalizováno (jen nejnutnější části) ● hezké rozvržení, vlastní písečky, snadné pochopit ● vše ostatní jako běžné procesy – tzv. servery ● souborový subsystém, síťový subsystém a další ● komunikace přes API (zasílání zpráv) ● proces (server) lze po pádu restartovat (ale fuj) ● výkonnostní problémy (někdy nemusí vadit) ● vyvolání služby jádra může znamenat nutnost čekat na přepnutí kontextu mezi jádrem a procesem (i více procesy) ● samostatné procesy nemohou manipulovat se společnými daty (např. cache) ● GNU Hurd + mikrojádro GNU Mach – stále není finální ● MINIX, Symbian (je navíc RTOS)
Hybridní jádro ● kombinuje výhody monolitu a mikrojádra ● základní jádro je větší ● včetně částí citlivých na výkonnost ● blíží se z druhé strany modulárnímu monolitu ● Microsoft Windows NT ● NT 3.1, 3.5, 3.51, 2000, XP, 2003, Vista, 2008, 7,... ● Microsoft Windows CE ● poslední verze odklon od mikrojádra k hybridnímu ● Windows Mobile, Pocket PC, Windows Phone
Kernel space a user space ● kernel space (prostor jádra ) ● jádro v privilegovaném stavu, plně ovládá počítač ● user space (prostor procesů) ● procesy v neprivilegovaném stavu – při snaze o ovládnutí počítače → vyvolání jádra – každý proces svůj adresní prostor ● volání služeb jádra (syscall) – proces žádá jádro o provedení nějaké služby – služba je vykonána v privilegovaném režimu ● user space → kernel space → user space
Syscall, system call ● systémové volání jádra OS ● v unixových systémech základní kámen – vytváří API, které používají procesy ● čtení z disku, přidělení paměti, ovládání hardware,... – zajišťuje kompatibilitu ● jednou zavedený syscall je podporován „do nekonečna“ ● velký odpor proti bezhlavému zavádění nových syscallů ● problémy při snaze o rozšíření staršího volání – posuzuje oprávnění a provede privilegovanou činnost ● výjimka → proces s právy roota může všechno ● mikrojádra syscall nemají – používají zasílání zpráv skrze API – vyvolává lavinu změn kontextu mezi servery
Start počítače – PC
Start počítače ● dva základní kroky ● inicializace hardware – pomocí firmware (BIOS) ● aktivace software – typicky zavedení jádra operačního systému – využívá informace od firmware (ACPI) ● jednotlivosti specifické pro různé typy počítačů ● IBM PC: vysoká variabilita startu ● jednoúčelová zařízení obvykle jen jednu metodu
Zapnutí PC ● reset (signál propojující všechny obvody) ● po zapnutí nebo zmáčknutí tlačítka ● CPU do 16bitového režimu (jako Intel 8086) ● interpretace kódu od adresy 0xFFFF0 ● zde je umístěn BIOS ● vlastní BIOS i doplňující karty – grafická karta, řadiče pro disky (SATA, SCSI) atd. – BIOS je najde a spustí jejich inicializační kód – mohou rozšířit schopnosti BIOSu ● start systému z netradičního zařízeni (SCSI řadiče, síťová karta) ● BIOS plně kontroluje první fázi startu PC
BIOS ● Basic Input-Output systém ● v paměti ROM (dnes Flash) ● na základní desce od jejího výrobce – vyrábí několik firem, modulární – závislý na HW (přímo jej ovládá) ● poskytuje jednoduché API – služby BIOSu ● čti sektor z disku, vytiskni znak, pošli na port,... ● plně na BIOS spoléhal pouze DOS ● je 16bitový z původního IBM PC XT (1983) ● 32bitová rozšíření BIOSu se neujala
SETUP ● aplikace pro volitelná nastavení BIOSu ● při startu stiskem DEL, F2 a podobně ● je to součást BIOSu nebo samostatná aplikace ● nastavení uloženo v paměti CMOS – zálohováno baterií (spolu s RTC) ● např. pořadí zařízení pro zavedení OS – dříve pevně stanoveno → boot viry z disket ● dnes snaha o automatizaci, minimalizace ● někdy schválně mnoho voleb – nastavení chipsetu (frekvence, napájení, režimy...) – vhodné pro experty, pro přetaktování,...
Činnost BIOSu při startu ● cílem BIOSu je aktivace operačního systému ● detekce a inicializace hardware ● uvedení HW do výchozího stavu ● lze (částečně) přeskočit u teplého startu ● ACPI (standard, vytvořil Intel 1996) – běžné v počítačích PC po roce 2000 – informace o konfiguraci do tabulek v paměti – tabulky často chybně vytvořené ● tvůrce BIOSu potřebuje funkční start jen pro Windows ● POST testy (Power On Self Test) ● slouží k základnímu prověření funkčnosti hardware
Zavedení OS ● IBM PC: BIOS ● disketa – nejjednodušší, jako emulace u ostatních ● pevný disk – jako disketa, ale navíc MBR ● CD/DVD – emulace diskety nebo přímo ● BootROM – start pomocí síťové karty (bez disku) ● USB mass storage (flash disk, externí HDD apod.) ● Apple: EFI (Intel) ● náhrada BIOSu ● binární „ovladače“ HW ● problém možnosti tajit ovládání a nastavování HW
IBM PC: start z diskety ● BIOS umí disketovou mechaniku plně ovládat ● HW FDD mechaniky je ovládán jednotně ● potřebujeme načtení požadovaného sektoru ● nalezení a inicializace disketové mechaniky ● BIOS zavede boot sektor do RAM ● první sektor na disketě (CHS = 0,0,0) → 512 bajtů ● využívá služby BIOSu → HW nezávislý kód ● skočí se na začátek ● obsahuje kód zavaděče jádra OS ● specifický pro různé OS (DOS, Windows NT, Linux)
IBM PC: start z disku ● BIOS načte do paměti MBR ● tj. prvních 512 bajtů na HDD ● pokud je neplatný, zahlásí BIOS chybu – MBR not found ● skočí se na začátek MBR (zavaděč + tabulka) ● vybere se aktivní oddíl ● k němu se přistupuje dále jako k disketě ● MBR zavede z aktivního oddílu boot sektor ● není-li platný, zahlásí MBR chybu (OS not found) ● dále se pokračuje jako při startu z diskety
Start unixového systému ● jádro převezme kontrolu ● přepne procesor do 32bitového režimu (+ring0) ● aktivuje si příslušné ovladače pro hardware – využije informace od BIOSu (ACPI) a PCI ID – každý ovladač má inicializační část ● připojí kořenový systém souborů (root filesystem) – určuje správce počítače (např. při instalaci) ● z něj spustí první proces → init – může to být i jiný program ( /bin/bash ) ● používá se vyjímečně (např. po havárii při opravě systému)
Proces init ● v unixových OS proces číslo 1 ● je spuštěn jako první – je (pra)rodičem všech ostatních procesů ● je též univerzální adopce „osiřelých“ procesů – výjimkou je v Linuxu tzv. initrd ● spouští se procesy před init, ale init má stejně číslo 1 ● spouští startovací skripty – vybere sadu skriptů podle runlevel ● řídí se podle souboru /etc/inittab – spustí démony – připraví prostředí pro uživatele (GUI, přihlašovací dialog...)
Runlevel ● různé varianty spuštění systému ● runlevel je stav procesu init, u Fedory např: 1 – singeuser (správa systému) 3 – multiuser (běžný provoz, bez GUI) 5 – jako 3 ale s GUI 6 – reboot (restart systému) ● mezi runlevely se dá přecházet – příkaz (jen root): telinit 3 – při startu lze jádru říct číslo runlevelu ● jinak podle /etc/inittab ● předání parametru jádru při startu lze zabránit (heslo pro zavaděč) – při přechodech mezi runlevely se spouští určité skripty ● démoni (resp. startovací skripty) se spouští jen v určitém runlevelu