Kort fortalt, så ønsker jeg at man skal kunne lave et snapshot af / (minus selvfølgelig /home), så når - ikke hvis - der går knas sin Ubuntu installation, så kan man gå tilbage til sidste snapshot, hvor Ubuntu installationen er som der intet var ændret.
Så hvad er et snapshot egentligt?
I alle filsystemer (også for Windows og Mac OS) er en mappe også en fil - bare en speciel fil - så herunder bruger jeg ordet fil som et ord for både en fil og en mappe.
btrfs filsystemet har en feature der hedder Copy On Write (COW), som kan oversættes til : kopier, hvis skriv (eller slet).
Med snapshots deaktiveret så laver btrfs kun COW kopier hvis du eksplicit beder den om det - altså her er btrfs som alle andre filsystemer. Slettede filer bliver rent faktisk også slettet.
Hvis du opretter en fil, skriver i den, og sletter den, og der ikke er et snapshot før slet, så bliver filen slettet. Det er samme adfærd, som med snapshots deaktiveret.
Med snapshots aktiveret, så begynder det sjove hvis du har lavet et snapshot og du sletter eller ændrer en snapshot fil.
Med snapshots aktiveret, og når man vil slette eller ændre en snapshot fil, så vil btrfs starte med at COW kopierer filen.
Det betyder at btrfs - med snapshots aktiveret - så vil en snapshot fil - der bliver slettet, ikke slettet i filsystemet, og at en snapshot fil der ændres vil også findes i en uændret udgave i filsystemet .
For et program, der ikke er btrfs(8) programmet, så virker det som om at en slettet fil er slettet, og at en ændret fil er ændret.
En COW kopi af en fil er en ny fil.
Lige før en COW kopieret fil bliver ændret, så har COW kopien den samme størrelse og har det samme indhold som den fil den blev COW kopieret fra , men selve COW kopien fylder kun 155 bytes nede på disken.
Den nye fil har - som alle andre nye filer - sin egen (nye) inode,.
Hvordan bruger man et snapshot
Da det ikke findes i Ubuntu referer jeg nu til hvordan det fungerer i openSUSE Leap 15.0, som er mit styresystem jeg bruger til dagligt.
openSUSE og SUSE SLES har et alt-i-et styresystems administationsprogram der hedder Yast der findes i en GUI og en ncurces udgave. Der er også et CLI program til pakkehåndtering der hedder zypper.
Når man installere noget software via Yast eller zypper, så vil de programmer lave et snapshot før de begynder på noget som helst. Det gør de via et program der hedder snapper.
Yast og zypper tilføjer det nye snapshot som et nyt menupunkt i en menu i GRUB boot loaderen. Dette er meget vigtigt.
Lad sige at man derefter har tilføjet nogle nye repositories og installeret nogle programmer derfra.
Nu går det galt! Styresystemet virker ikke, så man bliver nødt til at reboote
Straks når man når til GRUB menuen vælger man snapshotet før det snapshot der lige blev lavet, og booter fra det.
Når man booter til et tidligere snapshot, så er det btrfs filsystemet read only.
Man går så (typisk) ind i en terminal og skriver(*)
Kode: Vælg alt
su snapper rollback
... og venter på at den bliver færdig
Så rebooter man. Nu finder man så at:
- Der er ikke ændret i nogen konfigurationsfiler, eller tilføjet nogle nye.
- Der er ikke tilføjet noget nyt repository
- Der er ikke downloaded noget som helt
- .. og der er ikke nogen nye programmer der blev installeret.
- Faktisk er der slet ikke nogen filer der er
- nye
- ændret, eller
- slettet
... med andre ord: Intet er blevet ændret!
Det har reddet min røv for ikke så lang tid siden. Desktoppen var kvæstet, så man ikke kunne lave noget, men det tog kun omkring 3 minutter at være kørende igen.
/Lars
(*) Om snapper rollback, se: 3.3 System Rollback by Booting from Snapshots