6815
Comment:
|
5158
|
Deletions are marked like this. | Additions are marked like this. |
Line 2: | Line 2: |
Backup kjøres automatisk fra manager en gang i døgnet ved hjelp av scriptet [[https://git.sesse.net/?p=backup.sh|backup.sh]]. | |
Line 4: | Line 3: |
== Ta backup == For å ta backup av en maskin må følgende gjøres på manager og maskinen det skal tas backup av. |
Backup-serveren er freebeast.nuug.no. Programvaren som brukes er [[https://rdiff-backup.net/|rdiff-backup]], samt noen egne scripts. |
Line 7: | Line 5: |
=== På maskinen === Sett femte kolonne i fstab for alle diskene som skal dumpes til 1 eller høyere. |
Backup starter 01:00 hver natt, og kjører foreløpig mot to hosts om gangen. |
Line 10: | Line 7: |
La backupsh@manager.skolelinux.no logge på som root på den aktuelle maskinen. SSH-nøkkelen kan finnes i ~backupsh/.ssh/id_rsa.pub på manager. === På manager === Lag ZFS volum og sett rettigheter. Siden backupjobben kjører som brukeren backupsh på manager er det viktig at den har tilgang til volumet man lager. {{{ zfs create nuugh1/backup/$host chown backupsh:backupsh /nuugh1/backup/$host }}} Legg til maskinen i listen over maskiner det tas backup av. {{{ echo "$host" >> /nuugh1/backup.sh/conf/computers.unix }}} Hvis det trengs kan man lage preexec og postexec script for maskinen, disse kan f.eks. dumpe en database før backupen tas og fjerne gamle databasedumper etter backupen har kjørt. Disse heter i så fall {{{/nuugh1/backup.sh/conf/preexec.$host}}} og {{{/nuugh1/backup.sh/conf/postexec.$host}}} og må være kjørbare. == Restore == Restore gjøres ved å pakke ut filene man trenger fra tar arkivet som inneholder dem. For hver tar-ball er det også en fil med endelsen idx, denne inneholder en liste over alle filer i den aktuelle tar-ballen. Dette kan brukes for å enkelt finne hvilket arkiv som inneholder filene man er ute etter. Skal man gjøre en full restore må man legge til flagget {{{--incremental}}} når man pakker ut de daglige arkivene for at tar ikke skal slette alle filer som ikke er med i arkivet. <<Anchor(nyttoppsett)>> = Nytt backup-oppsett = Dette er foreløpige notater for oppsett av ny backup-løsning. Ved fullføring vil hele denne wiki-siden oppdateres med korrekt informasjon om oppsett og bruk. Den nye backup-serveren vil være freebeast.nuug.no. Programvaren som brukes er [[https://rdiff-backup.net/|rdiff-backup]]. Installasjon av software: |
Installasjon av software gjort for formålet: |
Line 65: | Line 34: |
# Backup av alle servere listet i do-backup.conf starter 01:00 hver natt. | # Gjør evt. justeringer i filelist_<fqdn> slik at innholdet i backupen blir riktig. |
Line 69: | Line 38: |
(Alt dette oppsettet skal inn i ansible på sikt.) |
|
Line 74: | Line 45: |
root@<hostnavn>:~# adduser --system --shell /bin/bash --group rdfbck | root# adduser --system --shell /bin/bash --group rdfbck |
Line 76: | Line 47: |
root@<hostnavn>:~# cat /home/rdfbck/.ssh/authorized_keys | root# mkdir /home/rdfbck/.ssh root# vim /home/rdfbck/.ssh/authorized_keys # Innhold: |
Line 78: | Line 51: |
root# chown rdfbck:rdfbck /home/rdfbck/.ssh{,/authorized_keys} | |
Line 79: | Line 53: |
root@<hostnavn>:~# cat /etc/sudoers.d/rdiff-backup-client | root# visudo -f /etc/sudoers.d/rdiff-backup-client # Innhold: |
Line 83: | Line 58: |
Backup-scriptene: |
Backup
Backup-serveren er freebeast.nuug.no. Programvaren som brukes er rdiff-backup, samt noen egne scripts.
Backup starter 01:00 hver natt, og kjører foreløpig mot to hosts om gangen.
Installasjon av software gjort for formålet:
root@freebeast:~ # pkg install py39-rdiff-backup py39-yaml sudo bind-tools
Klargjøring av disk/zfs:
root@freebeast:~ # zfs create -o compression=lz4 data/backup # Skru på compression, så rdiff-backup slipper
Sudo-rettigheter for rdfbck:
[root@freebeast ~]# cat /usr/local/etc/sudoers.d/rdfbck # Allow the rdfbck user to run necessary commands as root, without password. # Rdiff-backup itself must run as root to allow backed up files to have their # original UID/GIDs when stored in the backup repository. The zfs commands are # used in the add-new-host script. rdfbck ALL=(ALL:ALL) NOPASSWD: /usr/local/bin/rdiff-backup, /sbin/zfs create *, /sbin/zfs list *
Oppsett/konfigurasjon for ny host å ta backup av
På freebeast
root@freebeast:~ # su - rdfbck [rdfbck@freebeast ~]$ bin/add-new-host <fqdn for ny host> # Gjør evt. justeringer i filelist_<fqdn> slik at innholdet i backupen blir riktig.
På hosten du skal ta backup av
(Alt dette oppsettet skal inn i ansible på sikt.)
- Installer rdiff-backup 2.x fra pakke-repo eller andre måter
# Legg til gruppe/bruker rdfbck root# adduser --system --shell /bin/bash --group rdfbck root# mkdir /home/rdfbck/.ssh root# vim /home/rdfbck/.ssh/authorized_keys # Innhold: command="sudo /usr/local/sbin/snapback",from="158.36.191.154",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC/QHCeEKUfpzhVHJTEbVUFxf4npnXmF+/0bLAaYprpmHACzIBEto+k2/QT+amDatN12eTANVrcmycaWjfjrAXRNP9pyAWPrvBu7eRScXmrwaOkD3beenuyOu5MrZ+0OhUKW8UQp0bPxd+f4wrIdwZniYPVc88HnbzULyypACkIww/X5xRNwtZ2bLVn4h4MMfv6oE2Mp9lspLm4Lt7kZsTMSAnTc03GWFB9emru9lvlp4hBD4OEQrWU1lXCm3Rt7PID/5FGwkYjR9r17X5Vm36ybFwywUIIf31NVEqXp1jaLtYVsudEEK6codHybarqgAGqAoGwsC8SeOX6suuUI8rEX404b6MSkH6syBiin5Nd5S3gqdi3dIpvcJFvgluJUyvxk2rMtG1dM49j1MswdlBthY6q9G8UGNd1bhIwd+bqqnvC+f3qkyr3c42CMexEEz5jasNVpOddmDeN4nX7gUPmQBRA3zdkINHljRaWno5bKh2+N/U2tNLPMa1+RJxaaMU= rdfbck@freebeast.nuug.no (rdiff-backup) root# chown rdfbck:rdfbck /home/rdfbck/.ssh{,/authorized_keys} root# visudo -f /etc/sudoers.d/rdiff-backup-client # Innhold: # Allow the backup user to run the backup script as root without password. rdfbck ALL = NOPASSWD: /usr/local/sbin/snapback
Backup-scriptene:
root@git:~# cat /usr/local/sbin/snapback #!/bin/bash export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin logfile="/var/log/snapback.log" # Function that takes an argument of number of seconds, and prints the time # in the format HHh:MMm:SSs. You can use this to print e.g. runtime for a # script. # Usage: seconds_to_hms [SECONDS] # If the argument is missing, or it is not an integer >0, 'NaN' is printed. function seconds_to_hms() { local S_TIME HMS_TIME if [ -z "${1}" ]; then S_TIME="NaN" else S_TIME=${1} fi if [ ${S_TIME} -ge 0 ] 2> /dev/null; then HMS_TIME="$(printf '%02dh:%02dm:%02ds' $((S_TIME/3600)) $((S_TIME%3600/60)) $((S_TIME%60)))" else HMS_TIME="NaN" fi echo ${HMS_TIME} } # In case pre/post scripts don't exist, default value for their exit code # variables is 0. preexitcode=0 postexitcode=0 echo "$(date) Snapback started." >> ${logfile} start=$(date +%s) if [ -x "/usr/local/sbin/snapback.pre" ]; then echo "$(date) Pre-script starting." >> ${logfile} /usr/local/sbin/snapback.pre >> ${logfile} 2>&1 preexitcode=${?} echo "$(date) Pre-script finished and returned with exit status ${preexitcode}." >> ${logfile} fi echo "$(date) Rdiff-backup started." >> ${logfile} /usr/bin/rdiff-backup --server --restrict-read-only / rdiffexitcode=${?} echo "$(date) Rdiff-backup finished and returned with exit status ${rdiffexitcode}." >> ${logfile} if [ -x "/usr/local/sbin/snapback.post" ]; then echo "$(date) Post-script starting." >> ${logfile} /usr/local/sbin/snapback.post >> ${logfile} 2>&1 postexitcode=${?} echo "$(date) Post-script finished and returned with exit status ${postexitcode}." >> ${logfile} fi end=$(date +%s) runtime=$((end-start)) echo "$(date) Snapback finished. Pre:${preexitcode}, Rdiff-backup:${rdiffexitcode}, Post:${postexitcode}. Duration: $(seconds_to_hms ${runtime}) (${runtime} seconds)." >> ${logfile} # Exit with the sum of all exit codes from pre, rdiff-backup and post. sumexitcode=$((preexitcode+rdiffexitcode+postexitcode)) exit ${sumexitcode}
root@git:~# cat /usr/local/sbin/snapback.pre #!/bin/bash # This script runs as root # Do something useful here if you want. Dump databases, create LVM snapshots or whatever
root@git:~# cat /usr/local/sbin/snapback.post #!/bin/bash # This script runs as root # Do something useful here if you want, like delete the LVM snapshots from .pre