---
# System prepended metadata

title: Obecné principy OS a embedded systémy

---

# Obecné principy OS a embedded systémy

## Co je operační systém a jaké má hlavní funkce?

Operační systém (OS) je základní softwarová vrstva, která zajišťuje správu hardwarových prostředků a poskytuje služby aplikačním programům.

**Hlavní funkce:**
- Správa procesů (proces scheduling, multitasking)
- Správa paměti (alokace, ochrana, stránkování)
- Správa vstupně/výstupních zařízení (I/O)
- Správa souborového systému
- Správa bezpečnosti a přístupu (uživatelé, práva)
- Abstrakce hardwaru (poskytuje aplikačnímu softwaru jednotné rozhraní)

---

## Porovnej real-time a general-purpose operační systémy

| Vlastnost        | Real-time OS (RTOS)                  | General-purpose OS (např. Linux, Windows) |
|------------------|--------------------------------------|-------------------------------------------|
| Účel             | Zaručení včasné odezvy               | Všeobecné použití, výkon a univerzálnost  |
| Determinismus    | Vysoký (předvídatelné chování)       | Nízký až střední                          |
| Scheduler        | Priority-based, často preemptivní    | Obecný, např. fair-share, round-robin     |
| Latence          | Nízká a deterministická              | Vyšší a variabilní                        |
| Použití          | Průmyslové řídicí systémy, automobily| PC, servery, mobily                       |

---

## Jaké jsou hlavní charakteristiky embedded systémů?

- **Specifický účel**: navržený pro konkrétní funkci (např. mikrovlnka, automobil).
- **Real-time požadavky**: často potřebují garantovat odezvu v časových limitech.
- **Omezené zdroje**: málo paměti, výpočetního výkonu, energie.
- **Spolehlivost**: často nasazeno v kritických aplikacích.
- **Nízká spotřeba energie**: důležité pro mobilní nebo bateriově napájená zařízení.
- **Často bez uživatelského rozhraní.**

---

## Kdy a proč použít general-purpose systém?

Používá se, když:
- Je potřeba univerzální prostředí pro běh různých aplikací.
- Reálný čas není kritický.
- Je dostupný dostatek zdrojů (RAM, CPU).
- Je požadováno komplexní GUI, síťové funkce, kompatibilita s desktopovým SW.

**Příklad**: vývojové platformy, servery, pracovní stanice.

---

## Rozdíl mezi hard a soft real-time systémem

- **Hard real-time**: Nedodržení časového limitu je **nepřijatelné** a může způsobit selhání systému. 
  *Příklad: airbag v autě.*
- **Soft real-time**: Nedodržení limitu není fatální, ale snižuje kvalitu služby. 
  *Příklad: přehrávání videa.*

---

## Co znamená „predictability“ v kontextu embedded systémů?

„Predictability“ (předvídatelnost) znamená, že lze **spolehlivě odhadnout chování systému v čase** – konkrétně dobu odezvy a dobu vykonání úloh. 
Je klíčová pro **real-time aplikace**, kde je důležité splnění časových požadavků.

---

## Role více-jádrových procesorů v embedded systémech

- Umožňují **paralelní zpracování úloh**, zvyšují výkon bez zvyšování frekvence.
- Mohou být použity pro **oddělení kritických a méně důležitých úloh**.
- Umožňují **nižší energetickou spotřebu** při vyšším výkonu (nižší takt na více jádrech).
- Vhodné např. v automotive nebo multimédiích.

---

## Rozdíl mezi P-cores a E-cores (heterogenní multiprocesorové systémy)

- **P-cores (Performance cores)**: Výkonná jádra, vysoký výkon, vyšší spotřeba.
- **E-cores (Efficiency cores)**: Úsporná jádra, nízká spotřeba, menší výkon.
- **Heterogenní architektura** (např. ARM big.LITTLE, Intel Alder Lake): umožňuje efektivní rozdělení zátěže – těžké úlohy na P-cores, lehké/úsporné na E-cores.
- **Redukovaná instrukční sada**: E-cores mají často redukovanou jejich instrukční sadu

---

## Co jsou to „zero power systems“?

- Systémy, které **neodebírají žádnou energii**, když nejsou aktivní.
- Využívají ultra-nízkopříkonové komponenty a techniky, např. **wake-up circuits**, **event-driven design**.
- Používají se ve **senzorových sítích**, IoT, wearables.

---

## Co říká Mooreův zákon a jak se vztahuje k vývoji embedded systémů?

- Mooreův zákon říká, že počet tranzistorů na čipu se **přibližně zdvojnásobuje každých 18–24 měsíců**.
- Umožňuje miniaturizaci, vyšší výkon a levnější čipy.

**Dopad na embedded systémy:**
- Integrace více funkcí do jednoho čipu (SoC)
- Vyšší výpočetní výkon při nižší ceně
- Možnost použití komplexních OS (např. Linux) i na malých zařízeních

# Správa procesů a systémová volání

## Vyjmenuj a stručně popiš hlavní komponenty operačního systému

- **Správa procesů (Process Management)**: vytváření, ukončování a plánování procesů.
- **Správa paměti (Memory Management)**: přidělování paměti, stránkování, ochrana paměti.
- **Správa souborového systému (File System Management)**: přístup k souborům, adresářová struktura.
- **Správa zařízení (Device Management)**: ovladače zařízení, I/O fronty.
- **Správa uživatelů a zabezpečení**: přístupová práva, autentizace.
- **Systémové volání a API**: prostředník mezi uživatelskými programy a jádrem.

---

## Co je proces a jaké činnosti s procesy OS provádí?

**Proces** je běžící instance programu, která má vlastní adresní prostor, registr CPU, otevřené soubory atd.

**OS s procesy provádí:**
- Vytváření a ukončení procesů
- Naplánování na CPU (scheduler)
- Správa kontextu procesů
- Synchronizaci a komunikaci mezi procesy
- Ochranu paměti a izolaci

---

## Co je PCB (Process Control Block) a co obsahuje?

**PCB** je datová struktura, kterou OS používá k reprezentaci procesu.

**Obsahuje např.:**
- ID procesu (PID)
- Stav procesu (running, ready, waiting...)
- Registry CPU
- Ukazatel na paměťové oblasti
- Otevřené soubory
- Informace pro plánování (priorita, kvanta)
- Informace o rodiči/potomcích

---

## Jaký je rozdíl mezi procesem a vláknem (thread)?

