Amanda telepítése (Wheezy)

Innen: AdminWiki

Jelenleg az Amanda (The Advanced Maryland Automatic Network Disk Archiver :-) backup szoftvert használjuk archívumok és biztonsági másolatok készítésére. Az Amanda kliens-szerver felépítésű, a backup gépen telepített Amanda szerver cron jobból meghívva szólítja meg a klienseket, ahol a másolatot az inetd (xinetd) alatt futó Amanda kliens készíti el, és továbbítja a szerverre.

Az Amanda mentés jellegzetességei

Az Amandát eredetileg mágnesszalagos backup kezelésére tervezték, így a merevlemezen is virtuális szalagokat (valójában alkönyvtárakat) használ és minden backup feladat (task) minden sessionjéhez (tipikusan napi egyszeri mentés) egy darab, megadott maximális méretű tárhelyet (virtuális szalagot) használ el. A szalagméretet soha nem lépi túl.

Az Amanda nagy előnye, hogy nem kell statikus mentési tervet készíteni; egy mentési feladathoz elegendő megmondani, hogy mely kliensgépek mely könyvtárait kell menteni ebben a feladatban (disklist), mekkora méretű a virtuális szalag, hány darabot használhat összesen (tapecycle) és hány mentésenként szeretnénk teljes (level-0, nem inkrementális) mentést készíteni (dumpcycle). Ezután az Amanada minden mentés elején kiszámolja, hogy az egyes könyvtárak level-0 illetve inkrementális mentéseihez aktuálisan mennyi hely kellene, és önállóan eldönti, hogy az adott mentésbe milyen könyvtár milyen szinten kerüljön bele - ha van felesleges hely, előrehozza a level-0 mentéseket, ha kifut a helyből, késlelteti azokat (és figyelmeztetést ír a mentési naplóba).

Az Amanda mentéséből - ha azt naponta, pl. éjszaka végezzük - legalább a dumpcycle és legfeljebb a tapecycle idejének megfelelően állítható vissza a tartalom (részben vagy egészben) bármelyik mentés időpontjának megfelelő állapotába; pl. 14 napos tapecycle és 7 napos dumpcycle esetén a legfeljebb 7 napja véletlenül letörölt állományt biztosan, a legfeljebb 13 napja letöröltet jó eséllyel állíthatjuk vissza. Vagyis az Amanda mentés nemcsak a klasszikus teljes adatvesztés ellen véd, hanem valamelyest az időben észlelt felhasználói hiba illetve szabotázs ellen is. Napi egyszeri, éjszakai mentés esetén azt mondhatjuk, hogy amelyik állomány egyszer már "nálunk aludt", azt utána jó eséllyel tudjuk visszaállítani.

Technikailag az Amanda virtuális szalagok egy-egy könyvtárnak, benne a taskhoz tartozó egyes kliens könyvtár mentések egy-egy, lényegében tar.gz állománynak felelnek meg. Így valamennyi szalagkönyvtárat végignézve, azokból a legfrissebb level-0 tar.gz-ket kiválogatva és pl. külső lemezre másolva a mentett tárterület majdnem konzisztens (pl. heti frissítéssel tűzkazettába tehető, vagy alkalmanként futtatva hosszú távra archiválható, tömörített) állapotát kapjuk - így működik az amanda-server-addons csomag on-demand archiváló scriptje.

TODO!

Amanda kliens telepítése

Minden gépre, amelyről szeretnénk biztonsági másolatot csinálni, telepíteni kell az Amanda klienst:

apt-get install amanda-client # magával hozza az openbsd-inetd-t (sajnos)

Az Amandának minden egyes file-ra kell olvasási jogot kell biztosítani, ami korábban csak úgy volt (egyszerűen) megoldható, ha az amandad root-ként futott. A Squeeze óta ezt megoldották (valószínűleg suid root - TODO: utánanézni!), így a korábbi változatokkal szemben a /etc/inetd.conf-ban nem kell (nem szabad) a démont futtató felhasználót root-ra módosítani.

