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!



