Vodiči

Fortify Linux Storage: LVM, Encryption, Snapshots, SMART, and Tested Restores

Ojačajte Linux pohranu: LVM, enkripcija, snimke stanja, SMART i testirane obnove

Zdrav datotečni sustav i dalje može izgubiti podatke. Čisto SMART izvješće može prethoditi katastrofi na razini aplikacije. Šifrirani disk može zaštititi ukradeni hardver, a pritom ne učiniti ništa za slučajno brisanje. Pouzdanost pohrane dolazi iz slojeva čiji se načini otkaza preklapaju, bez pretvaranja da se međusobno zamjenjuju.

Ovaj vodič gradi proizvodno usmjeren sustav za pohranu oko namjenskog podatkovnog diska od 128 GiB: šifriranje LUKS2, dodjelu putem LVM-a, ext4 volumen za aplikaciju, kratkotrajne snimke stanja, sigurnosne kopije izvan glavnog računala, SMART nadzor i redovite testove vraćanja. Naredbe koriste /dev/vdb u jednokratnom virtualnom stroju. Na fizičkom hardveru koristite stabilnu putanju navedenu pod /dev/disk/by-id/.

Upozorenje: naredbe za formatiranje u nastavku uništavaju podatke na /dev/vdb. Najprije ih uvježbajte u virtualnom stroju. Nikada nemojte kopirati putanju uređaja iz članka u produkciju bez neovisne provjere njegova modela, serijskog broja, veličine i trenutačnih montiranja.

Arhitektura i kompromisi

Dobivena je putanja namjerno jednostavna:

physical disk /dev/vdb
└── LUKS2 container: cryptdata
    └── LVM physical volume
        └── volume group: vg_secure
            ├── logical volume: appdata, 64 GiB
            ├── temporary snapshot: appdata_snap, 16 GiB
            └── temporary restore-test volume: restore_test, 48 GiB

Šifriranje se nalazi ispod LVM-a, pa su nazivi logičkih volumena i metapodaci o dodjeli skriveni dok je stroj isključen. LVM pruža fleksibilan kapacitet i snimke stanja. Ext4 pruža predvidljive alate za oporavak. Zasebno šifrirano, neovisno montirano odredište za sigurnosne kopije na /mnt/backup čuva arhive nakon uklanjanja snimaka stanja.

LVM snimke stanja koriste copy-on-write pohranu. One nisu sigurnosne kopije: dijele izvorni disk, troše kapacitet kako se blokovi mijenjaju i postaju nevaljane ako se popuni dodijeljeni prostor za iznimke. Njihova je zadaća ovdje prikazati stabilno, kratkotrajno stanje dok se arhiva kopira na drugo mjesto.

Snimka stanja dosljedna je pri padu sustava, ali nije automatski dosljedna na razini aplikacije. Datotečni sustavi ostaju strukturno oporavljivi, ali bazi podataka možda će trebati vlastita naredba za sigurnosno kopiranje, kontrolna točka ili kratko mirovanje upisa. Nemojte zamrzavati zauzet datotečni sustav tijekom trajanja velike arhive.

Preduvjeti i struktura projekta

Pokrećite naredbe na računalu s računom koji može koristiti sudo. Instalirajte distribucijske pakete koji pružaju cryptsetup, LVM2, alate za ext4, GNU tar, gzip, util-linux i smartmontools. Potvrdite da je /mnt/backup drugi datotečni sustav podržan zasebnom ili udaljenom pohranom.

sudo apt-get update
sudo apt-get install cryptsetup lvm2 e2fsprogs smartmontools acl
sudo install -d -m 0750 /srv/appdata
sudo install -d -m 0750 /mnt/backup
sudo install -d -m 0750 /mnt/restore-test
sudo install -d -m 0750 /usr/local/lib/storage
sudo install -d -m 0750 /var/log/storage

lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL
findmnt --target /mnt/backup

Dovršeni sustav koristi sljedeće operativne putanje:

  • /srv/appdata za aktivne podatke aplikacije
  • /mnt/backup/appdata za neovisno zaštićene arhive
  • /usr/local/lib/storage/backup-appdata za zadatak sigurnosnog kopiranja
  • /mnt/restore-test za jednokratne vježbe oporavka
  • /etc/crypttab i /etc/fstab za aktivaciju pri pokretanju

