Backup del sistema
En aquest document faig investigacions i aproximacions per tal d'aconseguir fer backups en els diferents ambents que necessito: Linux, Windows, ús de SSH i RSYNC, backups incrementals si o no, backups comprimits si o no,...
Contingut
backup bàsic de directoris i fitxers
http://banyut.obolog.com/copias-seguridad-ubuntu-crontab-rsync-dd-65952
cp -rp ~/joan /media/sdb5/backup/diumenge
és un backup funcional, però totalment ineficient perquè cada vegada es transmet tota la informació, encara que els canvis hagin estat mínims.
backup amb rsync
rsync -altgvbp /home/banyut /media/sdb5/backup/domingo
d'aquesta manera només es fa còpia dels arxius nous i els modificats des de l'últim backup
opcions:
- -a: archive mode. Es guarden els fitxers amb els seus permisos,... de manera recursiva dins les carpetes
- -l, --links copy symlinks as symlinks
- -t, --times preserve times
- -v: verbose
- -b, --backup. With this option, preexisting destination files are renamed as each file is transferred or deleted. You can control where the backup file goes and what (if any) suffix gets appended using the --backup-dir and --suffix options.
- -p, --perms. This option causes the receiving rsync to set the destination permissions to be the same as the source permissions.
*-g, --group. This option causes rsync to set the group of the destination file to be the same as the source file.
Ubuntu Server (local) confia en linuxserver (institut)
des de l'insti això funciona
scp /home/joan/mysql_backup/copia_wikidb141108.dmp joan@wikijoan.dyndns.org:/tmp scp /home/joan/mysql_backup/copia_wikidb141108.dmp joan@wikijoan.dyndns.org: -> per copiar en el home de l'usuari joan
em demana password
Si miro el man, veig que no hi ha l'opció de ficar el password. La única possibilitat de què no em demani el password és l'opció -i identity file, que és la tècnica de clau pública/clau privada (el servidor on em vull connectar haurà de confiar en aquesta connexió).
el paquet ssh-keygen ja està instal.lat
linux-server:~ # ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_dsa. Your public key has been saved in /root/.ssh/id_dsa.pub. The key fingerprint is: 48:a5:2d:04:5d:29:bc:78:1c:87:02:b5:c2:ad:03:9d root@linux-server You have new mail in /var/spool/mail/root linux-server:~ #
Segueixo els mateixos passos que vaig fer en el seu dia entre el UStudio i el Ubuntu Server:
linux-server# scp ~/.ssh/id_dsa.pub joan@wikijoan.dyndns.org:/tmp
entro per ssh en el servidor
linux-server# ssh joan@wikijoan.dyndns.org
joan@server$ cat /tmp/id_dsa.pub >> ~/.ssh/authorized_keys joan@server$ chmod 0600 $HOME/.ssh/authorized_keys joan@server$ rm -f /tmp/id_dsa.pub joan@server$ exit
i ara ja puc fer una còpia sense que em demani el password:
linux-server# scp /home/joan/mysql_backup/copia_wikidb141108.dmp joan@wikijoan.dyndns.org:
i no em demana el password
Preparant els punts de muntatge
Lo ideal seria que les diferents màquines (portàtil, institut Linux, institut BBDD,...) es connectessin directament al disc de xarxa per a fer les còpies de seguretat. En el disc de xarxa hi ha un servidor samba (puc fer PUT, GET), però no un servidor SSH. Per sincronitzar amb rsync necessito el servidor SSH. Hauré d'investigar més en aquesta línia
Si tinc el servidor Ubuntu sempre encès, com és la idea, aleshores puc fer uns punts de muntatge permanents, i aleshores les diferents màquines es sicronitzen per fer backup amb els servidors (contra aquests punts de muntatge que són les carpetes compartides del disc de xarxa). Una possibilitat és ficar els punts de muntatge en el fitxer /etc/fstab, per ex.:
//192.168.1.15/PUBLIC /media/PUBLIC cifs rw,user 0 0 //192.168.1.15/PRIVAT /media/PRIVAT cifs user=guest,password=****,rw,user 0 0 //192.168.1.15/LINKAT /home/joan/LINKAT cifs user=guest,password=****,rw,user 0 0 ...
però el problema és que m'apareixen les icones dels recursos compartits a l'escriptori i a 'Llocs'. M'he barallat una mica per tal que no surtin, i segur que es pot (està relacionat amb la configuració del GNome), però encara no ho sé fer.
Una altra possibilitat és muntar les carpetes en un script d'inici que executi el root (el script /home/joan/.bashrc no ens val perquè l'executa joan, no el root, i el mount necessita sudo per executar-se)
script punts_muntatge.sh:
$ sudo joe /etc/init.d/punts_muntatge.sh $ sudo update-rc.d punts_muntatge.sh defaults Adding system startup for /etc/init.d/punts_muntatge.sh ... /etc/rc0.d/K20punts_muntatge.sh -> ../init.d/punts_muntatge.sh /etc/rc1.d/K20punts_muntatge.sh -> ../init.d/punts_muntatge.sh /etc/rc6.d/K20punts_muntatge.sh -> ../init.d/punts_muntatge.sh /etc/rc2.d/S20punts_muntatge.sh -> ../init.d/punts_muntatge.sh /etc/rc3.d/S20punts_muntatge.sh -> ../init.d/punts_muntatge.sh /etc/rc4.d/S20punts_muntatge.sh -> ../init.d/punts_muntatge.sh /etc/rc5.d/S20punts_muntatge.sh -> ../init.d/punts_muntatge.sh $ sudo chmod +x punts_muntatge.sh
fitxer punts_muntatge.sh
#punts de muntatge per al disc de xarxa mount -t cifs //192.168.1.15/PUBLIC /mnt/PUBLIC -o username=guest,password=****,rw mount -t cifs //192.168.1.15/PRIVAT /mnt/PRIVAT -o username=guest,password=****,rw mount -t cifs //192.168.1.15/fotos /mnt/fotos -o username=guest,password=****,rw mount -t cifs //192.168.1.15/UbuntuServer /mnt/UbuntuServer -o username=guest,password=****,rw mount -t cifs //192.168.1.15/DELL_Studio /mnt/DELL_Studio -o username=guest,password=****,rw mount -t cifs //192.168.1.15/DELL_WXP /mnt/DELL_WXP -o username=guest,password=****,rw mount -t cifs //192.168.1.15/LINKAT /mnt/LINKAT -o username=guest,password=****,rw mount -t cifs //192.168.1.15/BBDD /mnt/BBDD -o username=guest,password=****,rw
encara que la carpeta fotos no està protegida amb password, és necessari ficar username i password per tal que funcioni en la consola. (en la consola, sudo)
Tanmateix, com veurem tot seguit, és una mala idea fer els punts de muntatge en el directori /mnt. Així que els nous punts de muntatge estaran a dins del home:
fitxer punts_muntatge.sh
#punts de muntatge per al disc de xarxa mount -t cifs //192.168.1.15/PUBLIC /home/joan/disc_xarxa/PUBLIC -o username=guest,password=****,rw mount -t cifs //192.168.1.15/PRIVAT /home/joan/disc_xarxa/PRIVAT -o username=guest,password=****,rw mount -t cifs //192.168.1.15/fotos /home/joan/disc_xarxa/fotos -o username=guest,password=****,rw mount -t cifs //192.168.1.15/UbuntuServer /home/joan/disc_xarxa/UbuntuServer -o username=guest,password=****,rw mount -t cifs //192.168.1.15/DELL_Studio /home/joan/disc_xarxa/DELL_Studio -o username=guest,password=****,rw mount -t cifs //192.168.1.15/DELL_WXP /home/joan/disc_xarxa/DELL_WXP -o username=guest,password=****,rw mount -t cifs //192.168.1.15/LINKAT /home/joan/disc_xarxa/LINKAT -o username=guest,password=****,rw mount -t cifs //192.168.1.15/BBDD /home/joan/disc_xarxa/BBDD -o username=guest,password=****,rw
Preparant les còpies remotes des de Windows: Putty, PSCP
El Putty es pot fer servir des de la línia de comandes. Està explicat a
http://the.earth.li/~sgtatham/putty/0.60/puttydoc.txt
Ho trobarem en el capítol 8: 3.8 The PuTTY command line
C:\> putty.exe [-ssh | -telnet | -rlogin | -raw] [user@]host C:\> putty.exe -ssh -pw **** joan@wikijoan.dyndns.org
Per a fer còpies la solució passa per una altra eina de la col.lecció del Putty: PSCP:
Ho trobem al capítol 5: Chapter 5: Using PSCP to transfer files securely
Chapter 5: Using PSCP to transfer files securely PSCP, the PuTTY Secure Copy client, is a tool for transferring files securely between computers using an SSH connection.
Una manera d'utilitzar-ho per fer còpies des de l'ordinador Windows al disc de xarxa és:
C:\> pscp.exe -r -pw **** C:/hosting_linux.txt joan@wikijoan.dyndns.org:/mnt/PUBLIC
-r copy directories recursively -p preserve file attributes -v show verbose messages -C enable compression -i private key file for authentification -batch disable all interactive prompts
per copiar tot un directori:
C:\> pscp.exe -r -pw **** C:/pentagrama joan@wikijoan.dyndns.org:/mnt/DELL_WXP
funciona tot i que hi ha alguns arxius que diu que no els pot obrir perquè Permission Denied. Quan ho torno a fer algun dels arxius que no em deixava ara em deixa, i alguns altres em dóna Permission Denied. Per tant, és un comportament erràtic.
el login joan/**** és el que em permet l'accés a la sessió de SSH. Per entrar al recurs compartit no cal ficar password, perquè la comanda per fer el punt de muntatge ja vaig introduir el password.
Si faig un backup a un directori local del servidor Ubuntu, aleshores no hi ha problema de permisos:
C:\> pscp.exe -r -pw **** C:/pentagrama joan@wikijoan.dyndns.org:/home/joan/backup
Important: el problema no ve pel pscp o SSH, sinó que és intern al Ubuntu Server Des del Ubuntu Server, la 1a comanda falla i la 2a no:
$ cp -R pentagrama /mnt/PUBLIC $ sudo cp -R pentagrama /mnt/PUBLIC
És un problema de permisos, que es pot solucionar de diverses maneres. Una possibilitat és que la connexió amb pscp es faci des de l'usuari root (això de moment no es pot fer perquè per defecte a Ubuntu l'usuari root no pot iniciar una sessió). Una altra possibilitat seria que el propietari dels punts de muntatge sigui joan i no root (són root perquè al comanda mount només funcionava com a sudo)
mount només funciona com a sudo, però després d'haver-lo creat puc canviar el propietari:
sudo chown joan /mnt/BBDD sudo chown -R joan /mnt/BBDD
i també canviem la pertanyença del grup:
sudo chgrp joan /mnt/BBDD sudo chgrp -R joan /mnt/BBDD
Tanmateix, no ho solucionem, ja que si faig còpies en local contra el directori no funciona:
$ cp -R /home/joan/pentagrama /mnt/pentagrama
continua fallant per un tema de permisos, encara que tots els fitxers i directoris involucrats són propietari de joan.
Potser el problema és que el directori /mnt té un caràcter especial...
$ mkdir /home/joan/BBDD $ sudo mount -t cifs //192.168.1.15/BBDD /home/joan/BBDD -o username=guest,password=****,rw
com que només l'usuari root pot fer mount, automàticament el propietari i grup són root, tot i que tothom hi té accés.
C:\> pscp.exe -r -pw **** C:/hosting_linux.txt joan@wikijoan.dyndns.org:/home/joan/BBDD
i ara funciona sense problemes. Conclusió: el directori /mnt és especial a nivell de permisos.
Recordem que una altra possibilitat que segur que funciona és connectar-me per pscp com a root, però primer hauríem d'habilitar l'inici de sessió de root.
Script de backup per a windows
http://www.michaelhorowitz.com/backupscript.html
Segueixo aquest document: http://www.pcmech.com/article/windows-batch-script-to-backup-data/
Zip
Eina en mode consola per a comprimir. És lliure, és un projecte de SourceForge (http://www.7-zip.org/)
Fitxer de configuració BackupConfig.txt
És on diem quins directoris i/o fitxers volem copiar.
# Enter file and folder names, one per line.C:\Documents and Settings\Jason Faulkner\Desktop C:\Documents and Settings\Jason Faulkner\My Documents\Important Files C:\Scripts\BackupScript.bat
Aquest fitxer estarà en el mateix directori que el script
script original backup_DELL_WXP.bat
Es fa una còpia local al directori C:\Backups
El script l'anomenarem script_DELL_WXP.bat
@ECHO OFF REM BackupScript REM Version 1.01, Updated: 2008-05-21 REM By Jason Faulkner (articles[-at-]132solutions.com) REM Performs full or incremental backups of folders and files configured by the user. REM Usage--- REM > BackupScript SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION REM ---Configuration Options--- REM Folder location where you want to store the resulting backup archive. REM This folder must exist. Do not put a '\' on the end, this will be added automatically. REM You can enter a local path, an external drive letter (ex. F:) or a network location (ex. \\server\backups) SET BackupStorage=C:\Backup REM Which day of the week do you want to perform a full backup on? REM Enter one of the following: Sun, Mon, Tue, Wed, Thu, Fri, Sat, * REM Any day of the week other than the one specified below will run an incremental backup. REM If you enter '*', a full backup will be run every time. SET FullBackupDay=* REM Location where 7-Zip is installed on your computer. REM The default is in a folder, '7-Zip' in your Program Files directory. SET InstallLocationOf7Zip=%ProgramFiles%\7-Zip REM +-----------------------------------------------------------------------+ REM | Do not change anything below here unless you know what you are doing. | REM +-----------------------------------------------------------------------+ REM Usage variables. SET exe7Zip=%InstallLocationOf7Zip%\7z.exe SET dirTempBackup=%TEMP%\backup SET filBackupConfig=BackupConfig.txt REM Validation. IF NOT EXIST %filBackupConfig% ( ECHO No configuration file found, missing: %filBackupConfig% GOTO End ) IF NOT EXIST "%exe7Zip%" ( ECHO 7-Zip is not installed in the location: %dir7Zip% ECHO Please update the directory where 7-Zip is installed. GOTO End ) REM Backup variables. FOR /f "tokens=1,2,3,4 delims=/ " %%a IN ('date /t') DO ( SET DayOfWeek=%%a SET NowDate=%%d-%%b-%%c SET FileDate=%%b-%%c-%%d ) IF {%FullBackupDay%}=={*} SET FullBackupDay=%DayOfWeek% IF /i {%FullBackupDay%}=={%DayOfWeek%} ( SET txtBackup=Full SET swXCopy=/e ) ELSE ( SET txtBackup=Incremental SET swXCopy=/s /d:%FileDate% ) ECHO Starting to copy files. IF NOT EXIST "%dirTempBackup%" MKDIR "%dirTempBackup%" FOR /f "skip=1 tokens=*" %%A IN (%filBackupConfig%) DO ( SET Current=%%~A IF NOT EXIST "!Current!" ( ECHO ERROR! Not found: !Current! ) ELSE ( ECHO Copying: !Current! SET Destination=%dirTempBackup%\!Current:~0,1!%%~pnxA REM Determine if the entry is a file or directory. IF "%%~xA"=="" ( REM Directory. XCOPY "!Current!" "!Destination!" /v /c /i /g /h /q /r /y %swXCopy% ) ELSE ( REM File. COPY /v /y "!Current!" "!Destination!" ) ) ) ECHO Done copying files. ECHO. SET BackupFileDestination=%BackupStorage%\Backup_%FileDate%_%txtBackup%.zip REM If the backup file exists, remove it in favor of the new file. IF EXIST "%BackupFileDestination%" DEL /f /q "%BackupFileDestination%" ECHO Compressing backed up files. (New window) REM Compress files using 7-Zip in a lower priority process. START "Compressing Backup. DO NOT CLOSE" /belownormal /wait "%exe7Zip%" a -tzip -r -mx5 "%BackupFileDestination%" "%dirTempBackup%\" ECHO Done compressing backed up files. ECHO. ECHO Cleaning up. IF EXIST "%dirTempBackup%" RMDIR /s /q "%dirTempBackup%" ECHO. :End ECHO Finished. ECHO. ENDLOCAL
Aquest fitxer és l'original, sense cap modificació. Fa una còpia completa dels directoris. La millor solució per mi és editar el fitxer BackupConfig.txt de manera que només es fa còpia dels directoris actius (aquells amb projectes oberts).
En el lloc pertinent es comenta com ha quedat finalment el fitxer backup_DELL_WXP.bat
script modificat backup_DELL_WXP.bat
El fitxer s'ha modificat per tal d'aconseguir els següents requisits:
- hi ha d'haver un log del resultat del backup
- jo vull que cada carpeta sigui un fitxer independent, comprimit, i que s'envïi directament de la carpeta TEMP al destí en el disc de xarxa.
- depurar el script original per treure la palla: res de dies de la setmana, i només m'interessa backups complets.
- a vegades estic a casa i a vegades estic al local. Com es gestiona? Fico la variable SERVER
El problema que hi ha en el script original és que matxaca el fitxer de destí, i si he canviat el config, aleshores de fet la informació es perd en el backup destí. Podria pensar que tinc una còpia i en realitat no tenir-la.
En el fitxer original, en la carpeta C:\Documents and Settings\Administrador\Configuración local\Temp\backup es copien tots els directoris, i quan s'ha fet tota la còpia es comprimeix a un sol fitxer. En el meu cas vull un comprimit per a cada carpeta.
El script final està a Backup_DELL_WXP.bat
la única cosa que no em funciona és que en el fitxer de configuració, les línies que comencen per # a partir de la segona línia també es pensa que és un directori, i dóna error perquè el directori no existeix. Hauria de trobar la manera comparar el primer caràcter de la fila amb #, però el tema de les expressions regulars és difícil.
RSYNC i SSH: còpies remotes entre màquines LINUX
Anem ja concretant com farem el backup.
Per defecte amb el Ubuntu ve instal.lat el ssh client. Si vull un servidor SSH:
sudo apt-get install ssh
i perquè vull un servidor SSH a cada màquina? Doncs perquè vull centralitzar els scripts en el servidor, i des del servidor connectar-me a les diferents màquines (Linux). Pensem que en el servidor és on tindré les tasques cron que em dirà quan s'executen els scripyd. És millor tenir-ho tot centralitzat en el servidor.
rsync -ave ssh --numeric-ids --delete joan@192.168.1.131:/home/joan/hola.txt /home/joan/disc_xarxa/DELL_Studio rsync -ave ssh --numeric-ids --delete joan@192.168.1.131:/home/joan/how_to_ubuntu /home/joan/disc_xarxa/DELL_Studio
on disc_xarxa/DELL_Studio és un punt de muntatge al disc de xarxa IOMEGA. Aquestes dues comandes funcionen per copiar un fitxer individual o per copiar un directori sencer de forma recursiva, però em demana el password.
Per tal que no em demani el password he de fer un -password-file o bé utilitzar la tècnica clau pública/clau privada. Ara és el portàtil (DELL_Studio) el que ha de confiar en el Servidor. Per tant, la clau es genera en el servidor (que fa de client SSH) i s'ha de depositar en el portàtil (servidor SSH). Aquest mètode està explicat en SSH i el tornem a repetir. L'avantatge de fer-ho d'aquesta manera és que genero una sola clau, i aquesta l'he de ficar en els diferents servidors SSH que pugui tenir: DELL_Studio, LINKAT de l'institut.
joan@ubuntu$ ssh-keygen -t dsa Your identification has been saved in /home/joan/.ssh/id_dsa. Your public key has been saved in /home/joan/.ssh/id_dsa.pub. The key fingerprint is: 13:02:00:96:c1:e4:07:80:70:ab:11:7c:ff:1e:7d:ad
Es genera un fitxer per guardar la clau a /home/joan/.ssh/id_dsa.
Quan demana passphrase deixar-ho en blanc (Enter)
copiar ~/.ssh/id_dsa.pub al portàtil (i al llapis, perquè el necessitaré copiar-lo al LINKAT):
joan@ubuntu$ scp ~/.ssh/id_dsa.pub joan@192.168.1.131:/tmp
ara en el DELL_Studio (192.168.1.131) (a on volem accedir sense password):
joan@portatil$ cat /tmp/id_dsa.pub >> ~/.ssh/authorized_keys joan@portatil$ chmod 0600 $HOME/.ssh/authorized_keys joan@portatil$ rm -f /tmp/id_dsa.pub
Fem la prova en el client:
i em puc connectar al DELL_Studio (portàtil) per fer una sessio ssh o per fer un rsync sense que em demani el password:
joan@ubuntu$ rsync -ave ssh --numeric-ids --delete joan@192.168.1.131:/home/joan/how_to_ubuntu /home/joan/disc_xarxa/DELL_Studio joan@ubuntu$ ssh joan@192.168.1.131
Per fer un log del resultat puc fer: 59 20 * * * /home/joan/scripts_backup/backup_DELL_Studio.sh >/home/joan/scripts_backup /logs/sync-machine1.log 2>&1
Ara bé, com que vull fer un mail amb un informe dels resultats, m'interessa que en l'execució del script es generi el log i aleshores enviar-lo per mail.
Senzillament, rsync té l'opció --log-file=FILE
rsync -ave ssh --numeric-ids --delete joan@192.168.1.131:/home/joan/how_to_ubuntu /home/joan/disc_xarxa/DELL_Studio --log-file=/home/joan/scripts_backup/log/DELL_Studio_251108.log
http://tldp.org/HOWTO/SMB-HOWTO-11.html
export MAILTO="cursice" usuari=cursice home=/home/cursice nomhost=festuc dirBackup=elsMeusBackups aGuardar=/home/cursice/ arxiuBackup=$dirBackup/cursice$(date +%Y%m%d).tgz guarda=3 rsh -l$usuari $nomhost ls ">" $ArxiuBackup tar -zcf $usuari@$nomhost:$backupfile $aGuardar echo Backup $arxiuBackup finalitzat quants=$(rsh $nomhost -l$usuari ls -t $dirBackup/"cursice*.tgz"| wc -l ) num=$(($quants-$guarda)) echo $quants $num if [ $num -gt 0 ] then l=$(rsh $nomhost -l$usuari ls -t $dirBackup/"cursice*.tgz" | tail -n $num ); echo esborrant $l ; rsh $nomhost -l$usuari "\rm" -f $l fi
creat per Joan Quintana Compte, novembre 2008