Derítsük fel, hogy az Amanda szerverről indított kapcsolatkérés a telepítés alatti szerverre milyen IP címmel érkezik meg (ha a backup szerver a belső hálózaton van, DMZ és publikus zónabeli szerverek esetében ez a belső hálózat tűzfalának címe lesz). Ezt a címet (illetve ennek reverse-ét) vegyük fel a /etc/amanadahosts állományba (az itt felsorolt hostokról az itt megjelölt távoli - jelen esetben backup - felhasználó nevében lehet majd menteni):

-rw------- backup backup /etc/amandahosts
localhost backup
IP_REVERSE backup

A Wheezy-ben az Amanda alapértelmezett protokollja UDP-ről TCP-re változott (ld. itt), így az /etc/inetd.conf-ban ennek megfelelő bejegyzés szerepel. Ha az Amanda szerver korábbi verziójú (Squeeze), ezt vissza kell változtassuk UDP-re:

-rw-r--r-- root root /etc/inetd.conf

[...]
#:OTHER: Other services
#amanda stream tcp nowait backup /usr/lib/amanda/amandad amandad -auth=bsdtcp amdump amindexd amidxtaped
amanda dgram udp wait backup /usr/sbin/tcpd /usr/lib/amanda/amandad -auth=bsd amdump amindexd amidxtaped

Wheezy Amanda szerver esetén ez a változtatás nem szükséges.

Amanda átengedése a bástyagép tűzfalán

Az Amanda sajnos titkosítatlan adatkapcsolatot használ (és nem egyszerű tunnelezni - TODO: utánanézni!), valamint kliense nem standalone démon, hanem az inetd alatt fut, ezért igyekezzünk tűzfallal is korlátozni a hozzá kapcsolódást, vagyis a backup szerver semmiképpen se legyen a kliens felől nézve a net zónában!

A házirend szerinti alapértelmezett tűzfalszabályok tartalmazzák a szükséges beállításokat arra az esetre, ha az Amanda szerver a trs zónában van:

-rw-r----- root root /etc/shorewall/rules

# Accept Amanda connections from trs
Amanda/ACCEPT   trs     fw
ACCEPT          trs     fw      udp     0:65535 amanda
ACCEPT          trs     fw      tcp     amandaidx
ACCEPT          trs     fw      tcp     amidxtape

ez esetben nincs teendőnk.

TCP keep alive módosítása

Nagy adatmennyiség mentésekor az Amanda kicsúszhat az iptables 30 perces TCP timeout-jából (ennyi idő után elbontja az inaktív TCP kapcsolatokat). Egy workaround lehet a kliens kernelében a TCP keep alive intervallumának csökkentése (ennyi időnként küld a kernel keep alive csomagot) az alapértelmezett 2 óráról pl. 15 percre:

-r-------- root root /etc/sysctl.d/local.conf

[...]
# reduce keep alive interval
net.ipv4.tcp_keepalive_time=900

illetve azonnali érvényesítés:

echo 900 >/proc/sys/net/ipv4/tcp_keepalive_time

Gyorsteszt

TODO!

Amanda szerver telepítése

Még ne vedd komolyan, csak önmagára amandázó szerveren (azonos kliens verzió) van tesztelve!

Amanda szervert telepíteni kell a dedikált backup szerverre, illetve minden olyan szerverre, amelyik önmagára amandázik. Debian csomagból telepíthető:

apt-get install amanda-server

Ezután a /usr partíciót írhatóan csatoljuk újra:

mount -o remount,rw /usr

és töltsük le, majd könyvtárhelyesen tömörítsük ki a legutóbbi kiadású (Squeeze-hez legalább v.1.0.0) amanda-server-addons.tgz csomagot! A csomag a következőket biztosítja:

  • script új Amanda task létrehozatalához (amanda-new);
  • scriptek "beragadt" Amanda taskok biztonságos leállításához (amanda-stop, amanda-tape-purge);
  • taszkonként egy generált cron job a napi mentéshez szükséges teendőkkel
    • előző délutáni tesztelés;
    • éjszakai mentés;
    • esetleg sikertelen ("beragadt") task reggeli leállítása, takarítás.
  • script és cron job heti archiváláshoz (csak a legfrissebb lvl-0 mentések archiválása külső mount point-ra).