Na sustavima temeljenima na RPM-u koristite odgovarajući upravitelj paketa i nazive paketa. Instalacija paketa jedini je dio osnovnog dizajna specifičan za distribuciju.

Izgradite šifrirani LVM sustav

Dokažite da je ciljni uređaj siguran

U laboratorijskom VM-u zahtijevajte da disk bude točno očekivani nemontirani blokovski uređaj. Ove su provjere namjerno odvojene od destruktivne naredbe kako bi se njihov izlaz mogao pregledati.

DATA_DISK=/dev/vdb

test -b "$DATA_DISK"
lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL "$DATA_DISK"
sudo wipefs --no-act "$DATA_DISK"
sudo blkid "$DATA_DISK" || true
findmnt --source "$DATA_DISK" || true

Zaustavite se ako uređaj sadrži potpise, particije, montirane datotečne sustave ili neočekivanu veličinu. Produkcijski disk treba navoditi njegovom provjerenom simboličkom poveznicom /dev/disk/by-id/, a ne nazivom /dev/sdX koji se potencijalno mijenja.

Izradite LUKS2, LVM i ext4

Sljedeći blok je destruktivan. cryptsetup luksFormat traži izričitu potvrdu i zaporku. Mapiranje ostaje otvoreno na /dev/mapper/cryptdata dok se ne zatvori ili dok se stroj ne ugasi.

DATA_DISK=/dev/vdb

sudo cryptsetup luksFormat --type luks2 "$DATA_DISK"
sudo cryptsetup open "$DATA_DISK" cryptdata

sudo pvcreate /dev/mapper/cryptdata
sudo vgcreate vg_secure /dev/mapper/cryptdata
sudo lvcreate --size 64G --name appdata vg_secure

sudo mkfs.ext4 -L appdata /dev/vg_secure/appdata
sudo mount /dev/vg_secure/appdata /srv/appdata
sudo install -d -m 0750 /srv/appdata/health
printf '%s\n' 'storage-restore-sentinel-v1' |
  sudo tee /srv/appdata/health/restore-sentinel.txt >/dev/null

sudo pvs
sudo vgs
sudo lvs -o lv_name,vg_name,lv_size,origin,data_percent
findmnt /srv/appdata

U početku je dodijeljeno samo 64 GiB. Preostali ekstenti operativna su rezerva za snimke stanja, vježbe oporavka i kontrolirani rast. Dodjela cijele grupe volumena prvog dana uklanja velik dio vrijednosti LVM-a.

Konfigurirajte aktivaciju pri pokretanju

Koristite UUID-ove kako promjene naziva uređaja ne bi onemogućile pokretanje. Sljedeće dodaje unose samo ako njihovi UUID-ovi ne postoje. Pregledajte obje datoteke prije ponovnog pokretanja.

DATA_DISK=/dev/vdb
CRYPT_UUID=$(sudo cryptsetup luksUUID "$DATA_DISK")
FS_UUID=$(sudo blkid -s UUID -o value /dev/vg_secure/appdata)

sudo grep -q "UUID=$CRYPT_UUID" /etc/crypttab ||
  printf 'cryptdata UUID=%s none luks\n' "$CRYPT_UUID" |
  sudo tee -a /etc/crypttab

sudo grep -q "UUID=$FS_UUID" /etc/fstab ||
  printf 'UUID=%s /srv/appdata ext4 defaults,nodev,nosuid 0 2\n' "$FS_UUID" |
  sudo tee -a /etc/fstab

sudo cryptsetup luksDump "$DATA_DISK"
sudo findmnt --verify
sudo systemctl daemon-reload

Opcije nodev i nosuid smanjuju rizik za podatke aplikacije. Dodajte noexec samo ako radno opterećenje nikada ne izvršava binarne datoteke ili skripte s ovog volumena. Konfiguracija koristi interaktivnu zaporku pri pokretanju; poslužitelji bez nadzora trebali bi koristiti dizajn otključavanja odobren u organizaciji, temeljen na TPM-u, mreži ili hardveru, s dokumentiranim ključem za oporavak.