| Vlastnost       | Proces                      | Vlákn(o) (Thread)               |
|-----------------|-----------------------------|---------------------------------|
| Adresní prostor | Vlastní                     | Sdílí s ostatními vlákny        |
| Izolace         | Úplná (paměť, data)         | Minimální                       |
| Vytváření       | Nákladnější (fork/exec)     | Levnější (např. pthread_create) |
| Použití         | Běh oddělených programů     | Paralelizace v rámci programu   |

---

## Jaký je rozdíl mezi API a systémovým voláním?

- **API (Application Programming Interface)**: Rozhraní knihoven, které usnadňuje používání systémových volání (např. POSIX `open()`).
- **Systémové volání (System Call)**: Přímý přechod z uživatelského režimu do režimu jádra k provedení chráněných operací (např. `int 0x80`, `syscall`).

---

## Jak funguje systémové volání na úrovni CPU (trap, interrupt, návrat)?

1. **Trap**: Software generuje přerušení (`trap` instrukce) pro volání jádra.
2. CPU přepne režim na **privilegovaný (kernel mode)**.
3. Provádí se obsluha systémového volání (dispatcher volá příslušnou funkci).
4. Po dokončení dojde k návratu do uživatelského režimu (`iret`, `sysret`).

---

## Jaký je rozdíl mezi user mode a system mode?

| Vlastnost       | User Mode                     | System Mode (Kernel Mode)                   |
|-----------------|-------------------------------|---------------------------------------------|
| Přístup k HW    | Omezený                       | Plný                                        |
| Paměť           | Izolována                     | Přístup ke všem částem paměti               |
| Nebezpečí chyb  | Nižší                         | Vysoce rizikové (může způsobit pád systému) |
| Volání jádra    | Nepřímo přes systémové volání | Nativně                                     |

---

## Jak OS zabraňuje procesům v přístupu k paměti jiných procesů?

- Pomocí **hardwarové podpory paměťové ochrany**:
  - Stránkování (paging)
  - Segmentace
- Každý proces má svůj **virtuální adresní prostor**.
- Přístupy mimo přidělený prostor vedou k **segmentation fault**.
- **MMU (Memory Management Unit)** mapuje virtuální adresy na fyzické.

---

## Co jsou ochranné prstence (rings) v x86?

- Prstence určují úroveň oprávnění:
  - **Ring 0**: jádro OS (nejvyšší privilegia)
  - **Ring 3**: běžné uživatelské aplikace
- Prstence 1 a 2 se běžně nepoužívají v běžných OS.
- Slouží k **ochraně systému před neautorizovaným přístupem**.

---

## Popiš základní fáze bootování x86 systému

1. **Reset**: CPU se spustí z reset vectoru (např. 0xFFFF0).
2. **BIOS/UEFI**: Inicializace HW a načtení zavaděče.
3. **Bootloader** (např. GRUB): Načte a spustí jádro OS.
4. **Kernel**: Inicializace jádra a ovladačů.
5. **Init systém** (např. systemd): Spustí uživatelské služby.

---

## Jaké jsou rozdíly mezi BIOS, UEFI, Coreboot a Libreboot?

| Vlastnost     | BIOS           | UEFI               | Coreboot              | Libreboot              |
|---------------|----------------|--------------------|-----------------------|------------------------|
| Typ           | Zastaralý      | Moderní firmware   | Open-source firmware  | Plně svobodný firmware |
| Disk support  | Do 2TB (MBR)   | >2TB (GPT)         | GPT podpora možná     | GPT podpora            |
| Grafické UI   | Ne             | Ano                | Ne                    | Ne                     |
| Cíl           | Kompatibilita  | Výkon + bezpečnost | Open HW/rychlost      | Svobodný SW            |

---

## Co je to reset vector?

- Adresa v paměti, na které procesor po zapnutí/RESETU **začne vykonávat instrukce**.
- U x86: typicky fyzická adresa **0xFFFFFFF0** (BIOS) nebo definovaná v UEFI.

---

## Co je to kernel module a jaký je rozdíl oproti built-in části jádra?

- **Kernel module**: načitatelná komponenta jádra za běhu (např. ovladač).
- **Built-in**: pevně zkompilováno v jádře, nelze odebrat bez rekompilace.
- Výhoda modulů: **flexibilita, nižší paměťová náročnost, dynamické načítání**.

---

## Co je potřeba udělat při přepnutí kontextu?

1. Uložit stav běžícího procesu:
   - Registry CPU
   - Ukazatel zásobníku
   - Program Counter
2. Obnovit stav nového procesu:
   - Načíst registry
   - Nastavit paměťový kontext
   - Nastavit instrukční čítač

---

## Kdy ke kontextovému přepnutí dochází a proč?

Nastává při:
- Vypršení časového kvanta (u preemptivního plánovače)
- Čekání na I/O
- Dobrovolném uvolnění CPU (např. `sleep()`)
- Vyšší priorita jiného procesu

**Cíl**: efektivní sdílení CPU mezi více procesy.

# Výkon, spotřeba a plánování úloh

## Vztah mezi výkonem a energií

- **Výkon (performance)**: jak rychle se úloha dokončí (např. MIPS, FLOPS).
- **Energie (energy)**: celková spotřeba elektrické energie = příkon × čas.
- **Příkon (power)**: okamžitá spotřeba energie (Watt = Joule/s).
  
💡 Energie = Příkon × Čas 
Zvýšení výkonu (zkrácení doby výpočtu) může snížit celkovou energii, i když příkon je vyšší.

---

## Kdy platí, že rychlejší výpočet znamená nižší spotřebu?

- Pokud úloha běží **rychleji**, může se systém dříve přepnout do úsporného režimu (sleep).
- Např.:
  - **Race-to-sleep** strategie: co nejrychleji dokončit výpočet a přejít do hlubokého spánku.
  - Platí, pokud rozdíl v příkonu není příliš velký.

---

## Vysvětli rozdíl mezi nízkým příkonem (low power) a nízkou spotřebou energie (low energy) 

| Vlastnost         | Low Power                           | Low Energy                               |
|-------------------|-------------------------------------|------------------------------------------|
| Co znamená        | Nízký okamžitý příkon (W)           | Nízká celková spotřeba (J)               |
| Důraz             | Dlouhodobý běh, úsporné komponenty  | Rychlé dokončení výpočtu a vypnutí       |
| Příklad           | Hodinky, senzory                    | Mobilní CPU, které rychle vypočítá a spí |

---

## Z čeho se skládá spotřeba CMOS obvodů?

1. **Dynamická spotřeba (dominantní):**
   - Nabíjení/vybíjení kapacitních zatížení (C × V² × f)
   - Závislá na frekvenci a napětí