A telepítést követően csatoljuk vissza a /usr partíciót read-only módban:

mount -o remount /usr

Beállítások

Az /etc/amandahosts-ban engedélyezni kell a root felhasználónak az amindexd és amidxtaped service-eknek a localhostról történő igénybe vételét:

-rw------- backup backup /etc/amandahosts

[...]
localhost root amindexd amidxtaped

Gyorsteszt

TODO!

Az amanda-archive telepítése és használata

Az amanda-archive olyan script, amelyik végignézi egy megadott Amanda tárhely összes DLE mentéseit, azok közül kiválogatja a legfrissebb nullás szintű (lvl-0) mentéseket, és ezeket a szalagfejléc levágásával egyszerű .tar.gz állományokként kimásolja egy megadott tárterületre. Célszerűen periodikus archiválásra használható, pl. USB-n felcsatolt külső winchesterre (ez az eszköz utána elvihető és más helyen, pl. páncélszekrényben őrizhető, katasztrófa esetén elővehető).

Figyelem! Az amanda-archive használata biztonsági kockázatot jelent, hiszen kérdés nélkül kimásol egy tárterületet a behelyezett adathordozóra. Csak akkor használjuk, ha a szervergéphez (illetve a külső csatlakozóhoz) illetéktelen nem fér hozzá!

A scriptet az amanda-server-addons csomag tartalmazza. Az alábbi leírásban azt egy külső winchesterre történő, on-demand archiváláshoz fogjuk beállítani.

  • Telepítsük az autofs Debian csomagot, amely képes egy külső (pl. USB-n csatolt) merevlemez felismerésekor az azon lévő partíció(ka)t automatikusan mountolni:
apt-get install autofs # + függőségek
  • Készítsünk egy mount gyökérkönyvtárat az autofs által kezelendő partíciókhoz:
mkdir /mnt/auto

definiáljunk egy beállító állományt ehhez a mount point-hoz a /etc/auto.master közepe táján:

-rw-r--r-- root root /etc/auto.master

[...]
#/net   -hosts
#
# Amanda archive automounts
/mnt/auto       /etc/auto.amanda --timeout=60

# Include /etc/auto.master.d/*.autofs
  • Formázzunk meg egy kellően nagy méretű merevlemezt egyetlen ext3 partícióval! Csatlakoztassuk ezt USB-n keresztül a backup szerverhez, és jegyezzük fel, hogy a kernel milyen eszköznevet rendelt hozzá (példánkban legyen /dev/sdg)!
  • Készítsük el az auto.amanda állományt, amely megmondja, hogy ennek a lemeznek az első partícióját (példánkban /dev/sdg1) a /mnt/auto/amanda helyre kell felcsatolni:
-rw-r--r-- root root /etc/auto.amanda

# This is an automounter map and it has the following format
# key [ -mount-options-separated-by-comma ] location
# Details may be found in the autofs(5) manpage

amanda  -fstype=auto,rw         :/dev/sdg1

Indítsuk újra az autofs daemont:

invoke-rc.d autofs restart
  • Gyorstesztként csatlakoztassuk újra a külső merevlemezt (pl. az USB-egység ki- majd bekapcsolásával)! Rövid várakozás után adjuk ki az
ls /mnt/auto/amanda

parancsot, amelynek a merevlemez tartalmát kell mutatnia. Írjunk a merevlemezre, ellenőrizzük ennek sikerességét, majd várjunk legalább egy percig (ennyi az auto.master-ben beállított timeout) és az

ls /mnt/auto

paranccsal ellenőrizzük, hogy az amanda könyvtár eltűnt (az autofs lecsatolta).