Izradite dosljedne sigurnosne kopije snimaka stanja

Odredište za sigurnosne kopije već mora biti montirano. Skripta odbija pisati u korijenski datotečni sustav ako to montiranje nestane, postavlja isključivu blokadu, izrađuje jednu snimku stanja, montira je bez ponavljanja ext4 dnevnika, atomski zapisuje komprimiranu arhivu i uvijek čisti za sobom.

#!/usr/bin/env bash
set -Eeuo pipefail

BACKUP_ROOT=/mnt/backup/appdata
SNAP_MOUNT=/run/appdata-snapshot
SNAP_LV=/dev/vg_secure/appdata_snap
SOURCE_LV=/dev/vg_secure/appdata
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
FINAL="$BACKUP_ROOT/appdata-$STAMP.tar.gz"
PARTIAL="$FINAL.partial"

exec 9>/run/lock/appdata-backup.lock
flock -n 9 || { echo "backup already running" >&2; exit 1; }

mountpoint -q /mnt/backup ||
  { echo "/mnt/backup is not mounted" >&2; exit 1; }
test "$(findmnt -n -o SOURCE /mnt/backup)" != "/dev/vg_secure/appdata" ||
  { echo "backup target is the source volume" >&2; exit 1; }

install -d -m 0750 "$BACKUP_ROOT" "$SNAP_MOUNT"

cleanup() {
  mountpoint -q "$SNAP_MOUNT" && umount "$SNAP_MOUNT" || true
  lvs vg_secure/appdata_snap >/dev/null 2>&1 &&
    lvremove --yes "$SNAP_LV" || true
  rm -f "$PARTIAL"
}
trap cleanup EXIT

lvcreate --snapshot --size 16G --name appdata_snap "$SOURCE_LV"
mount -o ro,noload "$SNAP_LV" "$SNAP_MOUNT"

tar --acls --xattrs --numeric-owner --one-file-system \
  -C "$SNAP_MOUNT" -cf - . | gzip -1 >"$PARTIAL"
gzip -t "$PARTIAL"
mv "$PARTIAL" "$FINAL"
sha256sum "$FINAL" >"$FINAL.sha256"

echo "created $FINAL"

Instalirajte taj sadržaj kao /usr/local/lib/storage/backup-appdata, u vlasništvu roota i s načinom rada 0750. Pokrenite ga iz systemd timera ili postojećeg raspoređivača kao root. Nemojte stavljati LUKS zaporku u skriptu.

Snimka stanja od 16 GiB može sačuvati približno toliku količinu promijenjenih blokovskih podataka dok traje arhiviranje; veličina arhive nije važna. Pratite Data% tijekom prvih produkcijskih pokretanja. Ako se promjene pri zapisivanju približe kapacitetu snimke, povećajte ga, skratite zadatak, koristite inkrementalne sigurnosne kopije izvorne aplikacije ili premjestite sigurnosne kopije na repliku.

Nadzirite medij, kapacitet i pritisak snimke stanja

SMART promatra fizički uređaj ispod šifriranja. Najprije provjerite izlaže li kontroler smislene podatke:

sudo smartctl --health /dev/vdb
sudo smartctl --all /dev/vdb
sudo systemctl enable --now smartd
sudo journalctl -u smartd --since today

sudo vgs -o vg_name,vg_size,vg_free
sudo lvs -a -o lv_name,lv_size,origin,data_percent,metadata_percent
df -h /srv/appdata /mnt/backup
sudo cryptsetup status cryptdata

Virtio diskovi možda ne izlažu SMART telemetriju glavnog računala gostu; umjesto toga nadzirite fizički uređaj na hipervizoru. Kontroleri hardverskog RAID-a mogu zahtijevati odabir uređaja specifičan za kontroler. Uspješna naredba nije dokaz da prikazani brojači opisuju temeljni medij.

