Backup

Backup kjøres automatisk fra manager en gang i døgnet ved hjelp av scriptet backup.sh.

Ta backup

For å ta backup av en maskin må følgende gjøres på manager og maskinen det skal tas backup av.

På maskinen

Sett femte kolonne i fstab for alle diskene som skal dumpes til 1 eller høyere.

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.

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 rdiff-backup.

Installasjon av software:

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
root@freebeast:~ # zfs create data/backup/git.nuug.no # git.nuug.no brukt for testing, lag eget dataset for hver host sin backup. De arver compression=lz4 av data/backup

Sudo-rettigheter for rdfbck:

[root@freebeast ~]# cat /usr/local/etc/sudoers.d/rdfbck
# Allow the rdfbck user to run rdiff-backup as root, without password.  This is
# to allow backed up files to have their original UID/GIDs when stored in the
# backup repository.
rdfbck ALL=(ALL:ALL) NOPASSWD: /usr/local/bin/rdiff-backup

Oppsett/konfigurasjon for ny host å ta backup av

På hosten du skal ta backup av

# Legg til gruppe/bruker rdfbck
root@<hostnavn>:~# adduser --system --shell /bin/bash --group rdfbck

root@<hostnavn>:~# cat /home/rdfbck/.ssh/authorized_keys 
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@<hostnavn>:~# cat /etc/sudoers.d/rdiff-backup-client 
# Allow the backup user to run the backup script as root without password.
rdfbck ALL = NOPASSWD: /usr/local/sbin/snapback

root@git:~# cat /usr/local/sbin/snapback
#!/bin/bash

#
# This file is managed by Ansible - do not edit!
#

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

På freebeast

root@freebeast:~ # zfs create data/backup/<hostnavn>           # Oppretter eget ZFS datasett for backup av hosten
[rdfbck@freebeast ~]$ vim etc/do-backup.conf                   # Legg til nytt hostnavn i SERVERS-variabelen nederst, husk avsluttende "\"
[rdfbck@freebeast ~]$ vim etc/rdiff-backup/filelist_<hostnavn> # Liste over paths du vil ha med/ikke ha med i backupen
[rdfbck@freebeast ~]$ bin/do-backup -v -s <hostnavn>           # Start initiell backup. Godta SSH host key.

# Backup av alle servere listet i do-backup.conf starter 01:00 hver natt.