Ha a teszt sikeres volt, az autofs megfelelően kezeli a külső merevlemezt, azaz archiválás előtt elég azt fizikailag csatlakoztatni, és az archiválás befejeződése után egyszerűen le lehet venni a backup szerverről anélkül, hogy arra be kellene lépni.

  • Végül ütemezzük be a mentést az amanda-server-addons által telepített cron job (/etc/cron.d/amanda-cron-weekly) kommentjének eltávolításával. Így minden hétköznap és vasárnap reggel 9-kor elindul az archiválás (de azonnal kilép, ha nincsen csatlakoztatva a megadott merevlemez) - azaz ha bármely munkanap reggel 9-ig csatlakoztatjuk a merevlemezt, elindul az archiválás, és ha elkészült, a következő munkanap reggel 9 előtt a merevlemez bármikor levehető (a szombat kihagyása miatt a pénteken feltett merevlemezre is csak egy mentés készül). Az archívum állományok a partíció gyökérkönyvtárába kerülnek, amelyet a script még az archiválás megkezdése előtt kiürít - nem bántja azonban az esetleges alkönyvtárakat. A script igyekszik gazdálkodni a tárterülettel, illetve kezeli azt az esetet, amikor minden friss lvl-0 nem fér rá a megadott merevlemezre.

Az Amanda használata

Amanda taskok felvétele

Az amanda-server-addons csomaggal települő amanda-new scripttel (rendszergazdaként) egyszerűen hozható létre naponta futtatandó Amanda task:

amanda-new TASKNAME "/var/backups" NO_OF_TAPES

ahol TASKNAME a feladat neve (ez könyvtár- és filenévként valamint cron job neveként is használatos, célszerű angol alfanumerikus jelekből és kötőjelekből összeállítani, aláhúzásjel kerülendő! - hasznos konvenció, hogy kezdődjék nagybetűvel), NO_OF_TAPES pedig a használandó szalagok száma (alapértelmezésben 14). A szalagokat (tape könyvtárak) a script a megadott (javaslat: /var/backups) útvonalon elhelyezett TASKNAME könyvtárban hozza létre és az Amanda igényei szerint fel is címkézi azokat. Létrehozatal után a könyvtárak innen elmásolhatóak (akár különböző partíciókra) és symlinkelhetőek.

Alapértelmezésben a scripttel definiált Amanda task annyi naponta készít teljes mentést, ahány szalagot definiálunk (dumpcycle = tapecycle). Érdemes lehet ezt a gyakoriságot duplázni, a task konfigurációs állományában a dumpcycle csökkentésével:

-rw-r----- backup backup /etc/amanda/TASKNAME/amanda.conf

[...]
dumpcycle 7             # the number of days in the normal dump cycle
tapecycle 14 tapes      # the number of tapes in rotation
[...]

A definiált taskot a

su backup -c "/usr/sbin/amcheck TASKNAME"

paranccsal próbálhatjuk ki, amely egyelőre csak a szerver oldalt ellenőrzi, mivel a mentendő partíciókat illetve könyvtárakat definiáló /etc/amanda/TASKNAME/disklist állomány még nem tartalmaz bejegyzéseket. Ha a fenti teszt hibátlanul lefut, kitölthetjük a disklist-et.

Amanda disklist receptek

A klasszikus megoldás a kliensgépek partícióinak (kivéve /tmp, swap) egyben történő mentése:

# server.mydomain.com
#
# /boot
server.mydomain.com     /dev/md0                        hard-disk-comp
# /
server.mydomain.com     /dev/md3                        hard-disk-comp
# /usr
server.mydomain.com     /dev/md4                        hard-disk-comp
# /var
server.mydomain.com     /dev/md5                        hard-disk-comp
# other partitions... (if any)

azonban a production serverek /var partíciója általában nagyon nagy, és az állandó változások miatt mentés közben is változik (TODO: snapshot).

Elegendő lehet a teljes gépek helyett csak a releváns szolgáltatások adatainak, beállításainak mentése (bár teljes katasztrófa esetén ebből a gép "klónképe" nem állítható helyre - új gépet kell telepíteni és a szolgáltatásokat arra visszaállítani, ami lényegesen időigényesebb). Az alábbiakban egyes, ebben a Wikiben ismertetett szolgáltatások Amanda mentésére szolgáló receptek következnek.

