Linux: Kniha kouzel, vanilková příchuť 2.14 (15. července 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

4.1. Diskové oddíly / Btrfs

Řada 2.x vanilkové příchuti Linuxu: Knihy kouzel je od 15. července 2022 do 1. března 2025 ve stavu dlouhodobé pasivní údržby; nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje jiným projektům. Máte-li zájem pokračovat v tvorbě Linuxu: Knihy kouzel pro novější verze linuxových operačních systémů, kontaktujte autora nebo rovnou vytvořte odnož.

1. Úvod

Tato kapitola se zabývá prací se souborovým systémem typu Btrfs způsoby, které nejsou dostupné u souborových systémů typu ext4.

2. Definice

2/1 Btrfs

  • Souborový systém typu btrfs se dělí na takzvané pododdíly. Každý pododdíl je reprezentován svým vlastním „kořenovým“ adresářem. Reprezentující adresář představuje jednoznačnou hranici mezi vnějším (obklopujícím) pododdílem a vnitřním (vnořeným) pododdílem. Pododdíly se vždy překrývají pouze tímto hraničním adresářem, jinak jsou oddělené. Operace prováděné s obklopujícím pododdílem (např. klonování) se vnořeného pododdílu netýkají. (V důsledku toho, když naklonujete pododdíl, hraniční adresáře v něm vnořených pododdílů budou v klonu prázdné.) Každý pododdíl má také svoje číselné „id“, ale jeho používání není příliš praktické.
  • Kořenový pododdíl je pododdíl reprezentovaný kořenovým adresářem souborového systému. Nemá žádný obklopující pododdíl, má vždy id 5 a není možno ho (samostatně) odstranit ani přesunout.
  • Klon (reflink/snapshot) je v btrfs virtuální kopie souboru nebo celého pododdílu, která se navenek chová jako zcela nezávislá kopie, ale vnitřně sdílí část datových či metadatových bloků s původním souborem či pododdílem, dokud se do nich nikdo nepokusí zapisovat (teprve poté se vytvoří skutečné kopie, ale jen bloků, u kterých je to potřeba). Díky tomu je vytváření klonů rychlé, nenáročné a klony zprvu zabírají jen velmi málo místa.
  • Pododdíl může být označený jako „neměnný“ (toto označení lze přidat či odebrat i dodatečně); neměnný pododdíl je chráněný proti změnám dat i metadat, bez ohledu na přístupová práva, může však být odstraněn jako celek. Nejčastěji se jako neměnné nastavují klony pododdílů.
  • Zrcadlené oddíly jsou dva oddíly, kde každá změna je zapisována paralelně na oba, takže v případě poškození či ztráty jednoho z nich nedojde ke ztrátě dat.

Poznámka k pevným odkazům: pevný odkaz v souborovém systému typu btrfs nemůže vést přes hranici pododdílu, místo toho však lze přes hranici pododdílů vytvořit klon souboru.

3. Zaklínadla

3/1 Formátování

@formátovat samostatný oddíl na btrfs (obecně/příklad)#1
sudo mkfs.btrfs [-f] [-L "Jmenovka"] [-U UUID] /dev/zařízení-nebo-oddíl
sudo mkfs.btrfs -f -L "Můj nový oddíl" /dev/sda3
@formátovat zrcadlené oddíly na btrfs (obecně/příklad)#2 (1)(2)
sudo mkfs.btrfs -d raid1 -m raid1 [-f] [-L "Jmenovka"] [-U UUID] /dev/zařízení-nebo-oddíl-1 /dev/zařízení-nebo-oddíl-2
sudo mkfs.btrfs -d raid1 -m raid1 -f -L "Zrcadlo" /dev/sda3 /dev/sdb1
@změnit velikost souborového systému typu btrfs (na udanou velikost/na celý oddíl)#3 (3)
sudo btrfs filesystem resize cílová-velikost-P /přípojný/bod
sudo btrfs filesystem resize max /přípojný/bod

3/2 Jmenovka (nastavit)

@nastavit/smazat jmenovku btrfs#1 (4)
sudo btrfs filesystem label specifikace/oddílu "Nová jmenovka"
sudo btrfs filesystem label specifikace/oddílu ""
@zjistit jmenovku oddílu btrfs (připojeného/nepřipojeného)#2
sudo btrfs filesystem label /přípojný/bod
sudo btrfs filesystem label /dev/oddíl

3/3 Degrafmentace, kontrola, TRIM apod.

@zkontrolovat a opravit souborový systém#1
@zkontrolovat souborový systém typu btrfs#2
sudo btrfs check --readonly [--progress] /dev/oddíl
@vynulovat volné bloky#3
@defragmentovat oddíl typu btrfs (pozor!)#4

3/4 Správa pododdílů

@vytvořit pododdíl (obecně/příklad)#1 (5)
btrfs subvolume create cesta/k/novému/adresáři
btrfs subvolume create test
@smazat pododdíl#2 (6)
[btrfs property set cesta/k/pododdílu ro false]
[sudo] btrfs subvolume delete -c cesta/k/pododdílu
@vypsat seznam pododdílů (s právy superuživatele/bez nich)#3
(cd /bod/připojení/btrfs && pwd && sudo btrfs subvolume list . | sed -E 's/^(\S+\s+){7}path\s/'"$(pwd | sed -E 's!/!\\/!g')"'\//')
find /abs/cesta/přípojného/bodu -type d -inum -257 -print
@přejmenovat či přesunout pododdíl (kromě neměnného)#4 (7)
mv -T cesta/pododdílu nové/umístění
@přejmenovat či přesunout neměnný pododdíl#5
btrfs property set původní/cesta ro false
mv [-v] původní/cesta nová/cesta
(rv=$?; for x in {původní/cesta} {nová/cesta}; do btrfs property set "$x" ro true 2>/dev/null; done; exit $rv)
@nastavení pododdílu jako neměnného (vypnout/zapnout)#6
btrfs property set cesta/k/pododdílu ro false
btrfs property set cesta/k/pododdílu ro true
@je adresář pododdíl btrfs?#7 (8)
adr="$(realpath "cesta/k/adresáři")"
[test "$(stat -fc %T "$adr")" = btrfs &&] test "$(stat -c %i "$adr")" -le 256
@je pododdíl neměnný?#8
btrfs property get cesta/k/adresáři ro | fgrep -qx ro=true

3/5 Klonování

@vytvořit klon podstromu adresářů#1 (9)
[rm -Rf /cesta/pro/klon &&]
cp --reflink=always -R [--preserve=all] [-v] /cesta/k/adresáři /cesta/pro/klon
@vytvořit klon pododdílu (normální/neměnný)#2
btrfs subvolume snapshot cesta/k/pododdílu cesta/k/novému/pododdílu
btrfs subvolume snapshot -r cesta/k/pododdílu cesta/k/novému/pododdílu
@vytvořit klon souboru#3
cp --reflink=always [--preserve=all] [-t] [-v] /cesta/k/souboru /cesta/pro/klon
@osamostatnit klon souboru, aby nevyužíval sdílené datové bloky#4
btrfs filesystem defragment [-v] [--] cesta/k/souboru

3/6 Práce s oddíly

@přesunout souborový systém z jednoho oddílu na jiný#1 (10)
sudo bash -c '
btrfs device add /dev/nový-oddíl /přípojný/bod || exit $?
btrfs device remove /dev/původní-oddíl /přípojný/bod ||
(r=$?; btrfs device remove /dev/nový-oddíl /přípojný/bod; exit $r)
'
@vytvořit dva zrcadlené oddíly z jednoho samostatného#2
@osamostatnit oddíl ze zrcadlené dvojice#3
@vyvořit N-tici prokládaných oddílů z neprokládaného jednooddílového btrfs#4
@vytvořit jednoduchý oddíl BTRFS z prokládané N-tice#5

3/7 Přenos neměnných pododdílů přes soubor

@uložit neměnný pododdíl do souboru#1 (11)
sudo btrfs send -e[v] /cesta/k/pododdílu | gzip >cílový/soubor.gz
@načíst neměnné oddíly ze souboru#2 (12)
zcat soubor.gz | sudo btrfs receive -e[v] výstupní/adresář
@zkontrolovat v souboru uložené neměnný oddíly#3
zcat soubor.gz | btrfs receive --dump

3/8 Ostatní

@vypsat podrobné údaje o obsazení souborového systému#1
[sudo] btrfs filesystem usage /přípojný/bod/btrfs
@ověřit kontrolní součty všech souborů#2
sudo btrfs scrub start -B -d -r /přípojný/bod/btrfs
@ověřit kontrolní součty některých souborů#3
@defragmentovat pododdíl#4
sudo btrfs filesystem defragment -r cesta/pododdílu

3/9 Přenos rozdílu klonů

Pozor! Tyto operace slouží k přenosu změn z jednoho oddílu btrfs na jiný (obvykle na jiném počítači) a mají poměrně tvrdé požadavky na to, co musejí klony na jednom i druhém počítači splňovat. Před jejich použitím si musíte přečíst manuálové stránky vyvolané příkazem „man 8 btrfs-send btrfs-receive“.

@uložit do souboru rozdíl#1
sudo btrfs send -e[v] -c /cesta/k/původnímu-klonu /cesta/k/novému/klonu | gzip >cílový/soubor.gz
@aplikovat rozdíl#2
zcat soubor.gz | sudo btrfs receive -e[v] výstupní/adresář

4. Nejdůležitější volby připojení (Btrfs)

☐ user_subvol_rm_allowedUmožní smazat pododdíl jeho vlastníkovi (doporučuji).
☐ skip_balancePo připojení nebude pokračovat v přerušené operaci „balance“. Tento parametr se používá především v situaci, kdy operace „balance“ selhala kvůli nedostatku místa na disku a způsobila vynucený přechod souborového systému do režimu „ro“ (jen pro čtení).
○ compress-force=hodnota ○ compress=hodnotaNastavuje výchozí kompresi pro nově vytvořené soubory. Použijte hodnotu „off“ pro žádnou kompresi, „lzo“ pro nenáročnou kompresi, „zstd:10“ pro důkladnou kompresi nebo „zstd:15“ pro maximální kompresi.
☐ degradedUmožní připojit oddíl zrcadleného systému souborů v situaci, kdy některé ze zařízení není dostupné. Doporučuji skombinovat s volbou „ro“.
○ discard ○ nodiscardZapne/vypne automatické označování prázdného prostoru na SSD discích (operace TRIM). Možná není nutné ho zadávat.
○ subvol=/cesta ○ subvolid=idPřipojí zadaný pododdíl namísto výchozího (což je zpravidla ten kořenový). Varování: jeden souborový systém typu btrfs je dovoleno připojit vícenásobně (na různé přípojné body), ale pokud se chcete vyhnout problémům, použijte u všech připojení přesně stejné volby až na „subvol“ či „subvolid“ (vyzkoušel/a jsem, že další volby, které se mohou bezpečně lišit, jsou *atime a ro/rw).

Manuálová stránka pro zlepšení výkonu doporučuje použít obecnou volbu „noatime“.

5. Instalace na Ubuntu

Pro podporu Btrfs je nutno doinstalovat:

sudo apt-get btrfs-progs

6. Tipy a zkušenosti

  • Btrfs se prý nedokáže dobře zotavit ze selhání a chyb (i v manuálové stránce je varování, že program „btrfs check“ může problémy spíš zhoršit než vyřešit). Pokud dojde prostor pro metadata, souborový systém se nuceně přepne do režimu „jen pro čtení“ a je obtížné či skoro nemožné se z takového stavu zotavit – viz stránku na superuser.com. Navíc, když se mi to stalo, souborový systém stále hlásil cca 500 MiB volných. Proto doporučuji si za všech okolností nechávat jeden až dva gibibajty každého oddílu typu btrfs volné a jednou za čas provést „offline zálohu“ metodou sektor po sektoru, aby bylo v případě havárie možno obnovit původní obsah a funkčnost oddílu.
  • Pododdíly se v některých ohledech chovají jako samostatně připojené souborové systémy – každý pododdíl má vlastní číslování i-uzlů (proto nejsou dovoleny pevné odkazy přes hranice pododdílu) a nástroje, které nepřekračují hranice souborových systémů (např. „find“ s parametrem „-xdev“), nesestoupí do adresáře reprezentujícího pododdíl. Důležitým technickým rozdílem oproti připojenému systému souborů však je, že adresář reprezentující pododdíl se nepovažuje za přípojný bod VFS a pododdíly nejsou viditelné pro příkazy jako „findmnt“.
  • Příznak neměnnosti se při klonování nepřenáší; pokud ho nenastavíte (např. parametrem „-r“), do klonů neměnného oddílu půjde zapisovat, což může být velmi užitečné (můžete např. vytvořit neměnný klon pododdílu a později původní pododdíl smazat a nahradit ho obyčejným klonem z neměnného klonu).
  • Umístění odkládacího souboru na souborový systém btrfs je možné, ale nedoporučuji to. Přesný postup a související omezení najdete v manuálové stránce zobrazené příkazem „man 5 btrfs“ (kapitola „SWAPFILE SUPPORT“).
  • Doporučuji se vyhýbat volbám připojení „subvol“ a „subvolid“; pro připojení pododdílů na různá místa souborového systému raději použijte „mount --bind“, resp. jeho obdobu v /etc/fstab.
  • Klonování pododdílu je velmi rychlé i u rozsáhlých pododdílů; naopak klonování jednotlivých souborů je sice podstatně rychlejší než jejich kopírování, ale pomalejší než vytváření pevných odkazů na ně.
  • Velmi špatná vlastnost Btrfs je, že je asynchronní – operace vypadají, že rychle a úspěšně proběhly, ale za několik minut souborový systém může zhavarovat, když „naslibovanou“ operaci nedokáže provést.
  • Transparentní komprese je jen zřídka užitečná. Její účinnost ve srovnání s archivy či SquashFS je mizivá, u dobře komprimovatelných textových souborů ušetří maximálně desítky procent kapacity, zatímco běžný „zip“ u stejných dat dokáže ušetřit třeba 95% jejich velikosti. Navíc většina dnes používaných formátů, které zabírají hodně místa, už komprimovaná je, takže je u nich další komprese zcela neúčinná.

7. Další zdroje informací

8. Zákulisí kapitoly

V této verzi kapitoly chybí:

  • nic

Tato kapitola záměrně nepokrývá:

  • nic
1 Poznámka: zrcadlené oddíly jsem zatím nezkoušel/a.
2 Zrcadlené oddíly by měly být stejně velké a nacházet se na dvou různých fyzických úložištích. Také se doporučuje, aby obě úložiště nabízela přibližně stejnou rychlost čtení i zápisu, jinak mohou nastat problémy s výkonem. Při připojování pak stačí připojit jen jeden z oddílů a systém automaticky najde a připojí i to druhé.
3 Souborový systém musí být připojený, aby bylo možno změnit jeho velikost!
4 „Specifikace oddílu“ je v případě nepřipojeného oddílu „/dev/oddíl“, v případě připojeného oddílu je nutno uvést jeho přípojný bod. Příkaz selže s chybou, pokud uvedete připojený oddíl označením ve tvaru /dev/oddíl! Jmenovka může mít pravděpodobně maximálně 256 bajtů a nesmí obsahovat znak konce řádku nebo nulový bajt.
5 Příklad vytvoří poddíl reprezentováný novým adresářem „test“ v aktuálním adresáři. (Nově vytvářený adresář nesmí předem existovat!)
6 Pokud souborový systém nebyl připojen s volbou „user_subvol_rm_allowed“, smí pododdíl smazat jen superuživatel. Jinak ho smí smazat i jeho vlastník (tzn. vlastník adresáře reprezentujícího pododdíl); pokud je však oddíl neměnný, musí mu tuto vlastnost nejprve odebrat. Vlastník také může pododdíl smazat jako obyčejný adresář příkazem „rm -R“, ale ten bývá pomalejší, protože nejprve projde a smaže všechny soubory a adresáře v daném pododdílu.
7 Nové umístění musí být v rámci téhož souborového systému btrfs, ale může to být i v jiném obklopujícím pododdílu. Poznámka: neměnný pododdíl nelze přejmenovat či přesunout.
8 Pokud víte s jistotou, že testovaný adresář leží na oddílu typu btrfs, můžete první test vynechat.
9 Cíl („/cesta/pro/klon“) před vykonáním příkazu nesmí existovat. Poznámka: Naklonují se pouze soubory; adresáře se pro ně vytvoří nové, takže pokud je podstrom rozsáhlejší, bude to chvíli trvat.
10 Cílový oddíl může být menší i větší než původní, musí se však na něj vejít všechna data a metadata.
11 Pokud ukládáte více pododdílů, jejich reprezentující adresáře se musejí lišit jménem, a to i v případě, že leží v různých podadresářích!
12 Příkaz vytvoří ve výstupním adresáři pododdíly uložené v souboru pod jejich původními názvy a na konci operace je nastaví jako neměnné.
Líbí se vám tento projekt a chcete, aby byl ještě lepší? Můžete mi s tím pomoci. Zmiňte se o něm technicky zdatným přátelům, opravte překlepy a nahlašte nefunkční zaklínadla, aby mohla být opravena; poskytněte mi zpětnou vazbu nebo se zapojte do vývoje nových kapitol. Další informace na GitHubu v dokumentu Jak se zapojit.
[BY-SA]

Veškerý obsah této stránky (text, obrázky, zdrojový kód) je možno upravovat a šířit pod podmínkami licence Creative Commons Attribution-ShareAlike 4.0 International. Upozorňuji, že uvedená licence vyžaduje uvedení seznamu autorů, licence a zdroje a poskytnutí stejné či kompatibilní licence k provedeným změnám, jsou-li nějaké. Příslušné údaje jsou dostupné na stránce „Přehled autorů“. Šíření obsahu bez těchto údajů nebo šíření upravené verze bez poskytnutí adekvátní licence k provedeným úpravám je pravděpodobně porušení licenčních podmínek a může být postihováno. Poskytování zdrojového kódu při šíření není touto licencí vyžadováno.

Pro nové verze, další informace, aktuální zdrojový kód a možnost se zapojit do projektu „Linux: Kniha kouzel“ navštivte jeho repozitář na GitHubu.