2. **Statická spotřeba:**
   - Průsakové proudy (leakage current)
   - Rostoucí problém u menších technologií (< 20nm)

---

## Co je to power gating a jak pomáhá?

- Technika vypínání **nepoužívaných částí čipu** (např. jádro CPU, cache).
- Odpojí napájení pomocí tranzistorů (tzv. sleep transistor).
- Výrazně sníží **statickou spotřebu**.
- Vyžaduje rychlé „probuzení“ při potřebě.

---

## Jak funguje Dynamic Voltage Scaling (DVS) a jak ovlivňuje výkon a spotřebu?

- **Snížení napětí (V)** snižuje výkon CPU, ale i spotřebu (díky kvadratické závislosti spotřeby na napětí: P ∝ V² × f).
- Lze jej použít, když není potřeba maximální výkon.
- Při nízkém zatížení šetří energii, ale může prodloužit výpočet.

---

## Co je DVFS (Dynamic Voltage and Frequency Scaling)?

- Rozšíření DVS – mění se **napětí i frekvence** CPU.
- Vysoká frekvence = vyšší výkon, ale vyšší spotřeba.
- Nízká frekvence + nízké napětí = úspora energie.
- Dynamicky řízeno OS (např. **cpufreq** v Linuxu).

---

## Jak se plánují úlohy na heterogenních procesorech (např. big.LITTLE architektura)?

- OS nebo plánovač rozhoduje:
  - Která úloha se má spustit na **P-core** (výkonné) nebo **E-core** (úsporné).
- Cílem je **vyvážení mezi výkonem a spotřebou**.
- Např. nízkoprioritní úlohy → E-core, interaktivní úlohy → P-core.

---

## Jak se rozdělují úlohy podle energetických domén?

- Energetické domény = části čipu s vlastním napájením (např. GPU, CPU, DSP).
- Úlohy se přidělují tak, aby:
  - Využívaly domény s optimálním poměrem výkon/energie.
  - Nedocházelo k přetížení jednoho subsystému.
- Příklad: zpracování videa v DSP místo CPU → nižší spotřeba.

---

## Jaký je rozdíl mezi: Race-to-sleep vs. Crawl-to-sleep

| Strategie         | Race-to-sleep                     | Crawl-to-sleep                        |
|-------------------|-----------------------------------|---------------------------------------|
| Princip           | Rychlé dokončení a usnutí         | Pomalý běh se sníženým výkonem        |
| Výhoda            | Krátký čas běhu, delší spánek     | Nízký příkon                          |
| Použití           | Když je přechod do spánku levný   | Když je wake-up drahý nebo omezený    |

---

## Co je DPM a jaké má režimy (RUN, IDLE, SLEEP)?

**DPM (Dynamic Power Management)** – techniky pro řízení napájení za běhu systému.

**Typické režimy:**
- **RUN** – plný výkon, maximální spotřeba.
- **IDLE** – CPU nic neprovádí, ale je připraven ihned reagovat.
- **SLEEP** – hlubší režim úspory, dlouhá reakční doba (vyžaduje „wake-up“).

# Plánování procesů – algoritmy a víceprocesorové systémy

## Rozdíl mezi preemptivním a nepreemptivním plánováním

- **Preemptivní**: proces může být **přerušen** OS ve prospěch jiného (např. vyšší priorita).
- **Nepreemptivní**: proces běží až do konce nebo do vlastní blokace (např. I/O).

**Výhoda preemptivního**: lepší odezva, férovost 
**Nevýhoda**: vyšší režie (context switch)

---

## Jaké jsou žádoucí vlastnosti plánovače?

- **Férovost**: rovnocenná šance sdílení CPU
- **Efektivnost**: procesor trvale jede na 100%
- **Doba odezvy**: minimální odezva pro interaktivní uživatele
- **Doba běhu**: minimální čas čekání na vykonání zadání uživatele (dávky)
- **Průchodnost**: maximální čas procesů vykonaných během jedné čas. jednotky

---

## Co je stárnutí (aging) a jak pomáhá proti hladovění?

- **Aging** = postupné **zvyšování priority** dlouho čekajících procesů.
- Chrání proti **hladovění** (starvation) u algoritmů, které preferují krátké/urgentní procesy.

---

## Jaké problémy mohou nastat bez správného plánování?

- **Hladovění (starvation)**: proces nikdy nedostane CPU.
- **Zablokování (deadlock)**: skupina procesů čeká na zdroje od sebe navzájem.
- **Nízká propustnost**, **nefér přístup**, špatná odezva systému.

---

## Algoritmy plánování procesů

### FCFS (First-Come-First-Served) - FIFO lool

- **Princip**: úlohy se provádí v pořadí příchodu.
- **Preemptivní?**: Ne
- **Výhody**: jednoduchost
- **Nevýhody**: dlouhá čekací doba, **convoy effect**
- **Použití**: dávkové systémy

---

### SJF / SRTF (Shortest Job First / Shortest Remaining Time First)

- **SJF (Nepreemptivní)**: běží proces s nejkratší dobou provedení 
- **SRTF (Preemptivní)**: běží proces s nejkratší zbývající dobou 
<br/>
- **Výhody**: optimální průměrná čekací doba
- **Nevýhody**: potřeba znát délku procesu, náchylné k hladovění
- **Použití**: simulace, analytické systémy

---

### Priority scheduling

- **Princip**: procesy mají prioritu, běží ten s nejvyšší.
- **Preemptivní?**: Ano i Ne
- **Výhody**: řízení naléhavosti
- **Nevýhody**: hladovění nízkých priorit
- **Řešení**: aging

---

### Round Robin

- **Princip**: každý proces dostane **časové kvantum**.
- **Preemptivní?**: Ano
- **Výhody**: férové, dobrá odezva
- **Nevýhody**: závislost na délce kvanta
- **Použití**: interaktivní systémy

---

### Multilevel Queue Scheduling

- **Princip**: fronty podle typu úloh (např. systémové, uživatelské).
- Každá fronta má vlastní plánovací algoritmus.
- **Nevýhody**: statické, neumožňuje pohyb mezi frontami.

---

### Multilevel Feedback Queue

- **Princip**: jako multilevel queue, ale **umožňuje přesun** mezi frontami na základě chování procesu.
- **Výhody**: adaptivní, flexibilní
- **Nevýhody**: složitá implementace
- **Použití**: Unix/Linux plánovače

---

### Lottery Scheduling

- **Princip**: každému procesu přiděleny "lístky", náhodné losování.
- **Preemptivní?**: Ano
- **Výhody**: jednoduché, probabilisticky férové
- **Nevýhody**: náhodnost
- **Použití**: výzkumné OS, experimenty

