8.5 BTRFS snapshotok kezelése
Az előző fejezetekben átvettük, hogyan menthetjük el az adatainkat fájlszinten (tar, gzip) és hogyan szinkronizálhatjuk őket intelligensen eszközök között (rsync). Ezek a módszerek kiválóak, de van egy közös jellemzőjük: időbe telik a végrehajtásuk, és aktív lemezműveletekkel járnak.
Mi van akkor, ha egy olyan rendszerszintű védőhálót szeretnél, ami az ezredmásodperc tört része alatt képes elmenteni a rendszered teljes aktuális állapotát? Egy olyan biztonsági mentést, ami egy kernelfrissítés vagy egy komolyabb rendszermódosítás előtt egy pillanat alatt elkészül, nem foglal extra helyet a lemezen, és ha valami félremegy, egyetlen újraindítással teljesen visszaállítható a működő állapot?
Ez nem mágia, hanem a modern Linux disztribúciók (például a Fedora, a Nobara vagy az atomi struktúrájú rendszerek) által alapértelmezetten használt BTRFS (B-Tree File System) fájlrendszer natív szuperereje. Ebben a fejezetben megtanuljuk a BTRFS al-kötetek (subvolumes) és pillanatképek (snapshots) kezelését parancssorból.
8.5.1 A Copy-on-Write (CoW) technológia és a snapshot lényege
A hagyományos fájlrendszerek (mint a jól ismert ext4) úgy működnek, mint egy klasszikus füzet: ha átírsz egy sort, a régi adatot kiradírozod, és felülírod az újjal. Ezzel szemben a BTRFS egy úgynevezett Copy-on-Write (CoW), azaz „másolás íráskor” alapú fájlrendszer.
Amikor a BTRFS fájlrendszeren módosítasz egy fájlt, a rendszer nem írja felül a régi adatblokkokat, hanem az új adatot egy teljesen új, szabad területre vési fel, majd a fájlrendszer mutatóját (pointer) egyszerűen átirányítja az új helyre. A régi adatblokkok egészen addig érintetlenül a lemezen maradnak, amíg a rendszernek nincs szüksége rájuk, vagy amíg egy parancs el nem engedi őket.
Ez a működési elv teszi lehetővé a snapshot (pillanatkép) létrehozását. A snapshot nem más, mint egy speciális al-kötet, amely osztozik az eredeti fájlok adatblokkjain.
- Amikor létrehozol egy snapshotot, az 0 bájt extra helyet foglal a merevlemezen.
- A folyamat azonnali (instant), függetlenül attól, hogy a mappa mérete 10 MB vagy 4 Terabájt.
- Extra lemezterületet csak akkor kezd el fogyasztani a mentés, amikor az élő rendszeren elkezded módosítani vagy törölni a fájlokat: ekkor a CoW mechanizmus miatt az újonnan keletkező adatok különválnak, de a snapshot mereven őrzi a mentés pillanatában érvényes régi blokkokat.
8.5.2 Alkötetek vs. partíciók
A BTRFS-ben el kell felejtenünk a merevlemezek merev, fizikai particionálását. A BTRFS egyetlen nagy közös tárhelycsokrot (storage pool) használ, amelyen belül úgynevezett alkötetek (subvolumes) hozhatóak létre.
Egy alkötet pontosan úgy viselkedik, mint egy normál mappa (látod a fájlkezelőben, írhatsz bele), de a fájlrendszer szintjén önálló egységként kezelhető: külön lehet csatolni (mount), külön kvótákat lehet rá szabni, és ami a legfontosabb: csak alkötetekről lehet snapshotot készíteni.
Nézzük meg, hogyan listázhatod ki a rendszered aktuális al-köteteit! Ehhez rendszergazdai (sudo) jogra lesz szükség:
sudo btrfs subvolume list /
A kimenetben valami hasonlót fogsz látni:
ID 256 gen 12345 top level 5 path root
ID 257 gen 12345 top level 5 path home
Ez azt mutatja, hogy a rendszered külön választotta a gyökérkönyvtárat (root, ahol a rendszerfájlok vannak) és a felhasználói adatokat (home). Ez zseniális, mert így a rendszerről készíthetsz pillanatképet anélkül, hogy a személyes fájljaidat vagy a letöltött játékaidat megbolygatnád.
8.5.3 Snapshot készítése manuálisan
Tegyük fel, hogy egy komolyabb parancssori kísérletezésbe vagy konfiguráció-módosításba kezdesz egy tesztmappában, ami egy BTRFS alkötet, vagy közvetlenül a rendszered egy biztonságos részén található.
1. Egy teszt alkötet létrehozása
Csak a gyakorlás kedvéért hozzunk létre egy tiszta alkötetet a /mnt mappában vagy a saját home könyvtárad egy csatolt pontján (a példa kedvéért tételezzük fel, hogy a /btrfs-pool a BTRFS gyökér-elérése):
sudo btrfs subvolume create /btrfs-pool/projekt_elo
Tegyünk bele néhány fontos fájlt, mintha ezen dolgoznánk:
sudo touch /btrfs-pool/projekt_elo/kod.py
sudo touch /btrfs-pool/projekt_elo/adatbazis.db
2. Írható-olvasható (Read-Write) snapshot készítése
Mielőtt valami veszélyes műveletet végeznénk a projekten, készítsünk egy azonnali mentést. A btrfs subvolume snapshot parancsnak meg kell adni a forrás alkötetet és a leendő snapshot nevét/helyét:
sudo btrfs subvolume snapshot /btrfs-pool/projekt_elo /btrfs-pool/projekt_mentes_01
Kimenet: Create a snapshot of '/btrfs-pool/projekt_elo' in '/btrfs-pool/projekt_mentes_01'
A másodperc törtrésze alatt létrejött a projekt_mentes_01. Ha belenézel, a fájlok pontosan ott vannak.
3. Írásvédett (Read-Only) snapshot készítése (Ajánlott módszer)
Ha a snapshotot valódi, megváltoztathatatlan biztonsági mentésnek szánod (amit véletlenül sem akar elrontani semmilyen script vagy vírus), érdemes kitenni a -r kapcsolót. Ez egy zárolt, írásvédett pillanatképet eredményez:
sudo btrfs subvolume snapshot -r /btrfs-pool/projekt_elo /btrfs-pool/projekt_biztonsagos_ro
Ha ebbe a projekt_biztonsagos_ro mappába megpróbálsz sudo-val is beleírni vagy törölni belőle, a Linux kíméletlenül elutasítja: Read-only file system.
8.5.4 Rendszer-visszaállítás (Rollback) élesben
Most szimuláljuk a katasztrófát! Tegyük fel, hogy a projekt_elo mappában dolgozol, és véletlenül kiadsz egy hibás törlési parancsot, vagy egy elrontott script felülírja a fontos adatbázisodat:
sudo rm /btrfs-pool/projekt_elo/adatbazis.db
# A fájl megsemmisült az élő rendszerben!
Mivel van egy másodperccel korábbi snapshotunk (projekt_mentes_01), a visszaállítás pofonegyszerű. Nem kell fájlokat másolgatni (ami órákig tartana nagy méret esetén), egyszerűen megcseréljük az alkötetek neveit!
-
Töröljük a sérült élő al-kötetet:
sudo btrfs subvolume delete /btrfs-pool/projekt_elo -
A jó állapotot őrző snapshotból létrehozzuk az új élő környezetet egy gyors átnevezéssel vagy újabb snapshotolással (hogy a mentésünk is megmaradjon):
sudo btrfs subvolume snapshot /btrfs-pool/projekt_mentes_01 /btrfs-pool/projekt_elo
Kész! Ha most belépsz a /btrfs-pool/projekt_elo mappába, az adatbazis.db újra ott figyel, sértetlenül. A rendszered visszatért a múltba, a hiba meg nem történtté vált.
8.5.5 BTRFS snapshotok törlése
A BTRFS snapshotok addig őrzik a régi adatblokkokat, amíg léteznek. Ha már nincs szükséged egy régi mentésre, le kell törölnöd, különben a lemezterületed lassan elfogy, ahogy az élő rendszer fájljai távolodnak a múltbéli állapottól.
Fontos szabály: BTRFS alkötetet és snapshotot TILOS a hagyományos
rm -rfparanccsal törölni! Bár a modern rendszerek már blokkolják ezt, azrmhasználata összezavarhatja a fájlrendszer belső számlálóit.
A helyes, biztonságos törlési parancs:
sudo btrfs subvolume delete /btrfs-pool/projekt_mentes_01
Kimenet: Delete subvolume (no-commit): '/btrfs-pool/projekt_mentes_01'
A fájlrendszer azonnal felszabadítja azokat az adatblokkokat, amelyeket már csak és kizárólag ez a snapshot használt.
8.5.6 Automatizált snapshot eszközök
Bár a fenti parancsok ismerete elengedhetetlen a működés megértéséhez, a napi gyakorlatban ritkán fogod ezeket karakterenként gépelni. A Linux ökoszisztéma két kiváló automatizált eszközt kínál, amelyek a háttérben pontosan ezeket a BTRFS parancsokat futtatják:
- Timeshift (BTRFS módban): Az asztali Linux felhasználók kedvence. Grafikus felületen (vagy egyszerű CLI parancsokkal) beállítható, hogy minden rendszerindításkor, vagy óránként készítsen egy automatikus snapshotot a
/(root) al-kötetről. Ha egy frissítés után összeomlik a rendszer, a GRUB rendszerindító menüből kiválasztható egy tegnapi snapshot, és a gép azonnal elindul a működő állapotban. - Snapper: A haladóbb, illetve az openSUSE világából érkező eszköz. Automatikusan készít egy snapshotot mielőtt és miután a csomagkezelővel (
dnf,zypper) telepítesz egy programot. Ha az új szoftver instabillá teszi a gépet, asnapper rollbackparanccsal egyetlen másodperc alatt törölhető a teljes művelet. - Bazzite-on és más immutable rendszeren nem fogod megtalálni ezeket a programokat, ezért használd a Bazárból telepíthetó Pika Backup (Pika biztonsági mentés) programot, ami ugyanígy BTRFS snapshotokat készít, akár időzített automatizmusokkal is.
Az aranyszabály: A snapshot NEM backup!
A fejezet végén egy életbevágóan fontos rendszergazdai figyelmeztetést kell a fejedbe vésned: A snapshot önmagában nem számít biztonsági mentésnek!
Mivel a snapshot ugyanazokon a fizikai lemezblokkokon osztozik, mint az élő rendszer, ezért:
- Ha a számítógépedben lévő NVMe SSD fizikailag tönkremegy, az összes snapshottal együtt semmisül meg.
- Ha a BTRFS fájlrendszer metaadatai egy áramszünet miatt végzetesen megsérülnek, a snapshotok is elérhetetlenné válnak.
A helyes stratégia: A snapshot arra való, hogy megvédjen a saját hibáidtól (véletlen törlés) és a szoftveres hibáktól (hibás frissítések). A valódi hardverhibák és katasztrófák ellen továbbra is a 8.4-es fejezetben tanult
rsyncparancsot kell használnod, amivel a BTRFS alkötetek tartalmát egy teljesen különálló, fizikai külső meghajtóra vagy távoli szerverre szinkronizálod!