Linux szerver ütemezett mentése NAS eszközre.

Fórumok

A topik régi címe "Linux szerver mentése Windows alól" volt. Most már közeledem a megoldáshoz, de mert volt aki kíváncsi, hogy mi lesz a megoldás ezért itt folytatom. Szóval vettünk egy NAS eszközt...
Ennél a kérdésnél kezdődik az ezzel kapcsolatos aktuális problémám illetve az új kérdéseim! :-{)E
#===
Innentől a topik jelen állapot szerint már többnyire elavult része:
#===
Van egy részlegünk, ahol van egy Linux szerver (Ubuntu 8.04 LTS), amin sambát és MySQL adatbázist használunk. Két Windowsos gépen fut egy program, ami a szerver MySQL adatbázisába dolgozik.
Szeretnék minden nap a munka végén csinálni egy komplett mentést.
A mentés az alábbiakból állna:
- MySQL adatbázis teljes mentése. Nem csak az alkalmazáshoz tartozó, hanem az adminisztrációs táblákat is menteném.
- A szerver config fájlok mentése.
- Azt a sambas megosztás mentése, ahova a Windowsos alkalmazás, még fájlokat pakol. Ez a legkönnyebb, mert a Windowsos gépekre fel van mappelve.

A mentés eredménye a Windowsos gép merevlemezére kerülne.

Mindezt a Windows munkaállomásról kezdeményezve, de úgy, hogy az ott dolgozók számítástechnikai ismerete nulla. Szóval olyan, hogy ssh-n belép és menteget akár csak egy szkriptet is elindít nem jöhet szóba. A Dolgozó csak annyit tud, hogy van az asztalon egy ikon, aminek az a neve, hogy "Napi mentés", ő este arra rákattint és megvárja amíg a végén kiírja, hogy a "Mentés befejeződött!"

Szóval az kellene, hogy a Windowsos gépen elindítok egy parancsfájlt, (bat vagy cmd) ami elindít a Linux szerveren egy (ott már kész) szkriptet a megfelelő jogosultsággal úgy, hogy a Windows megvárja annak lefutását és a Windowson futó parancsfájl akkor folytassa a saját tevékenységét, amikor a Linuxon már lefutott a mentés Linuxos része.

Gondoltam a Linux oldalon időzített mentésre, ami a munka végén lefut, de így nem tudom biztosítani, hogy az alkalmazásokból már kilépjenek mire a mentés fut. És sajnos nem hajszál pontosan minden nap ugyanakkor fejezik be a munkát.

Kiegészítés:
Néhányan fennakadtak, a konfigurációs fájlok mentésének gyakoriságán ezért ezt még hozzátenném:
A konfig fájlokat valóban elég ritkábban menteni. Hetente vagy havonta illetve adminisztrációs beállítások után.
Azonban:
Az SQL adatbázist és a program munkakönyvtárat naponta kell menteni, akkor lehet, hogy az 1-2 perc futásidő és néhány 100kb tárterület, -ami a konfigok mentéséhez kell-, már nem sok erőforrást igényel és egyszerűbb, mint két vagy több fajta mentést futtatni különböző ütemezésekkel.

Hozzászólások

Nekem eddig ilyen megoldási ötletem van:
Windows oldalon:
- A Windowson indított parancsfájl feltesz a szerver sambas megosztásába egy szemafornak használt fájlt, majd végtelen ciklusban ellenőrzi, hogy a szemafor fájl ott van-e még. Amíg ott van nem megy tovább, ha a fájlt letörölték, akkor tovább megy.
Linux oldalon:
- A munkaidő végének közeledtével percenként ellenőrzi, hogy ott van-e a szemafor-fájl, ahova a Windows teszi? Ha igen, akkor indítja a mentéseket, úgymint: MySQL-dump, config fájlok tar-gz-be csomagolása és ezek mindegyikének elhelyezése egy sambas megosztáson. Amikor végzett, letörli a szemafor fájlt és saját magát feladja a másnapi futásra.
Háááát... Elmésnek elmés, de van-e ennél jobb és szebb megoldás?
--
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)

Nos, a kritikus pont a MySQL szerver, nem a configok, szerintem. Itt van 3 megoldás:
1. A configokra elég egy sima cron is, a MySQL szerverre is, elvileg, amennyiben mysqlhotcopy-t használ.
2. Én spéci DB replikációt csinálnék, aztán dolgozzon a Linuxos szerver, és hagyja ki belőle a Wint...
3. Hajnali 4 körülre időzíteném a backupot, akkor valszeg senki nem dolgozik, esetleg nem annyira intenzíven. A script figyelhetné a forgalmat, amennyiben nincs forgalom, akkor indul a mentés.