---

## Co je technologie big.LITTLE? Jaké jsou její výhody a rizika?

- **big.LITTLE**: kombinace výkonných (big) a úsporných (LITTLE) jader. (efficiency a power cores)
- **Výhody**: úspora energie, možnost paralelního zpracování
- **Rizika**:
  - Složitější plánování
  - Nekompatibilita v registrech/ISA (např. různé výkonové charakteristiky)
  - Možné problémy se synchronizací

---

## Rozdíl mezi asymetrickým a symetrickým víceprocesorovým plánováním

| Typ             | Asymetrické (AMP)          | Symetrické (SMP)              |
|-----------------|----------------------------|-------------------------------|
| Plánování       | Pouze jeden CPU plánuje    | Každý CPU má vlastní plánovač |
| Komplexita      | Nižší                      | Vyšší, nutná synchronizace    |
| Výhoda          | Jednoduché, predikovatelné | Lepší škálování, využití CPU  |

---

## Co je procesorová afinita (soft vs hard)?

- **Procesorová afinita**: určuje, na kterých jádrech smí běžet proces.

| Typ      | Popis                                      |
|----------|--------------------------------------------|
| **Soft** | preferované jádro, ale OS může změnit      |
| **Hard** | pevně vázané, OS nesmí měnit               |

---

## Jak funguje load balancing mezi procesory (push vs pull migration)?

- **Push migration**: plánovač aktivně přesune proces z přetíženého CPU.
- **Pull migration**: nevyužitý CPU si "vytáhne" úlohu z jiného.
- Cíl: rovnoměrné zatížení všech CPU.

---

## Jaké problémy řeší locky, cache coherence a sdílená data v SMP (Symetric MultiProcessing) systémech?

- **Locky**: zabránění kolizím při přístupu ke sdíleným datům. (řešení kritické sekce)
- **Cache coherence**: zajištění konzistence dat mezi více CPU cache.
- **Sdílená data**: riziko race conditions, potřeba synchronizace.

---

## Co jsou C-stavy (C0–Cn) – lokální režimy spánku CPU?

- **C-stavy** definují úroveň nečinnosti jednotlivých CPU.
  - **C0**: aktivní běh
  - **C1–Cn**: stále hlubší režimy spánku (nižší spotřeba, vyšší latence probuzení)
- Volí se podle vytížení a požadavků na odezvu.

---

## Co jsou S-stavy (S1–S5) – globální systémové stavy?

- **S-stavy** (ACPI power states) určují **globální** napájecí režim systému.

| Stav | Popis                          |
|------|--------------------------------|
| S0   | Systém běží                    |
| S1   | CPU stopped, RAM aktivní       |
| S2   | CPU no power, RAM aktivní      |
| S3   | Suspend to RAM (sleep)         |
| S4   | Suspend to disk (hibernace)    |
| S5   | Vypnuto                        |

# Souborové systémy – obecně i specificky (FAT, ext, NTFS) 

## Co je souborový systém a jaké funkce plní?

Souborový systém (FS) je metoda organizace, ukládání a správy dat na úložišti.

**Funkce:**
- Ukládání a načítání souborů
- Hierarchická struktura (adresáře)
- Přístupová práva a metadata
- Správa volného místa
- Odolnost proti chybám (žurnálování apod.)

---

## Jak jsou organizovány data na úložišti?

- **Sektor**: nejmenší adresovatelná jednotka HW (např. 512 B, 4 KB)
- **Blok (Cluster)**: 1 nebo více sektorů

---

## Jak funguje hierarchická struktura adresářů?

- Stromová struktura: složky mohou obsahovat soubory i další složky.
- Každý adresář obsahuje záznamy s názvy a ukazateli (např. inode čísla).
- Cesta k souboru může být absolutní (od rootu) nebo relativní.

---

## Co je to root filesystem? Jak se liší od kernelu?

- **Root filesystem** je hlavní adresářová struktura systému, dostupná pod `/`.
- Obsahuje např. `/bin`, `/etc`, `/usr`, `/home`.
- **Kernel** je součást OS, stará se o nízkoúrovňové operace; není to souborový systém. Je to jiná entita

---

## Co je VFS (Virtual File System) a jakou roli hraje?

- Abstrakce nad konkrétními FS – jednotné API (např. `open()`, `read()`).
- OS může používat různé FS (ext4, FAT, NTFS…) bez změny v aplikacích.

---

## Jaké typy souborových systémů Linux podporuje?

- **Nativní**: ext2, ext3, ext4, XFS, Btrfs, ReiserFS
- **Virtuální**: procfs, sysfs, tmpfs, devtmpfs
- **Síťové**: NFS, SMB, SSHFS
- **Cizí**: FAT, NTFS (přes FUSE nebo ntfs3)

---

## Co je FUSE a jak umožňuje uživatelské implementace FS?

- **FUSE (Filesystem in Userspace)**: rozhraní pro tvorbu FS mimo kernel.
- Vývojáři mohou napsat FS v uživatelském prostoru (např. v Pythonu).
- Jádro komunikuje s uživatelským démonem přes FUSE modul.

---

## Jaké jsou typické aplikace FUSE souborových systémů?

- EncFS, SSHFS, archivní FS (ZIP jako FS), síťové FS, šifrování na úrovni FS

---

## Jak probíhá bootování z pohledu souborového systému?

1. **Bootloader** načte kernel a případně initramfs.
2. **Kernel** připojí rootfs.
3. Spustí init proces (`/sbin/init`, `systemd`).

---

## Co je initramfs, rootfs, a jak se používají?

- **initramfs**: dočasný kořenový FS (v RAM), obsahuje init skripty a ovladače.
- initramfs slouží k inicializaci HW, pak se připojí skutečný root.
- **rootfs**: cílový FS připojený jako `/`.

---

## Co je MBR (Master Boot Record) a jak je strukturován?

- Prvních 512 B disku.
- Obsahuje:
  - **bootloader** (446 B)
  - **partition table** (4 záznamy po 16 B)
  - **boot signatura** (2 B) - 0x55aa
- Omezení: max. 4 primární oddíly, disk do 2 TB.

---

## Co je GPT (GUID Partition Table) a jaké výhody přináší?

