Savesyslinux.sh
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/savlinuxdans l'original) a été remplacé par un nom génériquebackup-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 lignesfdisk, l'insertion avait coupé le nom de la commande elle-même ens[[fdisk]]— corrigé ensfdisk. if [ $? == 1 ]utilisait==dans un test[ ]— extension non portable (fonctionne en Bash, pas dans un/bin/shstrict 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 (pilotecciss, aujourd'hui obsolète, remplacé parhpsaqui expose les disques en/dev/sdacomme 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 -det une sauvegarde brute du premier secteur ne couvrent pas une table GPT (boot UEFI) — sur un serveur en UEFI/GPT, utilisersfdisken mode GPT (il le détecte nativement dans ses versions récentes) et sauvegarder l'ESP (/boot/efi) en plus du MBR, ou passer parsgdisk --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.