Hirdetés

Proxmox memoárok: hasznos scriptek

Smart adatok: lassú romlási trendek figyeléseIsmét egy csokor bármi: scriptek mindenféle feladatra. Mentés...

Mentés USB külső meghajtóra

Szintén egy rövid, "bolondbiztos" script - mert a külső meghajtók kezelése Proxmoxon kicsit más,
mint a desktop linuxokon. Nekünk ebből csak annyit elég tudnunk, hogy PVE-n nincs automatikus csatolás (megoldható természetesen ez is, ha valakinek erre van igénye), asztali linuxokon a külső meghajtó a /media/akármi mappába kerül automatikus csatolásra.

Itt egy meglévő (akár fájlokkal teli) lemezt csatolunk most, skippeljük a formázást. Proxmoxon az USB meghajtókat fstab-al (van más opció is, systemd és webUI csatolás, de az fstab a jó ehhez) tudjuk csatolni. Ehhez kell nekünk a lemez UUID-je, egyedi azonosítója. A külső lemezt csatlakoztassuk, majd
blkid
parancs, amire lesz egy hosszú lista... Legjobb, ha kimásoljuk a teljes kimenetet jegyzettömbbe és kitöröljük, amiről biztosan tudjuk, hogy nem a külső lemez. Ebben a PVE disks oldala segít.

A blkid listából a /dev/mapper, /dev/loop és /dev/nvme kezdetűek biztosan kiesnek. Aminek csatolási pontja van a disk oldalon (sda, sdb, nvme...) az is kiesik, mert a külső meghajtónak ez nincs. A maradék lesz a meghajtónk sora. Ha bizonytalanok vagyunk, akkor csak le kell húzni, újra blkid parancs és ami hiányzik,
az a mi külső lemezünk.

A lemez UUID-ja a fájlrendszer létrehozásakor (gyors vagy teljes formázáskor) generálódik. Vannak olyan parancsok, amikkel a fájlrendszer törlése vagy formázása nélkül is meg lehet változtatni és van olyan parancs is, ami formázás ellenére is megtartja az azonosítót.

Nálam ez:
/dev/sdd1: UUID="99d6ac0f-c0c4-41e4-b6d9-fec5fa0ce26d" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Basic data partition" PARTUUID="0000fb07-ddd0-1c94-f98e-da010ef60100"

Hirdetés

A következő lépés, hogy létrehozzuk a csatolási pontot Proxmoxon, ehhez a PVE konzolba írjuk be:
mkdir /mnt/external_hdd

A csatolásokat ajánlott az /mnt-n belül létrehozni, a mappa neve bármi lehet, de ha sok csatolás lesz, akkor jobb, ha a nevéből tudjuk, hogy mi is az.

A jogosultság problémákat megelőzni:
chown nobody:nogroup /mnt/external_hdd
Senki nem tulajdonos, semmilyen csoporthoz nem tartozik. Ez mindenhol ugyan az.
Előfordulhat, hogy az fstab csatolásunk nem csatolódik valamiért, ilyenkor ha valami írni akar a mappába, akkor az a Proxmox meghajtójára íródik. A meghajtó vagy a partíció betelhet, nincs boot és az nem jó.
Ezért ez a mappa legyen Immutable (nem módosítható):
chattr +i /mnt/external_hdd

Ezután ha a merevlemezt nem sikerül csatolni, akkor a mappa írásvédett marad. Ha ide mentenénk vagy másolnánk, akkor hibára futunk. Cserébe nem tudjuk teleírni a meghajtót.
lsattr -d /mnt/external_hdd
Ezt kell látnod: ----i---------e---- /mnt/external_hdd
Az az i betű az elején jelzi, hogy a mappa immutable lett.

Következik az fstab módosítása, ahol megadjuk a rendszernek, hogy melyik lemezt és hova kell csatolnia:
nano /etc/fstab

Itt a végére, új sorba adjuk meg a lemezünket, a csatolási pontot és még pár dolgot:
# external Toshiba 750 GB
UUID=99d6ac0f-c0c4-41e4-b6d9-fec5fa0ce26d /mnt/external_hdd ext4 defaults,noatime,noexec,nodev,nosuid,noauto,nofail 0 0

Természetesen a Te rendszeredhez igazítva, a Te meghajtód UUID azonosítójával kell hozzáadni. Az UUID után megadjuk a csatolási pontot, majd a fájlrendszer típusát, végül néhány paraméter:
Biztonsági opciók: a nodev, nosuid, noexec. Nálam ide mentések kerülnek, ezeket inkább tiltom. Részletesen a korábbi logout bejegyzésben írtam ezekről.
noatime: teljesítmény-optimalizálás, időbélyegeket nem ír. SSD-nél szinte kötelező, nálam ez backup lemez, nem igénylem. Kihagyható.
nofail: ha lemezhiba van (eltávolítottuk a lemezt, vagy "csak" haldoklik), akkor ezzel a kapcsolóval a boot nem akad meg. Próbálgatja csatolni, majd halad tovább. Kihagyható, de ajánlott a használata.
noauto: Ez viszont nem kihagyható... A Proxmox induláskor átugorja a lemezt, nem akad fenn akkor sem,
ha nincs csatolva. A mentős külső lemezt nem is szeretném a gépre dugva tartani, annak egy "mindent visz" táphiba esetén nem sok haszna lenne. Illetve a boot folyamatot sem lassítja egy USB-n döcögő külső lemez csatolásával.
Még pár parancs kell:
ctrl+x # kilépés nano-ból
Mentés kérdésre egy y és enter, majd
systemctl daemon-reload