- Novější standard (součást UEFI).
- Podpora až 128 oddílů, disky větší než 2 TB.
- Redundantní záznamy pro vyšší odolnost.
- Každý oddíl má **GUID**, název, atributy.
- Struktura
    - Na začátku Protective MBR (ochrana pro legacy toolky)
    - Hlavička GPT
        - GUID disku
        - Kde tabulky oddílů?
            - Primární i backup
        - Velikost položky
            - Kolik místa zabírá jeden záznam o partition v této tabulce
        - Počet položek oddílů
            - Kolik lze na disku udělat partitions?
        - CRC (corrupted -> použij backup)
    - Tabulka oddílů
        - Jednotlivé záznamy
            - GUID typu oddílu
                - EFI sys oddíl?
                - Windows data oddíl?
                - Linux oddíl?
            - GUID oddílu
            - Počáteční a koncová LBA oddílu
                - Prostě kde je (od - do)
            - Atributy oddílu
                - Např bootable?
            - Název (human readable - až 36 unicode)
    - Záloha GPT
        - Na konci -> nejdřív tabulka, pak header

---

## Rozdíl mezi MBR a GPT? Kdy se používají?

| Vlastnost      | MBR                   | GPT                       |
|----------------|-----------------------|---------------------------|
| Max. velikost  | 2 TB                  | > 2 TB                    |
| Počet oddílů   | 4 primární            | až 128                    |
| Redundance     | Ne                    | Ano (záložní tabulka)     |
| Použití        | Starší BIOS systémy   | Nové systémy s UEFI       |

---

## Jak funguje FAT12/16/32 – struktura a princip práce?

- **struktura**: MBR, FAT table, (Root direcotry), Data
- Používá **FAT tabulku**, která sleduje řetězec bloků souboru.
- **FAT12**: pro disky do 32 MB 
  **FAT16**: do 2 GB 
  **FAT32**: až 32 GB (někdy i víc, omezeno OS)

---

## Co je FAT tabulka? Jak se používá?

- Tabulka s ukazateli na další cluster souboru (formou linked-listu).
- Každý záznam říká, kde pokračuje obsah souboru.

---

## Jak FAT řeší dlouhé názvy souborů?

- Používá **VFAT**: speciální záznamy v adresáři s Unicode jmény.
- Soubory mají stále 8.3 (AAAAAAAA.BBB) kompatibilní jméno (DOS-style).

---

## Jaké jsou výhody a nevýhody FAT16/FAT32?

**Výhody:**
- Široká podpora (OS, zařízení)
- Jednoduchost
- Efektivnost zvlášť pro zařízení menší než 256MB

**Nevýhody:**
- Fragmentace
- Bez žurnálování
- FAT16: malá max. velikost
- FAT32: omezení velikosti souboru (4 GB)

---

## Jaké novinky přináší exFAT oproti FAT32?

- Vyšší limity velikosti souborů i oddílů
- Vylepšená alokace (bitmapa volných clusterů)
- Podpora větších clusterů
- Licencováno Microsoftem (Linux: exfat-utils, exfat-fuse)

---

## Co je inode a co obsahuje? Proč není jméno souboru součástí inode?

- **inode** je datová struktura popisující soubor.
- Obsahuje:
  - Velikost, přístupová práva, časová metadata
  - Ukazatele na datové bloky
- **Jméno není součástí** inode → umožňuje hardlinky

---

## Jak funguje adresář v ext2/ext3?

- Adresář je soubor obsahující páry:
  - **jméno souboru** + **číslo inode**
- Vyhledání probíhá porovnáním jmen.

---

## Popiš strukturu souborového systému ext2

- **Superblok** – metadata FS (velikost, počet inode…)
- **Skupiny bloků (block groups)**:
  - Bitmapy bloků a inode
  - Tabulka inode
  - Datové bloky

---

## Jak se ext2/ext3/ext4 liší v použitelnosti a výkonu?

| Vlastnost | ext2         | ext3              | ext4                            |
|-----------|--------------|-------------------|---------------------------------|
| Žurnál    | Ne           | Ano               | Ano                             |
| Výkon     | Rychlý zápis | Odolný vůči pádům | Lepší škálování                 |
| Funkce    | Základní     | Spolehlivý        | Extents, multibloky, timestamps |


-----

## Srovnání souborových systémů Ext2, Ext3 a Ext4

| Vlastnost / Souborový systém | Ext2 (1993) | Ext3 (2001) | Ext4 (2008) |
| :--------------------------- | :---------- | :---------- | :---------- |
| **Základní vlastnosti** | Tradiční Unix inode; funkce z Unix File System | Vše z Ext2 + žurnálování | Vše z Ext3 + extenty, 48bit adresace |
| **Žurnálování (Journaling)** | Ne            | Ano (3 typy: writeback, ordered, data) | Ano (výchozí: ordered) |
| **Maximální velikost svazku** | 32 TB         | 32 TB       | 1 EB (Exabajt) |
| **Maximální velikost souboru** | 2 TB          | 2 TB        | 16 TB (s 4 KiB bloky) |
| **Extenty** | Ne            | Ne          | Ano (souvislé bloky, zlepšuje výkon a snižuje fragmentaci) |
| **Počet podadresářů** | Omezeno (max 32 000) | Omezeno (max 32 000) | Neomezeno (dříve 64 000) |
| **Indexování adresářů** | Ne            | HTree (32bit) | HTree (64bit) |
| **Online zvětšování FS** | Ne            | Ano         | Ano         |
| **Rezerva pro superuživatele**| \~5% bloků     | \~5% bloků   | Nastavitelné (výchozí 5%) |
| **Volitelná velikost bloku** | Ano (1, 2, 4 KiB) | Ano (1, 2, 4 KiB) | Ano (1, 2, 4 KiB) |
| **Sledování stavu FS** | Ano           | Ano         | Ano         |
| **Časová razítka** | Modifikace dat | Modifikace dat | Zlepšená přesnost (nanosekundy), vytvoření, přístup, modifikace |
| **Atributy souborů/adresářů** | Ano           | Ano         | Ano         |
| **Checksumming (kontrola integrity)** | Ne          | Ne (pouze žurnál) | Žurnál, metadata (volitelné) |
| **Perzistentní pre-alokace** | Ne            | Ne          | Ano (rezervace místa na disku pro soubor, zabraňuje fragmentaci) |
| **Transparentní šifrování** | Ne            | Ne          | Ano (od jádra Linux 4.1, prostřednictvím fscrypt) |
| **Odložená alokace (Delayed allocation)** | Ne | Ne | Ano (data nejsou zapsána okamžitě, ale po nashromáždění, zlepšuje výkon) |
| **Rychlejší kontrola FS (fsck)** | Pomalejší | Pomalejší | Rychlejší (díky inode tabulkám a skupinám) |
| **Zpětná kompatibilita** | Kompatibilní s Ext3/Ext4 | Kompatibilní s Ext2; s Ext4 lze připojit | Kompatibilní s Ext2/Ext3 (lze připojit jako Ext3) |