Hirtelen ennyi...

--
Coding for fun. ;)

...
3. kiegészítve egy szemafor beállítással, ami a klienseknek szól, hogy a reggeli startnál van mit lementeniük. Esetleg páros páratlan napokon a két kliens felváltva.
4. Reggel a windowsos gép(ek) automatikusan induló parancs fájlból áthúzzák az éjszaka a szerveren készült mentést. Ezután szemafort billentenek, hogy a napközbeni újraindításkor ezt már ne tegyék.

A konfig fájlokat valóban elég ritkábban menteni. Hetente vagy havonta illetve adminisztrációs beállítások után.
--
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)

A mentést valahol, -a szervertől különböző helyen-, tárolni kell. A legolcsóbb megoldás, ha a kliensek merevlemezén tárolom.
Gondoltam eSatas külső merevlemezre is (20-35 eFt), de az egy esetleges szerver meghibásodás (mondjuk tápegység megfutás) esetén könnyen együtt hal meg a szerverrel. Marad még a hálózati tároló, ami már sokkal drágább. Igazából az adatvédelem itt az adat helyreállíthatóság miatt fontos, nem az ellopása ellen kell védeni. Arra bőségesen elég egy megfelelő jelszavas védelem az archívum fájlokba.
--
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)

Na, akkor figyelj... :D :D
Csináld a következőt:
1. backup megy a szerveren, egy külön mappába.
2. ha megvan a backup, átkerül a backup fájl egy publikus mappába, amit a kliensek olvasni tudnak.
3. a kliensek oldalán masol.bat:
copy \\fileserver\share\backup.tar.gz d:\backups\

Kézcsók, viszlát! :D :D
--
Coding for fun. ;)

tegyél fel a win-re egy linux parancsfuttatót, és akkor onnan azt írsz amit akarsz (belépés ssh-key), mert így pl egy bat elindítja, és a végén kiírja, hogy vége.
vagy teszel fel php-apach párost és írz rá egy kis weboldalt, ezt elindítja egy böngészőbe, a vége ugyan az.
vagy ami még lehet, hogy csinálsz egy bat file-t, ami bemásol a samban keresztül egy file-t, ahogy mondtad fel van mappelve, ezt a file-t nézed időnként cron-ból, és ha a tartalma ez+az, akkor elindítja, ha végez beleír valamit, a bat meg pont erre vár, ha megkapja kiírja végzett

a kérdés inkább a jogosultság, biztonság, egyidejű futtatás, hibakezelés

Amit én csinálnék... A wines gép leállítási scriptje indít a linuxon egy adatbázis-dumpot, a lefutása után meg rsync-kel lerántja a mentenivalót a windows-ra. Kellék: cygwin.dll, ssh, rsync a windows-os oldalon, sshd és rsync a szerveren, plusz gpedit-ből indítási/leállítási parancsfájlok megadása a Windows-on.

Ha a Linux megy folyamatosan, akkor célszerűen munkaidőn kívülre ütemeznék Linuxon egy adatbázis-dumpot, a Windows-os gépen meg az indítási scriptből húznám le automatice a helyi diszkre az utolsó mentést.

Szia.

Még egy lehetőség a fentieken kívül:
- A szerveren elkészíted a backup scriptet
- A felhasználónak készítesz egy ssh kulcsot és az authorized_keys fájlban beállítod, hogy a kulccsal történő bejelentkezéskor csak az adott scriptet lehessen futtatni
- A windowsos gépen putty segítségével létrehozol egy profilt, ami automatikusan belépteti a megadott felhasználónévvel és kulccsal, valamint automatikusan futtatja a scriptet.
- Készítesz egy parancsikont, ami a "-load mentes" paraméterrel indítja a putty-ot.

A felhasználó csak kattint kettőt, a fekete (vagy szépen testreszabott színű) ablakban kiírod neki a scripttel, hogy a mentés folyamatban. Ha végzett, küldesz egy üzenetet a net send segítségével, hogy kész a mentés.

Üdv: Zoli

Vagy van egy masik megoldas ;)
A windows-os gep segitsegevel le rakod a file-t egy megadott konyvtartba samba share-re. A linux szerver felveszi a jelzo filet-t es elkezdni a mentest majd a samba sheren-egy masik konyvtarba berakod a vegeredmenyt,persze egy "KESZ" file-val egyutt. Ha latja az illeto, hogy "KESZ" file letezik akkor a mentes megtorten. ;)