Nos, a nagy részével készen is vagyunk. Kell egy script, nálam ez a /root/script mappába kerül - githubról a parancs csak a /root-ba menti, az elérésre a crontabban szükségünk lesz, érdemes szerintem az ilyesmiket egy mappába gyűjteni. A feladata az lenne, hogy amikor a crontab elindítja, akkor próbálja csatolni a külső merevlemezt. Ha nem találja az nem hiba, lépjen ki. Ha megtalálta, akkor csatolja a létrehozott /mnt/external_hdd mappába és a belső meghajtón a mentéseket másolja át a külső meghajtóra is.

Közben a folyamatot egy saját fájlba logolja, ez a /root/log/external_sync.log fájl lesz és küldjön egy rövid összefoglalót email-ben a mentésről. A meghajtót le is kell választania, mintha ott sem lett volna...
nano /root/script/external_sync.sh

Új file, másoljuk bele ezt (alternatívaként githubról is letölthető, a readme utasításban a parancs hozzá):
#!/bin/bash
set +H
set -uo pipefail

external_mount="/mnt/external_hdd"
source_backup="/mnt/ssd_backup/NAS_backup/"
dest_backup="/mnt/external_hdd/NAS_backup/"
start_time=$(date "+%Y-%m-%d %H:%M:%S")
log_file="/root/log/external_sync.log"

# HDD csatolás - ha nincs bedugva, csendben kilép
mount "$external_mount" 2>/dev/null
if ! mountpoint -q "$external_mount"; then
exit 0
fi

# Szinkronizálás
rsync -avh --hard-links --delete \
"$source_backup" "$dest_backup" \
> "$log_file" 2>&1

exit_code=$?

end_time=$(date "+%Y-%m-%d %H:%M:%S")
ext_usage=$(du -sh "$external_mount" 2>/dev/null | awk '{print $1}')

if [ $exit_code -eq 0 ]; then
subject="External Backup kész"
status="Szinkronizálás sikeresen lefutott."
else
subject="External Backup HIBA"
status="HIBA: rsync hibakóddal zárult: $exit_code"
fi

log_tail=$(tail -n 5 "$log_file")
mail_body="Mentés kezdete: $start_time
Mentés vége: $end_time
$status
--- Tárhely ---
Külső HDD foglalt: $ext_usage
--- Összefoglaló ---
$log_tail"

echo -e "Subject: $subject\n\n$mail_body" | /usr/libexec/proxmox-mail-forward

# HDD leválasztás (biztonságos eltávolításhoz)
umount "$external_mount"

Mentés és futtathatóvá tétel:
chmod +x /root/script/external_sync.sh

Ehhez is kell a PVE-ben beállított mail forward, a futtatását crontab-ra bízzuk:
crontab -e

A végére másoljuk be ezt:
# Külső HDD szinkronizálás (minden nap 05:00)
20 5 * * * /root/script/external_sync.sh > /dev/null 2>&1

Nézzük részletesebben az rsync parancsot, ami a lényeget adja:
rsync -avh --hard-links --delete \
"$source_backup" "$dest_backup" \
> "$log_file" 2>&1

-a (archive): ez a legfontosabb gyűjtőkapcsoló, ami biztosítja, hogy a másolat mindenben megegyezzen az eredetivel. Rekurzívan a mappastruktúrát is megtartja, illetve a jogosultságokat, a tulajdonost/csoportot, a szimbolikus linkeket és az időbélyegeket is.
-v (verbose): Részletes kimenet. Kilistázza a terminálban (vagy a logban), hogy éppen melyik fájlt másolja vagy ellenőrzi.
-h (human-readable): A számokat (pl. fájlméretek, átviteli sebesség) jól olvasható formátumban (KB, MB, GB) jeleníti meg.
--hard-links: ez a kapcsoló megtartja a forrásmappában (pl. korábbi mentésekből adódóan van néhány) található hard linkeket. Elengedhetetlen a kis fájlmérethez, mert így ha a forrásnál hard link van, akkor azt másolja és nem a linkelt fájlt.
--delete: ha a forrásban törölve lett egy fájl, akkor azt a mentésből is törli. Sikerült még régebben egy "delete" nélküli mentést visszaállítanom, amiben a kiválogatásra váró fájlok is megvoltak és a már válogatott mappák is... Hát nem voltam megdicsérve.
A log része a kimenetet irányítja át a script elején megjelölt fájlba.

A script minden hajnalban lefut, ha nincs a külső lemez csatlakoztatva, akkor csak kilép. Ha a lemezt csatlakoztattuk fizikailag, akkor egy növekményes mentést csinál. A mentési metódus miatt az első az nem lesz gyors... utána a változásokat menti csak. Tehát ha pl. családi fotókat vagy más, nem folyamatosan változó adatot mentenénk, akkor a változások követése gyors lesz, de az első mentést ki kell várni.

Ne felejtsünk el logrotate-t létrehozni ehhez is:
nano /etc/logrotate.d/external_sync.log
Másoljuk bele ezt:
/root/log/external_sync.log {
weekly
rotate 5
compress
missingok
notifempty
}

Mentés, bezárás. Ezzel 5 heti logot őrizgetünk, bőven elég szerintem, de módosítsd, ahogy tetszik.

A cikk még nem ért véget, kérlek, lapozz!