-----

### Další rozdíly a detaily

| Vlastnost            | Detaily                                                                                                                                              |
| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Typy žurnálování (Ext3)** | **Writeback:** Zapisuje pouze metadata do žurnálu. Nejrychlejší, ale při pádu může dojít ke zmatení metadat a dat. \<br\> **Ordered:** Zapisuje metadata do žurnálu a zajišťuje, že data jsou zapsána na disk před metadaty. Dobrý kompromis mezi bezpečností a výkonem. \<br\> **Data:** Zapisuje jak metadata, tak i data do žurnálu. Nejpomalejší, ale nejbezpečnější, zajišťuje nejvyšší integritu dat. |
| **HTree Indexování** | Zlepšuje výkon pro velké adresáře tím, že organizuje položky adresářů do hashovaných stromů, což urychluje vyhledávání. |
| **Inode size (Ext4)** | Standardně 256 bytů (oproti 128 bytů u Ext2/Ext3), což umožňuje více místa pro atributy a časová razítka s vyšší přesností. |
| **Online defragmentace (Ext4)** | Existují nástroje jako `e4defrag`, které umožňují defragmentaci za běhu systému, i když extenty snižují její nutnost. |
| **Záměna souborů (Ext4)** | `fallocate()` systémové volání pro efektivní alokaci místa pro soubory, což je užitečné pro databázové aplikace a virtuální stroje. |
| **Odolnost proti chybám** | Ext4 je díky checksummingu žurnálu a metadat, perzistentní pre-alokaci a dalším vylepšením robustnější proti korupci dat při výpadcích napájení. |
| **Podpora velkých souborů** | Díky 48bitové blokové adresaci a extentům Ext4 výrazně navyšuje limity pro velikost souborů a celých svazků, což je klíčové pro moderní datová centra. |

---

## Co dělají nástroje fsck, debugfs a kdy se používají?

- **fsck**: kontrola a oprava konzistence FS (po pádu, chybě).
- **debugfs**: nástroj pro ruční prohlížení/ext2/3/4 FS (analýza, vývoj).

---

## Jaký je účel žurnálu u ext3/ext4?

- Zajišťuje **konzistenci FS po výpadku**.
- Změny se nejdříve zapisují do žurnálu → po potvrzení se aplikují do FS.
- Zrychluje obnovu po pádu (není třeba úplný fsck).

---

## Jak se obnovuje konzistence FS po pádu systému?

- Pomocí:
  - **Journalingu** (ext3/ext4)
  - **fsck**: provádí kontrolu a opravu
- U non-journal FS (ext2) trvá déle a může dojít ke ztrátám.

---

## Jaké klíčové vlastnosti přináší NTFS?

- **Žurnálování**
- **ACL (Access Control Lists)**
- **Šifrování (EFS)**
- **Diskové kvóty**
- **Komprese**
- **Alternativní datové streamy**

---

## Co je $MFT a jak je strukturováno?

- **Master File Table (MFT)**: hlavní databáze NTFS
- Každý soubor = záznam v MFT
- Obsahuje:
  - Metadata (název, velikost)
  - Ukazatele na datové bloky
  - Atributy (bezpečnost, timestamps)

---

## Co je MTD zařízení a proč se nepoužívá klasické blokové FS?

- **MTD (Memory Technology Device)**: rozhraní pro přístup k flash pamětem
- Používá se pro **raw flash** (bez řadiče)
- Potřebuje specifické FS: JFFS2, YAFFS, UBIFS

---

## Jak funguje zápis do flash (circular log, wear leveling)?

- Flash paměti nelze přepisovat po jednotlivých bajtech.
- Nutné:
  - **Mazat celé bloky**
  - **Wear leveling**: rovnoměrné opotřebení
  - **Log-structured FS**: nové zápisy do volného místa, staré se označí jako neplatné

# Flash paměti a specifické souborové systémy

## Proč klasické FS nejsou vhodné pro flash čipy?

Klasické souborové systémy (např. ext4, FAT) předpokládají:
- Náhodný přístup,
- Časté přepisování bloků,
- Žádné omezení na počet zápisů.

**Flash paměti však:**
- Mají **omezený počet zápisů/mazání** na blok,
- Vyžadují **mazání po větších blocích** (např. 128–512 KB),
- Nelze přepsat záznam přímo → nutnost přepsat celý blok.

📌 Výsledkem by byla rychlá degradace flash paměti a nízká životnost.

---

## Co je MTD zařízení a proč se nepoužívá klasické blokové FS?

- **MTD (Memory Technology Device)** je rozhraní v Linuxu pro **raw flash** paměti (bez FTL – flash translation layer).
- Přímo zpřístupňuje paměť typu NOR/NAND (bez simulace bloku).
- Klasické FS (ext4, FAT) **neumí pracovat s požadavkem mazání po blocích** a s wear levelingem → selhání a poškození paměti.

📌 Proto se používají speciální FS, které s těmito omezeními počítají.

---

## Jak funguje zápis do flash (circular log, wear leveling)?

- **Log-structured FS**: místo přepisování zapisuje nová data **na nové místo**.
- Staré bloky jsou označeny jako **neplatné**, mazány později (garbage collection).
- **Wear leveling**: algoritmus, který se snaží **rovnoměrně opotřebovávat** bloky flash paměti.
  - Dva typy:
    - **Static**: přesun i často neměněných dat
    - **Dynamic**: rotace pouze měněných bloků

---

## Příklady FS vhodných pro flash

| FS         | Vhodný pro     | Vlastnosti                                                 |
|------------|----------------|------------------------------------------------------------|
| **JFFS2**  | NAND/NOR (MTD) | Log-struktura, komprese, pomalé mountování                 |
| **YAFFS2** | NAND (MTD)     | Rychlejší než JFFS2, jednoduchost                          |
| **UBIFS**  | NAND (MTD)     | Nahrazuje JFFS2/YAFFS2, lepší škálování                    |
| **F2FS**   | eMMC/SD (s FTL)| Flash-friendly FS od Samsungu, běží nad blokovým zařízením |

---

## Shrnutí rozdílů mezi klasickými a flash-friendly FS

| Vlastnost             | Klasické FS (ext4, FAT)  | Flash-friendly FS (UBIFS, F2FS)  |
|-----------------------|--------------------------|----------------------------------|
| Zápis na místo        | Ano                      | Ne – vždy nový záznam            |
| Mazání před zápisem   | Neřeší                   | Ano – správa bloků               |
| Wear leveling         | Není                     | Ano                              |
| Pomalý zápis          | Možný                    | Optimalizovaný pro flash         |
| Žurnálování           | ext3/4 – ano             | Různé přístupy (log, checkpoint) |

