Mappák mentése belső tárhelyre
Az oldal címénél már elakadtam. NAS mappák mentése? Az. SMB megosztások mentése? Az is. De ha PVE oldalról nézem, akkor ezek "mezei" mappák, amiket egy NAS-nak becézett LXC oszt meg Samba segítségével, de ez a része a script számára teljesen lényegtelen...
Nálam bind mount az összes adat meghajtó, így a PVE sajátjaként látja őket. Ez leegyszerűsíti a mentések készítését: a samba megosztások tartalmát rsync-el egy nem megosztott meghajtóra másolom néhány naponta. Otthoni homelab, nincs hatalmas adatmozgás, a gyakoriságot mindenki beállíthatja igény szerint.
A másolás növekményes, ha végzett, akkor proxmox mail-forward-al jön róla email. A mentések első lépcsőfoka ez csak (legyen egy második példány instant elérhető). Mivel ez nincs megosztva, a következő mentésig nem fog változni: lehet tömörítve felhőbe küldeni darabokban, vagy menteni a mentést (ez gyönyörű lett, könnyezem) külső meghajtóra további másolatként.
Kép: Adobe Firefly
A kezdetleges és jóval egyszerűbb scripttel már kb. 2 éve mentegetek, folyamatosan bővült. Claude AI segítségével kapott egy kis finomhangolást és proxmox-mail-forward-ot is. Qwen3 extra biztonsági ellenőrzéseket javasolt, Gemini az én lassú tárhely ellenőrző megoldásomat cserélte le... Azért maradt benne a mappaneveken túl az eredetiből is, bár már csak hunyorítva hasonlít a kb. 15 soros ősére. A mentések és a logok rotálása a scripten belül történik. Több ilyen scriptem van, más-más forrás- és célmeghajtókkal, a futtatásuk crontabbal elosztva, hogy ne egyszerre és ne sokáig terhelje a rendszert. Nálam ez a backup2 script, lehet más neve is természetesen. Próbáltam kommentelni, hogy mi és miért került oda, remélem átlátható még.
Githubon is elérhető, letöltéshez van egysoros parancs és van ott is egy rövidített útmutató.
Hirdetés
A Te rendszeredre alakítása a # Konfiguráció rész változóinak az átírásával oldható meg. Ha bizonytalan lennél, akkor Claude AI. PVE konzolból az elérési utat a forrás és a cél mappádhoz, illetve a scriptet is bemásolod Claude vagy Qwen3 chat-be és megkéred, hogy ez alapján frissítse. Csak a forrás és a cél ne legyen megcserélve
Mert egy régi mentést helyreállítani a friss adatokra... nem szerencsés. Ha a véletlenül visszaállított mappa a feleségedé volt... akkor bajban vagy.
nano backup2.sh
Másoljuk bele a következőt:
#!/usr/bin/env bash
# felkiáltójeles mappák kezelése, előzmény-kiterjesztés kikapcsolása
set +H
# biztonsági kapcsolók, elírt változó, pipeline hibák esetére
set -uo pipefail
# Konfiguráció
# a forrás meghajtó csatolási pontja (ellenőrzéshez)
source_mount="/mnt/ssd"
# forrás mappa, amiben a menteni kívánt mappák vannak
source="/mnt/ssd/"
# mappanevek, amiket almappákkal, fájlokkal menteni szeretnénk
folders=("Tomi" "Viki" "Apa")
# ebbe a mappába mentünk majd (cél)
backup="/mnt/ssd_backup/NAS_backup/"
# a cél meghajtó csatolási pontja (ellenőrzéshez)
target_mount="/mnt/ssd_backup"
# log fájl helye
log_dir="/root/log"
# log fájlnév eleje
log_prefix="${log_dir}/backup2_"
start_time=$(date "+%Y-%m-%d %H:%M:%S")
# Log mappa létrehozása, ha nem létezik
mkdir -p "$log_dir"
# --- 1. HDD csatolás és mappa ellenőrzése (Forrás és Cél) ---
# Ha a forrás nincs csatolva, akkor leáll, nehogy az rsync --delete törölje a backupot!
if ! mountpoint -q "$source_mount"; then
error_msg="HIBA: A forrás meghajtó ($source_mount) nincs csatolva! A mentés megszakítva."
echo -e "Subject: Backup KRITIKUS HIBA - Forrás nincs csatolva\n\n$error_msg" | /usr/libexec/proxmox-mail-forward
exit 1
fi
if ! mountpoint -q "$target_mount" || [ ! -d "$backup" ]; then
error_msg="HIBA: A backup drive nincs csatolva, vagy a $backup könyvtár nem érhető el!"
echo -e "Subject: Backup HIBA \n\n$error_msg" | /usr/libexec/proxmox-mail-forward
exit 1
fi
# --- Cél meghajtó tárhely ellenőrzése ---
# foglalt méretet GB-ban, ~500 GB a meghajtó, 450 GB foglaltság felett ne kezdjen menteni
current_usage=$(df -m "$target_mount" | awk 'NR==2 {print int($3/1024)}')
limit=450
if [ "$current_usage" -ge "$limit" ]; then
error_msg="HIBA: A backup tárhely megtelt! Jelenleg: ${current_usage}GB. Limit: ${limit}GB. A mentés elmaradt!"
echo -e "Subject: Backup KRITIKUS HIBA - Tárhely hiba\n\n$error_msg" | /usr/libexec/proxmox-mail-forward
exit 1
fi
# --- 2-4. Ciklus a mappák mentésére ---
all_stats=""
error_occurred=0
for name in "${folders[@]}"; do
link="${backup}${name}"
sources="${source}${name}"
# Ha a forrás mappa nem létezik, lépés a következőre, nem áll le a mentés
if [ ! -d "$sources" ]; then
all_stats="${all_stats}\n--- ${name} ---\nHIBA: A forrás mappa ($sources) nem létezik!\n"
error_occurred=1
continue
fi
# Régi mentések forgatása (Hardlink-alapú inkrementális logika)
rm -rf "${link}.2"
[ -d "${link}.1" ] && mv "${link}.1" "${link}.2"
[ -d "$link" ] && mv "$link" "${link}.1"
# Log kezelés
cp -f "${log_prefix}${name}.log" "${log_prefix}${name}.1.log" 2>/dev/null || true
# Mentés (rsync)
# A --max-delete=500 megakadályozza, hogy egy véletlenül kiürített forrás mappa letörölje a teljes backupot.
if [ -d "${link}.1" ]; then
rsync -avh --delete --max-delete=500 \
--exclude='*.tmp' --exclude='~$*' --exclude='.trash*' \
--exclude='.thumb*' --exclude='Thumbs.db' \
--link-dest="${link}.1" \
"$sources/" "$link/" > "${log_prefix}${name}.log" 2>&1
else
# Ha még nem volt mentés (ez az első futás), akkor nincs mihez linkelni, sokáig fut...
rsync -avh --delete --max-delete=500 \
--exclude='*.tmp' --exclude='~$*' --exclude='.trash*' \
--exclude='.thumb*' --exclude='Thumbs.db' \
"$sources/" "$link/" > "${log_prefix}${name}.log" 2>&1
fi
rsync_exit=$?
# Hibakezelés: ha az rsync hibakóddal lép ki (pl. I/O hiba, vagy elérte a max-delete limitet)
if [ $rsync_exit -ne 0 ]; then
all_stats="${all_stats}\n--- ${name} ---\nFIGYELEM: Az rsync hibával zárult (kód: $rsync_exit)! Nézd meg a logot.\n$(tail -n 10 "${log_prefix}${name}.log")\n"
error_occurred=1
else
all_stats="${all_stats}\n--- ${name} ---\n"
all_stats="${all_stats}$(tail -n 3 "${log_prefix}${name}.log")\n"
fi
done
# --- 5. Statisztikák összegyűjtése az összes mappáról és levél összeállítása ---
end_time=$(date "+%Y-%m-%d %H:%M:%S")
# Újra lemezméret, hogy lássuk mennyit változott
final_usage=$(df -m "$target_mount" | awk 'NR==2 {print int($3/1024)}')
# Levél státuszának beállítása hiba esetén
if [ $error_occurred -eq 1 ]; then
subject="Backup FIGYELEM - Részleges hiba"
status_msg="A mentés során hiba lépett fel (lásd a statisztikát)."
else
subject="Backup kész"
status_msg="Mentés sikeresen lefutott."
fi
mail_body="Mentés kezdete: $start_time
Mentés vége: $end_time
$status_msg
--- Tárhely ---
A backup SSD-n jelenleg: ${final_usage} GB foglalt.
Összesített statisztika:
$all_stats"
echo -e "Subject: $subject\n\n$mail_body" | /usr/libexec/proxmox-mail-forward
Manuálisan is futtathatjuk/tesztelhetjük, de a forrás mappa méretétől függően az első mentés akár órákig is eltarthat. 100 GB mentésekor HDD-ről HDD-re, kis fájlokkal, töredezett fájlrendszerrel az első mentés akár 2,5 óra is lehet. Ha a forrás SSD, a cél HDD, akkor 30-60 perc. SSD-ről SSD-re 100 GB kis fájlnak csak 20 perc kell. Szal. semmi pánik, ha az első futása "végtelen történet".
Kis módosítással több forrás meghajtót és több másolandó mappát is tudna kezelni... de ott probléma lehet, hogy ha sokáig fut, akkor ütközik mással. Ezért több ilyen backup scriptem van, minden ment egy kicsit, gyorsan, más-más időpontban.
Ha szintaktikai hibát ír, akkor az a windows vs unix sortörések miatt van 99%-ban. Futtassuk ezt:
sed -i 's/\xc2\xa0/ /g' backup2.sh
Crontabban keressünk neki egy megfelelő időpontot:
crontab -e
Adjuk a végéhez ezt (illetve módosítsa mindenki a szokásai szerint):
# user mappák mentese (Csutortok 04:00)
20 4 * * 4 /root/script/backup2.sh > /dev/null 2>&1
Mentsük el, ezzel készen is vagyunk. Logrotate a scriptben, tesztelés és kész.
A cikk még nem ért véget, kérlek, lapozz!