A disklist-ben néha trükköket kell(het) alkalmazni (TODO!), az alábbi feltételek kielégítése érdekében:

  • include-olni csak egy szinten lehet, az include direktívában nem szerepelhet alkönyvtár, és ha van include (de csak ekkor!), a mentést futtató backup:disk Linux rendszerfelhasználónak legalább belépési (--x) engedéllyel kell rendelkeznie a mentési egység (disklist entry, DLE) gyökérkönyvtárába;
  • exclude-olni csak shell mintákkal lehet, reguláris kifejezéseket az Amanda (GNU tar) nem értelmez.

Ennek áthidalására, ahol mélyebb könyvtárszerkezetből kellene include-olni, ott megtehetjük, hogy felveszünk mindent, és igyekszünk kizárni, ami nem kell. Ilyenkor a kizáró kifejezést igyekezzünk csak az első eltérésig felírni, mert a mintánál rövidebb pathname nem fog illeszkedni a kizárásra!

DNS service

# server.mydomain.com
#
# Bind9 settings
server.mydomain.com     /srv/chroot/bind/etc/bind       hard-disk-comp
# Bind9 logfiles
server.mydomain.com     /var/log/bind9                  hard-disk-comp

ownCloud példány

Egy wsm2 környezetben, házirend szerint telepített ownCloud példányról pl. az alábbi disklist alapján készíthetünk mentéseket:

  • a beállítások mentésénél TODO!;
  • a naplók mentésénél második szintű könyvtárat kell menteni trükkös exclude-dal;
  • a web statisztika mentésénél második szintű könyvtárat kell menteni trükkös exclude-dal;
  • a virtualhost tárterülete trükkök nélkül menthető;
  • a példában a /mnt/storage alatt elkülönített, terjedelmesnek feltételezett adatterületet az elsődleges könyvtárak ABC szerinti felosztásával osztjuk szét;
  • a közös kódkészlet trükkök nélkül menthető.
# settings

# relevant logfiles
FULLY.QUALIFIED.SERVERNAME /var/log     {
                                         hard-disk-comp
                                         include "\./apache2"
                                         include append "\./php5"
                                         exclude "./apache2/[!F][!U][!L][!L][!Y]*"
                                         exclude append "./php5/[!F][!U][!L][!L][!Y]*"
                                        }
# statistics webpages
FULLY.QUALIFIED.SERVERNAME /var/www/./awstats           /var/www {
                                                         hard-disk-comp
                                                         include "\./awstats"
                                                         exclude "./awstats/[!F][!U][!L][!L][!Y]*"
                                                        }
# web virtualhost itself
FULLY.QUALIFIED.SERVERNAME /var/www/./web               /var/www {
                                                         hard-disk-comp
                                                         include "\./FULLY\.QUALIFIED\.HOSTNAME*"
                                                        }
# database
FULLY.QUALIFIED.SERVERNAME /var/backups/mysql/last      {
                                                         hard-disk-comp-full
                                                         include "./*oc_INSTANCENAME*"
                                                        }
# file storage (divided, using mnemonics)
# see: https://wiki.zmanda.com/index.php/How_To:Split_DLEs_With_Exclude_Lists
FULLY.QUALIFIED.SERVERNAME /mnt/storage/FULLY.QUALIFIED.HOSTNAME/./a-a  /mnt/storage/FULLY.QUALIFIED.HOSTNAME {
                                                                        hard-disk-comp
                                                                        exclude "\./[b-z]*"
                                                                        exclude append "\./[A-Z]*"
                                                                        exclude append "\./[0-9]*"
                                                                        }
FULLY.QUALIFIED.SERVERNAME /mnt/storage/FULLY.QUALIFIED.HOSTNAME/./b-z  /mnt/storage/FULLY.QUALIFIED.HOSTNAME {
                                                                        hard-disk-comp
                                                                        exclude "\./[a]*"
                                                                        }
# code base
FULLY.QUALIFIED.SERVERNAME /usr/local/share {
                                             hard-disk-comp
                                             include "\./owncloud*"
                                            }

ProFTPm hosting