# Letem světem Filesystémy

## FAT - File allocation table

- klasicky 2 kopie FAT
- FAT12, 16, 32 -> význam -> kolik bitů pro FAT entry
- Boot sector - reserved sectors - FAT1 - FAT2 - Root folder - Data
- 4 oblasti zvlášť pro každou partition
    - Boot record - na začátku partition
        - Definuje partition a říká, kde jsou ostatní 3 oblasti dané partition
        - Jestli je to bootable, obsahuje taky kód potřebný pro boot
    - FAT (1, 2) - lookup table jako linked list
    - Root dir
        - Fixed délka, hned za FAT ve FAT12 a FAT16
    - Data
- Partition je rozdělena do clusterů (2 kB ~ 32 kB)
- Soubor je chain clusterů
- **Stavy clusteru** ve FAT
    - Unused
    - Used by a file (neposlední - ukazuje dál)
    - Last cluster in a file
    - Bad cluster
- FAT entry
    - Name (8.3)
    - Atributy (1 byte)
    - Create time, date (3 + 2 bytes)
    - Last access date (2 bytes)
    - Last modified time, date (2+2)
    - Starting cluster (2 nebo 4)
    - File size (4)
- Long names
    - Pro VFAT -> nemají nativně 12 a 16
        - 32 už má VFAT v sobě, takže tam už nativně
    - Další entries (jsou před tím reálným entry, ta první (resp. poslední - jsou v opačném pořadí) má název ORnutý s 0x40), každý má 13 dalších unicode znaků
    - Pak teprv ten reálný s 8.3, kde se nechá přípona a na poslední místa fname (8) se dává "-1"
        - Atribut LFN
        - Pozná se to podle checksumu asi - každý má checksum toho 8.3
- Limity
    - Max 512 root entries
    - FAT16 max 65536 clusterů
    - Neefektivní na větších partitionech
    - Žádná komprese a securita

### exFAT
- File size: 16 EB
- Disk size: 128 PB
- Metadata integrity - checksums
- Performance++ (allocation bitmap)
- Podpora transakcí (optional)
- Stream extension
    - File directory entry (atributy, timestamp)
    - Stream extension entry
        - Data length (velikost souboru)
        - Valid data length (kolik je platných dat - zbytek může být naalokovaný, ale ještě nevynulovaný)
        - First cluster
        - Cluster count
        - Flags (souvislé nebo je nutné projít FAT?)
            - Souvislý - start + count
                - Nemusí být ve FAT - pro hledání free místa je bitmapa, takže se nemusíme srát s FAT
            - Nesouvislý - FAT

## Ext - Extended file system

### Ext
- File size: 2 GB
- Partition size: 2 GB
- První systém
- Fname: 255
- Jen jedna timestamp (created)
    - Přesnost na sekundy
- Pro free space --> linked-list

### Ext2
- File size: 2 TB
- Volume size: 32 TB
- **Cca 5 % bloků je rezervovaných pro superusera**
- ACL (oprávnění)
- Extended Attributes
- Logický blok může nastavit admin (1, 2, 4 kiB)
- Modification timestamp
    - Přesnost na sekundy
- Data structure
	- Místo rozděleno na bloky --> block groups
	- Boot sector - [block groups]
	- Block group
		- Superblock (v pozdějších revizích jen některé groupy)
		- Group descriptor
		- Block bitmap
		- Inode bitmap
		- Inode table
		- Data blocks
    - **Bitmapy** mapují, které bloky a které inodes jsou použity
	- **Superblock**
	    -  **Metainfo o celém FS**
	    -  **Popisuje basic size and shape**
	    -  Co to je za fs?
	    -  Jak velké jsou bloky?
	    -  Kolik bloků (obsazených / volných) tam je?
	    -  Kolik inodes (obsazených / volných)?
    - **Inode** = základní stavební kámen
        - **Každý soubor (složka) je popsán právě jedním inode (128 bytů)**
        - Název nemá - inode je basically link na ten soubor - podporuje tak hardlinky jednoduše
            - Složky (resp. entries) jsou ve formátu "**inode** - rec_len - name_len - file_type - **name**"
                - Každý řádek je link
                - Soubory se hledají pomocí full path a po levelech se takhle sestupuje po inodech
        - Obsahuje všechny důležité informace:
            - Mode
            - Owner info
            - 3 timestampy
            - **Datablocky**
                - Pointery na bloky s daty
                - 12 direct blocků (ptr -> data)
                    - Každý z nich má kapacitu 1 * block_size
                - single indirect (ptr -> blok pointerů -> data)
                    - Když máme 4kB block a ptr délky 4B, tak to je 1024 pointerů na block -> 1024 * 4kb = 4 MB pro 1 single indirect
                - double indirect (ptr -> blok pointerů -> blok pointerů -> data)
                    - 1024 * 1024 * 4096 = 4 GB
                - triple indirect
                    - 1024 * 1024 * 1024 * 4096 = 4 TB
                        - Limit ext2/3 je 2TB, protože je tam 32bit field "i_blocks" -> kolik má inode bloků. A tam se vleze jen 2^32 => 2 TB

	- Superblock + Inodes -> jsou systémové propky -> mají fixed format a nejdou přímo upravovat

### Ext3
- File size: 2 TB
- Volume size: 32 TB
- Jde předělat na ext2 a naopak bez backup / repartitioning
    - Ext2 je furt lepší na flashky, protože míň zápisů (ne journal)
- Nové featury
    - **Žurnál**
    - **Online FS growth**
    - HTree indexing pro větší složky (32bit)
- Žurnál levely
    - **Journal** (lowest risk) - vše se píše do žurnálu před commitem do FS
    - **Ordered** (medium risk) - jen metadata do žurnálu; nejdřív zápis dat, pak commit metadat
    - **Writeback** (highest risk) - jen metadata do žurnálu
- Block allocator
    - Začíná ze stejné groupy, kde je daná inode struktura (kde je složka, do které píšu) - ať je to blízko u sebe
    - **Konkurence**
    -  -> block reservation
    - Pořád bitmapy na free block reservation
- Nevýhody
    - Max 31 998 podsložek ve složce
    - Není online defrag
    - Čas jako 32bit unix (max 2038)

### Ext4
- File size: **16TB**
- Volume size: **1EB**
    - obojí pro 4kB block size
- **48bit block adresace**
- **Extent**
    - Mapuje části souborů na oblasti (range bloků)
    - Větší soubory - extent tree