Linux oldalon webszerver, egyszerű kis cgi, ami indítja a mentést (vagy ütemezi, hogy x perc mulva induljon.)

Gizike desktopjára meg egy link a mentést indító weboldalra.

"A Dolgozó csak annyit tud, hogy van az asztalon egy ikon, aminek az a neve, hogy "Napi mentés", ő este arra rákattint és megvárja amíg a végén kiírja, hogy a "Mentés befejeződött!"

Ebbe szerintem pont belefér egy weboldalon gombra kattintás. Kb. én is azzal csinálnám, ha a crontab nem játszik a változó munkaidő vég miatt.

Köszi az eddigi ötletadó javaslatokat. Érik a dolog, de ha van még ötlet jöhet bátran!
Ígérem majd megírom hogy mire jutottam. Esetleg az alkalmazott megoldást is, meg a konkrét szkripteket is közzé teszem.
Büki András könyvét (UNIX/Linux héjprogramozás) még ma este előveszem. :-{)E
--
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)

Szia,

én a következőképp csinálnám bash segítségével:
---
Linux servered, ha látja a kliens gépet (tudja pingelni)..
---
if ping -c 1 $1; then
echo "Success"
else
echo "Fail"
fi
---
Miért jó ez?
Ha "Gizike" befejezte a melót, és elfelejtett kattintani, aznapi mentés megy a sunyiba. Ha áramszünet van, amire nem készülhettetek fel, szintén nem tud kattintani, megy a sunyiba --viszont egy win hostot azért még tarthatsz kis ups-en, ami kibírja, míg lefut a mentés.
-namost, a Fail üzenetet szepen kicsereled a mentes scriptedre, ncftpputtal akár még filezilla (érts windows kliens) is lehet backup tárhely.
A ping parancsot ha mondjuk kiegészíted a "-w" paraméterrel, ahol másodpercekben adod meg, mikor menjen a következő kérés, elég értelmes keretek közt meg lehetne mondani neki, hogy na akkor ments.

-
Debian Lenny

Linux szerveren időzítve lefuttatni a dumpot

Win gépeken filezilla ftp server - csak a szerver ip-jéről elérhető és erre az ftp-re mentheti a szerver a másolatot (mondjuk az adott dátum nevű könyvtárba vagy fájlba)

előtte lehet pinggel tesztelni, hogy elérhető -e a kliens.

ha a win kikapcsolására lehet scriptet megadni, akkor pl egy szemafor fájlt kereshet, ami jelzi, hogy épp mentés folyik és ne egedje kikapcsolni.

Gizikének nem kell kattintgatni.

http://www.windows-help-central.com/windows-shutdown-script.html

biztos meg lehet akarályozni a kikapcsolást, ha a szemafor fájl létezik, akkor a script azt mondja hogy ácsi, vagy legalábbis végigvárja amíg a szerver kitörli a szemafort.

Win alatt azt hiszem a ping jó lehet pause helyett, legalábbis egy nem létező alhálózati cím pingelése timeouttal jó erre. Így nem pörög és terheli feleslegesen a gépet a végtelen ciklus.
egy perc szünet pl ez: PING 192.168.0.88 -n 1 -w 60000 > NUL
Régebben használtam egy olyan scriptben ami egy gép be és kikapcsolását loggolta.

Ha gizike rátenyerel a gombra, vagy kinyomja alóla az áramot, az ellen nem véd semmi.
Nameg szerver oldalon is biztos megoldható, hogy érzékelje a mentés sikertelenségét.

Mondjuk akár azt is lehet, hogy a fenti linken lévő módszerrel kikapcsoláskor beinduljon a mentés, a mások által már fejtegetett módon.

Hasonlo celra (jelszo-generalas) en a SecureCRT-t hasznalom. Egy klikkre csatlakozik a gephez. A csatlakozott userhez meg Linuxon mar nem nehez beirni (vagy a .bashrc vagy a .profiles, nem tudom), hogy mit inditson _automatan_ (Nalunk pl. a makepasswd proggit, parameterezve, majd exit-tel lezarja a kapcsolatot)