Konfigurirajte smartd koristeći stabilnu putanju fizičkog uređaja na stvarnom računalu. Zadržite njegovo zadano zapisivanje u sistemski dnevnik i povežite upozorenja dnevnika sa sustavom nadzora koji je već odgovoran za pozivanje dežurnih osoba. Nadzirite najmanje iskorištenost datotečnog sustava, slobodne ekstenete grupe volumena, starost sigurnosne kopije, neuspjehe provjere arhive, greške I/O jezgre, promjene SMART stanja i Data% snimke stanja.

Upozorenja o kapacitetu trebaju vrijeme za djelovanje. Iscrpljivanje grupe volumena i odredišta za sigurnosne kopije tretirajte kao zasebne rizike. LVM ne može izraditi volumen za test vraćanja samo zato što datotečni sustav prijavljuje slobodan prostor; trebaju mu nedodijeljeni ekstenti u grupi volumena.

Provedite stvarnu vježbu vraćanja

Arhiva je samo tvrdnja dok se ne raspakira i pregleda. Pokrenite ovo nakon što skripta za sigurnosno kopiranje ukloni svoju snimku stanja. Testni volumen od 48 GiB stane uz aktivni volumen od 64 GiB na primjeru diska od 128 GiB, uzimajući u obzir metapodatke šifriranja i LVM-a.

BACKUP_ROOT=/mnt/backup/appdata
ARCHIVE=$(find "$BACKUP_ROOT" -maxdepth 1 -type f \
  -name 'appdata-*.tar.gz' -printf '%T@ %p\n' |
  sort -n | tail -1 | cut -d' ' -f2-)

test -n "$ARCHIVE"
cd "$BACKUP_ROOT"
sha256sum --check "$(basename "$ARCHIVE").sha256"
gzip -t "$ARCHIVE"

sudo lvcreate --size 48G --name restore_test vg_secure
sudo mkfs.ext4 -L restore_test /dev/vg_secure/restore_test
sudo mount -o nodev,nosuid /dev/vg_secure/restore_test /mnt/restore-test

sudo tar --acls --xattrs --numeric-owner \
  -xzf "$ARCHIVE" -C /mnt/restore-test

sudo test "$(sudo cat /mnt/restore-test/health/restore-sentinel.txt)" = \
  "storage-restore-sentinel-v1"
sudo find /mnt/restore-test -xdev -type f | wc -l
sudo du -sh /mnt/restore-test
findmnt /mnt/restore-test

Zamijenite provjeru samo pomoću sentinela validacijom prilagođenom radnom opterećenju: otvorite vraćene repozitorije, provjerite medije, pokrenite mehanizam baze podataka nad njegovom podržanom logičkom sigurnosnom kopijom ili pokrenite izoliranu instancu aplikacije s blokiranim odlaznim mrežnim pristupom. Nikada nemojte usmjeriti test vraćanja na produkcijske vjerodajnice, redove, webhookove ili sustave e-pošte.

Nakon bilježenja rezultata, sigurno uklonite jednokratni volumen:

sudo umount /mnt/restore-test
sudo e2fsck -f /dev/vg_secure/restore_test
sudo lvremove --yes /dev/vg_secure/restore_test
sudo lvs
sudo vgs

e2fsck se pokreće samo dok datotečni sustav nije montiran. Njegov uspjeh potvrđuje strukturu datotečnog sustava, dok provjere aplikacije potvrđuju da je vraćeni sadržaj upotrebljiv. Oboje je važno.

Sigurnost, performanse i disciplina implementacije

LUKS štiti podatke u mirovanju, a ne podatke na otključanom računalu. Ograničite root pristup, zasebno zaštitite ključeve za oporavak, ažurirajte jezgru i alate za pohranu te održavajte šifriranje sigurnosnih kopija neovisnim o izvornom disku. Ako se i izvor i sigurnosna kopija automatski otključavaju na istom računalu, krađa ili kompromitiranje mogu zaobići oba sloja.

Ne izlažite usluge upravljanja pohranom kroz vatrozid. Dizajn ne otvara mrežne portove. Ako /mnt/backup koristi NFS, SSH ili sinkronizaciju s objektnom pohranom, dopustite samo potrebno odredište, autentificirajte se identitetom uskog opsega i spriječite račun aplikacije da briše povijesne sigurnosne kopije.