- Neomezený počet podsložek
- **Checksum**
    - Metadata a Journal
- Alokace bloků
    - **Multiblock allocator**
    - **Persistent prealloc**
        - Aplikace řekne
    - **Delayed alloc**
        - Alokuje až na flush(), ne na write()
        - Spojí se tak víc alokací do jendoho requestu -> menší fragmentace, šetří CPU
- Online defrag
- Lepší timestamps
    - Nanosekundy
- Transparent encryption

### FSCK - File System ChecK
- A taky chdsk
- Když systém crashne - disk nemusí být konzistentní
- Scan všech inodů -> každý blok musí náležet právě jednomu inodu, NEBO je na free listu
- Počet linků na každý soubor musí být korektní (prohledání všech složek)
- Většinou nabízí fix
- Plus další checky


## NTFS
- **Nástupce FAT**
- **Journaling**
- **Encryption**
- **ACL**
- **ADS (Alternativní data streamy)**
- **Komprese**
- **Sparse files**
- **Disk quotas**
- **Reparse points**

### NTFS
- Vše je soubor
- **$MFT** - Master File Table
    - Záznam pro každý soubor a složku (včetně sebe)
    - Záznamy 1024 B
    - Header "FILE" pro identifikaci záznamu
    - Struktura záznamu
        - Header - Attributes
        - Common atributy
            - $Standard_Information
                - Má flagy, timestampy apod
            - $File_Name
                - Názvy souboru -> normální název i 8.3 pro zpětnou kompatibilitu
            - $Data
                - Ukazuje na data souboru
                - **Formát "start cluster - length" pro každý soubor**
                - Pokud je soubor malý - data jsou přímo v $Data
    - 12 % disku je alokováno pro $MFT
- 64bit timestampy -> stovky nanosekund od 1601
    - Created
    - Modified
    - Accessed
    - MFT entry modified
- Velikost souboru
    - Logická => Jak velký se ten soubor tváří pro aplikaci (sparse files)
    - Initialized => kolik dat tam reálně je zapsaných
    - Fyzická => kolik místa to zabírá (bloky)
- Sparse files
    - Časté pro virtuální disky (virtualbox)
        - Taky pro databáze apod
    - Soubor může mít plno volného místa, jen některé oblasti s reálnými daty
        - Real oblasti se smrsknou k sobě a zapíšou na disk
        - Prázdné oblasti (sparse zeros) -> nejsou zapsány na disku -> když se na ně aplikace zeptá, FS vrátí nuly
- ADS - Alternativní Data Streamy
    - Každý soubor má $Data stream (nepojmenovaný) - ten jde normálně vidět
    - Další pojmenované streamy
        - example.txt:stream1
        - Viditelné jen pro NTFS volumes
    - Často pro metadata apod.
    - Lze zobrazit např. pomocí dir /r
    - Normálně (obyč. dir nebo explorer) vidět nejsou
        - Umožňuje takhle nenápadně schovávat např. malware nebo jiná data (moderní toolky to ale prozkoumávají)
- USN Journal a $LogFile
    - USN = Update Sequence Number
    - Při vytvoření / smazání / změně souboru (složky) se udělají entries do \$UsnJrnl:\$J
    - Featura pro rychlý recover
    - $LogFile
        - Pro obnovu konzistence metadat po sys failu
        - Má INDX, MFT a LNK records

## MTD - Memory technology device
- FTL - Flash Translation Layer (řadič flash paměti)
    - Stará se o flash paměť
    - Eraseblock - data lze mazat jen po velkých blocích
    - Wear levelling
    - Detekce a správa špatných bloků
- Když flash paměť nemá FTL (řadič) - musí se o to postarat FS -> MTD
- MTD je abstrakční vrstva pro flash paměti
    - Umožňuje práci
        - **Nestará se o wear levelling ani o špatné bloky**
    - Zpřístupňuje zařízení jako character nebo block devices
        - /dev/mtdX
        - /dev/mtdblockX -> ještě k tomu neefektivní zápis (mazání po blocích)
    - Aby to zajišťovalo flash-aware funkce, je potřeba FS, který to řeší
    - JFFS2, YAFFS, UBIFS
        - Při použití klasických FS dochází k rychlému opotřebení a neefektivní práci

### JFFS
- Log structured FS
- Operuje přímo na flash pamětech
- Stará se o wear levelling
    - **Enforcuje to - chová se k tomu jako k circular logu**
    - Každá změna se zapisuje na konec logu v nodech

#### JFFSv1
- V logu jenom jeden typ node (jffs_raw_inode)
    - Každý node asociovaný s jedním inode
    - Header s inode num, sys metadata pro inode, může mít trochu dat
- **Každý node má verzi - zapisuje se vždy verze vyšší než mají ostatní nody pro tu samou inode**
- Inode nums - 32bit - nikdy se nerecyklují
- Každý zápis upravuje ten log
    - Node 1 - zapiš data
    - Node 2 - přidej data
    - Node 3 - přepiš část dat ...
- Některé nody jsou zbytečné (dirty space) - byly přepsány
    - Garbage collector - nechá jen ty reálně potřebné nody
        - Smaže všechny a ty užitečné napíše na nové místo na konec - circular

#### JFFSv2
- Podporuje NAND flashky
- Hard links
- Komprese
- **Bloky** - velikost = erase segment flash média
- Něco málo si drží v RAM (jffs2_raw_node_ref)
- Bloky se postupně plní (jeden za druhým)
    - Clean - má jen validní nody
    - Dirty - má aspoň jeden obsolete node a bude potřebovat garbage collection
    - Free - žádné nody


## FS Summary

### Klasické
- Linked FS
    - Všechna data jako singly linked list (data + odkaz na další cluster)
- FAT
    - Allocation table - linked list je v FAT, data zvlášť samostatně
- NTFS
    - Všechny soubory a složky v MFT, odkaz na data jako seznam dvojic "start, len"
- Inode
    - Data v inode (právě 1 pro každý soubor) a 12 direct pointerů a 3x indirect (single, double, triple)

### Mobile devices
- Block devices
    - Ext2 - vše super, jen není úplně space efficient
    - cramfs - malý FS (compressed rom fs), good pro embedded, **read onlyš**
    - squashfs - Větší (pokročilejší), super komprese ale horší performance
    - romfs - malý kernel module, nemá kompresi
- Flash
    - JFFS2 - Ok, ale slabý výkon (hlavně mount + write time)
    - YAFFS2 - NAND flashky, taky trošku lackuje výkon
- Memory
    - initramfs - kompletní support na permissions a ownership, načítá se do ram při startu systému (není persistent)