# server.mydomain.com
#
# ProFTPm settings
server.mydomain.com     /etc/proftpm                    hard-disk-comp
# FTP logfiles
server.mydomain.com     /var/log/proftpd                hard-disk-comp
# MySQL databases daily dump created by mysql-addons (all databases, not only ftp-related)
server.mydomain.com     /var/backups/mysql/last         hard-disk-tar-full
# FTP storage
server.mydomain.com     /var/opt/ftp                    hard-disk-comp

Samba fileserver

# server.mydomain.com

# Settings and databases
server.mydomain.com     /etc/samba                      hard-disk-comp
server.mydomain.com     /var/lib/samba                  hard-disk-comp
server.mydomain.com     /var/log/samba                  hard-disk-comp
#
# Shares
server.mydomain.com     /var/opt/samba/homes            hard-disk-comp
server.mydomain.com     /var/opt/samba/profiles         hard-disk-comp
server.mydomain.com     /var/opt/samba/services         hard-disk-comp
#
# Maybe separated according to shares and tape size.
server.mydomain.com     /var/opt/samba/share            hard-disk-comp

VExim mail service

# server.mydomain.com
#
# Courier IMAP/POP3 settings
server.mydomain.com     /etc/courier                    hard-disk-comp
# Exim4 MTA settings
server.mydomain.com     /etc/exim4                      hard-disk-comp
# Squirrelmail MUA settings
server.mydomain.com     /etc/squirrelmail               hard-disk-comp
# VExim codebase
server.mydomain.com     /usr/local/share/vexim2         hard-disk-comp
# VExim-related MySQL databases daily dump created by vexim-addons
server.mydomain.com     /var/backups/mysql/vexim        hard-disk-tar-full
# Squirrelmail MUA storage (address books, user's settings, etc.)
server.mydomain.com     /var/lib/squirrelmail           hard-disk-comp
# Mail storage
server.mydomain.com     /var/mail/.vexim                hard-disk-comp
# Courier IMAP/POP3 authentication and activity logfiles
server.mydomain.com     /var/log/courier                hard-disk-comp
# Exim4 MTA logfiles
server.mydomain.com     /var/log/exim4                  hard-disk-comp
# Squirrelmail and VExim web interface
server.mydomain.com     /var/www/mail.geocom.hu         hard-disk-comp

wsm2 webhosting

# server.mydomain.com
#
# Webserver settings
server.mydomain.com     /etc/apache2                    hard-disk-comp
# AwStats settings
server.mydomain.com     /etc/awstats                    hard-disk-comp
# Optionally - may contain archived migrations, etc.
server.mydomain.com     /home/webadmin                  hard-disk-comp
# MySQL databases daily dump created by mysql-addons (all databases, not only web-related)
server.mydomain.com     /var/backups/mysql/last         hard-disk-tar-full
# AwStats database
server.mydomain.com     /var/lib/awstats                hard-disk-comp
# Webserver logs
server.mydomain.com     /var/log/apache2                hard-disk-comp
# PHP logs
server.mydomain.com     /var/log/php5                   hard-disk-comp
# Web storage
server.mydomain.com     /var/www                        hard-disk-comp

Visszaállítás Amanda backup-pal

TODO!

Recovery with amrecover
-----------------------
As root on the tape server:

mkdir /tmp/restore
cd /tmp/restore
amrecover TASZK-NEVE
setdate (Optional)
sethost foo
setdisk bar
cd dir/which/contains/filetorecover
add filetorecover

settape chg-multi
list

extract
quit

Ha a visszaállított állománynevek karakterkódolása nem lenne megfelelő:

convmv -r -f [AMILYENRŐL] -t [AMILYENRE] /tmp/restore

A convmv természetesen nem nyúl bele a tartalomba, csak a neveket módosítja.

Amanda task törlése

TODO!

Cron job file:           /etc/cron.d/amanda-cron-TASKNAME
Configuration directory: /etc/amanda/TASKNAME
Tape root directory:     /var/backups/TASKNAME
Libs root directory:     /var/lib/amanda/TASKNAME
Logs root directory:     /var/log/amanda/TASKNAME

Irodalom