Ha mégis a dolgozóra bízom, akkor ezt is megvizsgálom.
Az automata mentés egyetlen hátránya az lehet, hogy ha a Linuxon éjszaka futó lokális mentés olyan nagy állományt produkál, ami reggel az induló Windows boot idejét nagyon megnöveli a másolás miatt.
De szerintem tömörítve nem lesz olyan vészesen nagy.
Sőt ha a fentebbi pingelős ellenőrzés után a szerver végzi a kliensre másolást mondjuk délelőtt 10 órakor, akkor már a méret sem kritikus. Legfeljebb pár percre a kliens kissé belassul.
--
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)

Én így csinálnám:
inetd.conf-ban beállítasz egy tetszőleges portot, amin keresztül meghívod a backup script-et.
Utána parancsikon az asztalra (telnet, netcat, putty)az adott ip-re, portra.

Webes megoldáson nem gondolkodtál még? Php-vel szinte mindent meg lehet csinálni egy url megnyitásával...

Most még egyszer megkérdezem. Utoljára. Minek menteni a szerver konfigokat mindennap?
Másik kérdés. Minek egy ilyen mentéshez felhasználói beavatkozás?
Csak saját magadat szivatod ezekkel az álproblémákkal, amelyeket a nyakadba veszel.
Minden éjjel amikor már senki sem dolgozik lefut egy cron szkript, amely lementi a lementendőt, majd kiírja egy dvd-re, vagy egy külső merevlemezre, vagy bármire. Ennyi.
A többi hülyeséget pedig felejtsd el.

Köszönöm a hozzászólásaidat.
Ha elolvasnád azt is amit én írtam a hozzászólásokban, akkor már nem kellene kérdezgetned, hogy miért kell naponta menteni a konfigokat. De megkerestem neked, ezt olvasd el!
És nézzük egy másik aspektusát a konfigok mentésének! Az SQL adatbázist és a program munkakönyvtárat naponta menti, akkor lehet, hogy az 1-2 perc futásidő és néhány 100kb tárterület, -ami a konfigok mentéséhez kell-, már nem sok erőforrást igényel és egyszerűbb, mint két vagy több fajta mentést futtatni különböző ütemezésekkel.
A DVD-re írás egyrészt fölösleges a minden napi mentést DVD-re írni, másrészt ugyanúgy felhasználói beavatkozást igényel, mert naponta ki kell cserélni a DVD-t. Nincs a helyszínen senki akire ezt rá lehetne bízni és biztosan nem felejti el! Ráadásul a szerver a főnök irodájában van, aki nem is jelenik meg mindennap a helyszínen, kulcsa pedig csak neki van, illetve a "csak tűz esetén felbontandó" dobozban.
A külső merevlemezről is leírtam már, miért nem tetszik nekem.
--
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)

Használj NAS-t. Komolyan.
Ezzel a "Gizike gépére mentjük a szervert" dologgal jó eséllyel csak halálra szivatod magad és a céget.

Tudom, kevés a pénz, de meg kellene kérdezni a főnököt, mi a fontosabb a cég összes adata, vagy max. 100 000Ft a következő 3-5 évre.

Én is tudom szeretni, amikor egy problémára adott megoldás helyett más feladatot próbálnak az emberek megoldani, és utána még rá is kérdeznek, hogy de miért kéne az eredeti felvetésben szereplő kérdésre a válasz, amikor egy másikra sokkal egyszerűbb... Itt az a feladat, hogy a szerverről naponta, jól meghatározott fájlokat, meg az adatbázisdumpot felhasználói beavatkozás nélkül az egyik munkaállomásra mentsük le -- erre nagyon nem lehet mást mondani, mint a Win-es indulási/leállítási parancxsállománya...

A felhasználó általi Windows indítás/leállítás időpont/script talán nem is érdekes.

Hajnali 2-kor már biztos nem dolgoznak az irodában, akkor Wake On LAN-nal vagy BIOS időzítéssel fel lehet ébreszteni a klienst, hálózaton lehet rá másolni a mentést, utána pedig a Linux-ról távolról lekapcsolni.

Sőt ha a kliensen van hely, akkor a Windows mellett elfér egy Linux is és úgy kell konfigurálni a gépet hogy ha hajnali 2 és 3 közt kapcsolják be akkor Linux-ot indítson egyébként meg Windows-t és így már csak Linux-ról Linux-ra kell menteni.
--
Légy derűs, tégy mindent örömmel!