Razina kompresije jedan namjerno daje prednost kraćem trajanju snimke stanja pred maksimalnom kompresijom. Prije promjene izmjerite trajanje arhiviranja, promjene pri zapisivanju, opterećenje CPU-a i propusnost odredišta. SSD discard može poboljšati dugoročno ponašanje, ali kroz šifriranje otkriva obrasce dodjele; omogućite ga tek nakon procjene uređaja, modela prijetnji i očekivanja sanitizacije.

Implementirajte u fazama: uvježbajte uništavanje i oporavak u VM-u, izgradite produkcijski volumen koristeći provjerenu stabilnu putanju uređaja, pokrenite ručnu sigurnosnu kopiju, pregledajte potrošnju snimke stanja, vratite podatke u izolirani LV, ponovno pokrenite tijekom prozora održavanja i provjerite automatsko otključavanje i montiranje. Planirajte ponavljajuće vježbe vraćanja, a ne samo ponavljajuće sigurnosne kopije.

Uobičajeni kvarovi koje vrijedi planirati

  • Snimka stanja doseže 100 %: postaje neupotrebljiva. Uklonite je, sačuvajte izvorni volumen, povećajte rezervu i ponovno pokrenite sigurnosno kopiranje.
  • Montiranje sigurnosne kopije nestane: bez provjere točke montiranja arhive bi mogle ispuniti korijenski datotečni sustav. Zadržite ponašanje odbijanja.
  • Pokretanje ulazi u hitni način rada: iz medija za oporavak pregledajte /etc/crypttab, UUID-ove, dostupnost ključa i redoslijed u /etc/fstab.
  • SMART prijavljuje nepodržano: upitajte fizičko računalo ili konfigurirajte ispravnu vrstu uređaja specifičnu za kontroler umjesto da nedostajuću telemetriju tretirate kao dobro stanje.
  • Baza podataka vraća se nedosljedno: upotrijebite njezin dokumentirani logički ili fizički mehanizam sigurnosnog kopiranja; snimka datotečnog sustava dosljedna pri padu ne može proizvesti transakcijska jamstva koja aplikacija ne pruža.
  • LV za vraćanje nije moguće izraditi: pregledajte vgs. Slobodni prostor unutar appdata nije slobodan prostor u vg_secure.

Završni kontrolni popis za provjeru

  • Produkcijski uređaj identificiran je provjerenim modelom, serijskim brojem, veličinom i stabilnom putanjom.
  • LUKS materijal za oporavak pohranjen je zasebno i testiran.
  • /srv/appdata montira se nakon kontroliranog ponovnog pokretanja s predviđenim opcijama učvršćivanja.
  • Grupa volumena zadržava dovoljno slobodnih ekstenata za snimke stanja i vježbe vraćanja.
  • Odredište za sigurnosne kopije neovisno je, šifrirano, kapacitet mu se nadzire i zaštićeno je od brisanja iz aplikacije.
  • Najnovija arhiva prolazi testove kontrolnog zbroja i kompresije.
  • Vraćena kopija prolazi validaciju datotečnog sustava i validaciju specifičnu za radno opterećenje.
  • SMART, greške I/O jezgre, kapacitet, pritisak snimke stanja i starost sigurnosne kopije dolaze do operativnog sustava za upozoravanje.
  • Vježbe vraćanja imaju vlasnika, raspored, zabilježeno trajanje i dokumentirani postupak oporavka.

Jedinica pouzdanosti pohrane koju vrijedi pamtiti nije disk, volumen, snimka stanja ni arhiva. To je provjereni put oporavka. Šifriranje ograničava izloženost, LVM stvara prostor za manevriranje, SMART pruža nesavršene rane signale, a sigurnosne kopije čuvaju povijest. Samo testirano vraćanje pretvara te korisne mehanizme u pouzdanje.

Portret autora bloga

Mihajlo

Ja sam Mihajlo — programer vođen znatiželjom, disciplinom i stalnom željom da stvorim nešto smisleno. Dijelim uvide, tutorijale i besplatne usluge kako bih pomogao drugima da pojednostave svoj rad i rastu u svijetu softvera i umjetne inteligencije koji se neprestano razvija.