Savesyslinux.sh

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Sauvegarde bas niveau du disque système
Contenu sauvegardé table de partitions, MBR, /boot, volume racine LVM
Outils dd, sfdisk, NFS
Statut technique historique (adaptée à BIOS/MBR, pas à UEFI/GPT) — voir alternatives ci-dessous
Voir aussi Dd · LVM

Script de sauvegarde « à froid » du disque système d'un serveur Linux : table de partitions, secteur de boot (MBR), partition /boot et volume logique racine (LVM), déposés sur un partage NFS distant. Pensé pour restaurer rapidement un serveur physique après une panne disque, sans passer par une réinstallation complète.

Script

#!/bin/bash
# VERSION : V1.1.0
#===============================================================================
# Savesyslinux — sauvegarde bas niveau du disque système (table de partitions,
# MBR, /boot, volume racine) vers un partage NFS
#===============================================================================

NFS_SERVER="backup-server.exemple.local:/export/save_linux"

check_hard() {
    hard=$(/usr/sbin/dmidecode | grep Vendor | awk '{print $2}')
}

check_disk() {
    case "$1" in
        HP)   disk=/dev/cciss/c0d0; table=c0d0 ;;
        IBM)  disk=/dev/sda;        table=sda  ;;
        Dell) disk=/dev/sda;        table=sda  ;;
        *) ;;
    esac
}

check_mount() {
    if ! mount | grep -q backup; then
        mount -t nfs "$NFS_SERVER" /backup \
            -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,vers=3,timeo=600,actimeo=0
    fi
}

check_hard
check_disk "$hard"
check_mount

BOOT=$(df | grep /boot | awk '{ print $1 }')
ROOTVG=$(/usr/sbin/pvs | grep rootvg | awk '{ print $1 }')
HOSTNAME=$(hostname -s)
LOG=/log/savesyslinux.log

echo "Début de la sauvegarde $(date +%Y%m%d_%H%M%S)" >> "$LOG"

echo "Suppression de l'ancienne sauvegarde $(date +%Y%m%d_%H%M%S)" >> "$LOG"
rm -Rf "/backup/${HOSTNAME}"

echo "Création du répertoire du serveur $(date +%Y%m%d_%H%M%S)" >> "$LOG"
mkdir -p "/backup/${HOSTNAME}"

echo "Sauvegarde de la table des partitions (${disk}) $(date +%Y%m%d_%H%M%S)" >> "$LOG"
sfdisk -d "$disk" > "/backup/${HOSTNAME}/table-${table}.sfdisk"

echo "Sauvegarde du MBR (${table}) $(date +%Y%m%d_%H%M%S)" >> "$LOG"
dd if="$disk" of="/backup/${HOSTNAME}/mbr-${table}-save" count=1 bs=512

echo "Sauvegarde de la partition boot (${BOOT}) $(date +%Y%m%d_%H%M%S)" >> "$LOG"
dd if="$BOOT" | gzip > "/backup/${HOSTNAME}/boot.gz"

echo "Sauvegarde du volume racine (${ROOTVG}) $(date +%Y%m%d_%H%M%S)" >> "$LOG"
dd if="$ROOTVG" | gzip -c | split -b 512m - "/backup/${HOSTNAME}/rootvg.img.gz"

echo "Démontage du partage NFS $(date +%Y%m%d_%H%M%S)" >> "$LOG"
umount /backup

Corrections apportées par rapport au script d'origine :

  • le partage NFS (stg2:/vol/SAVE_AT/savlinux dans l'original) a été remplacé par un nom générique backup-server.exemple.local:/export/save_linux, sorti en variable en tête de script.
  • des liens wiki [[grep]], [[awk]] insérés directement dans les commandes cassaient leur exécution une fois copiées telles quelles ; pire, sur la ligne sfdisk, l'insertion avait coupé le nom de la commande elle-même en s[[fdisk]] — corrigé en sfdisk.
  • if [ $? == 1 ] utilisait == dans un test [ ] — extension non portable (fonctionne en Bash, pas dans un /bin/sh strict type dash) ; remplacé par une forme équivalente et portable (if ! mount | grep -q backup).
  • toutes les variables ont été quotées pour éviter les problèmes avec des chemins contenant des espaces ou étant vides.

Limites à connaître

  • Table des disques par constructeur (HP/IBM/Dell → chemin de périphérique) : technique héritée de l'époque des contrôleurs RAID matériels HP Smart Array (pilote cciss, aujourd'hui obsolète, remplacé par hpsa qui expose les disques en /dev/sda comme les autres constructeurs). Sur du matériel récent, préférer une identification robuste par /dev/disk/by-id/ plutôt qu'un mapping en dur par marque.
  • BIOS/MBR uniquement : sfdisk -d et une sauvegarde brute du premier secteur ne couvrent pas une table GPT (boot UEFI) — sur un serveur en UEFI/GPT, utiliser sfdisk en mode GPT (il le détecte nativement dans ses versions récentes) et sauvegarder l'ESP (/boot/efi) en plus du MBR, ou passer par sgdisk --backup.
  • LVM uniquement pour le volume racine : le script suppose un unique volume logique rootvg ; une topologie LVM plus complexe (plusieurs VG, snapshots) n'est pas prise en compte telle quelle.
  • pour un serveur virtualisé, un snapshot au niveau de l'hyperviseur est généralement plus simple et plus fiable que cette approche bas niveau, pensée pour du matériel physique sans solution de sauvegarde d'infrastructure.

Voir aussi

  • Dd — copie bas niveau de périphériques/fichiers
  • LVM — gestion des volumes logiques