A teljes /etc mentése gyorsabb/egyszerűbb, mint mazsolázgatni, adatmenyiségben meg nagyjából mindegy.
NEM akarja alkalmazottra bízni: automatikusan (user-interakció nélkül), viszont a régi, de igaz mondás betartásával: a mentést nem tartjuk a mentett gépen.
Persze, lehetne NAS-ra is menteni, viszont a kliensen van hely, ha meg NTFS van, és Gizike nem matathatja a mentéseket, akkor még úgy-ahogy biztonságban is lesznek a mentett cuccok. Az egyik helyen "keresztbe" megy a mentés a windows-os gép indulásakor: a könyvelési stuff fájljai a Linuxon vannak, az iskolai rendszer lomjai meg -a samba botrányosan sz@r performanciája miatt- a windows-os munkaállomáson, ergo a könyvelési cucc mentése a windows-ra történik, az iskolai rendszer nyitó állapota meg megy fel a Linuxra.

Odáig jutottam, hogy vettünk egy NAS eszközt.
A mentést három szkripttel oldottam meg. Egyet, --nevezzük vezérlő szkriptnek-- betettem a crontab-ba, hogy minden éjszaka 01:10-kor fusson le.
A vezérlőszkript:


#!/bin/bash

# A NAS IP-címe
nas_ip0=192.168.55.220
# ha mountolva van, létezi itt az "ok" fajl!
van_file_ok='/mnt/nas/szerver/ok'

if ping -c 1 $nas_ip0; then
    if [ -f $van_file_ok ]
    then
    echo "Már mountolva van!"
    else
    mount $nas_ip0:/mnt/ide1/szerver /mnt/nas/szerver
    fi
echo "Sikerült $nas_ip0"
df -Th
/Bck/mysql-backup.sh
/Bck/mentes-rotate.sh
umount /mnt/nas/szerver
/usr/sbin/sendmail dejo@fakemail.com < /Bck/ok-NAS.eml

else
echo "Nem sikerült $nas_ip0"
/usr/sbin/sendmail dejo@fakemail.com < /Bck/noNAS.eml
fi

Ez ha IP-cím alapján létezik a NAS eszköz, akkor annak nfs megosztását mountolja, a MySQL adatbázisokat mysqldump-pal is és mysqlhotcopy-val is egy átmenteti könyvtárba menti, majd ezt a könyvtárat és még néhány másikat egy tar paranccsal egy napi mentés fájlba teszi egyenesen a NAS-on lévő nfs megosztásba.
Ha valakit érdekel kiteszem valahova a szkripteket, de még nincsenek teljesen készen. Maga a mentés végző szkript ezen alapszik: Ubuntu Backup

Emlékeztetőül egy Ubuntu 8.04 LTS szerverről van szó.
Annyival szeretném még kiegészíteni az eljárást, hogy ha a NAS eszköz nem elérhető, akkor küldjön egy emailt egy interneten elérhető e-mail címre. Tehát nem helyi felhasználónak!
Hogy lehet beállítani, hogy egy internet szolgáltató (konkrétan az Enternet) autentikált SMTP szerverét használja? Természetesen a felhasználó nevet és a jelszavát is ismerem.
--
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)

.
<-------
You can't grep on dead trees.

Nem olvastam végig az összes hozzászólást, és lehet hogy mások javasolták! Hallottam olyat, hogy olyan esetben, amikor abszolute nem értenek a dolgozók a linux-hoz, kaptak egy felhasználót, aminek a login script-je nem állt másból, mint hogy leállt a gép, így biztosítva a hibamentes leállítást!

Esetedben is működhetne a dolog, csupán csak a login script csinálna mást. :)

Előfordulhat, hogy hülyeséget javasolok. :)

Ez is egy jó ötlet, de már változott a koncepció. Van egy NAS, amire a szerver automatikusan ment minden éjszaka 01:10-kor. Így nem kell felhasználói közreműködés.
Most már csak azt szeretném, ha a crontabban időzített szkript küldene egy emailt akkor ha nem tudta mountolni a NAS nfs megosztását.
Lásd az előző hozzászólásomat.
A szkriptbe már betettem a levél küldést, de a logokban postfix errorra panaszkodik. Persze a posztfix-et nem állítottam be, nem is igazán lenne rá szükség, ha valahogy rá lehetne venni, hogy a sendmail parancs használja közvetlenül az Enternet által biztosított autentikált SMTP-t.
Ezt hogy lehet, ha lehet?
Vagy nem lehet megúszni a postfix felélesztését?
Ok. Rájöttem, hogy a sendmail parancs is a postfix része. Akkor marad a postfix main.cf kitöltése.
--
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)