3 votes

Sauvegarde complète à distance d'un système en fonctionnement

J'ai un système pour lequel je voudrais créer une sauvegarde complète du système. La sauvegarde doit inclure tous les paramètres du système, les pilotes, les données utilisateur, etc. sur le disque de stockage du système. La sauvegarde doit pouvoir être utilisée pour restaurer le disque système pour ce PC spécifique, après avoir remplacé le périphérique de stockage physique, lorsque le disque système tombe en panne.

Je n'ai qu'un accès ssh à distance pour créer la sauvegarde. Pour la restauration, je dois évidemment (et je peux) accéder physiquement au PC (pour remplacer le disque, etc.). De plus, le PC n'a pas d'accès direct à l'internet. Je me connecte via Internet à un hôte de saut et j'ai un accès Ethernet de là au PC.

Avec un accès physique, j'amorcerais le PC via un ventoy bootstick, pour démarrer un système vivant gparted et utiliser dd pour cloner les partitions du système vers des fichiers images. Mais ce n'est pas possible avec un accès à distance.

Existe-t-il une alternative ? Par exemple : Est-il possible d'utiliser des stratégies de sauvegarde comme

tar -cvpzf /backup.tar.gz --exclude=/backup.tar.gz --one-file-system

ou https://help.ubuntu.com/community/BackupYourSystem/TAR

ou cela ne convient-il pas dans mon cas ? Ou est-ce que ce n'est pas possible ou peut-être pas assez complet ?

Je pourrais déplacer la sauvegarde à distance de ce PC vers un NAS ou vers l'hôte de saut et la télécharger à partir de là (ou générer directement la sauvegarde sur le NAS), donc il s'agit vraiment de savoir comment générer une sauvegarde appropriée et non pas comment s'assurer que le fichier de sauvegarde est préservé lorsque le système tombe en panne. De plus, je pourrai réduire l'espace disque utilisé à moins de 30 % avant de créer la sauvegarde, si les 48 % actuels sont trop proches de > 50 % (ce qui pourrait empêcher toute stratégie consistant à stocker la sauvegarde sur le disque lui-même).

Ce sont les partitions pertinentes :

/dev/sdf1        2048    1050623    1048576  512M EFI-System
/dev/sdf2     1050624 3705751551 3704700928  1,7T Linux-Dateisystem
/dev/sdf3  3705751552 3750748159   44996608 21,5G Microsoft Basisdaten
sdf  
16,4T root  disk  brw-rw----
sdf1 vfat                  B687-437E                            /boot/efi                                          
512M root  disk  brw-rw----
sdf2 ext4                  56aaa632-d318-4ca9-8094-f803b2237e44 /media/sdf2                                    
1,7T root  disk  brw-rw----
sdf3 vfat                  30A8-C177                                                                          
21,5G root  disk  brw-rw----
/dev/sdf2                       1822227568  817873716   911719948   48% /
/dev/sdf1                           523244       5360      517884    2% /boot/efi

4voto

Rinzwind Points 270388

"drivers" ne va pas fonctionner. Ce sont des modules du noyau et ils doivent être chargés. Vous ne pouvez pas les copier sans sauvegarder l'ensemble du noyau (et cela signifierait l'ensemble du système).

Je suggérerais de limiter cela à vos fichiers personnels et de créer un script pour la mise à jour post-installation et de considérer la restauration comme une -nouvelle- installation (c'est-à-dire beaucoup de "sudo apt install/purge" et de commandes "gsettings" ou "sed" que vous exécutez ensuite pour récupérer vos préférences) et non comme une réparation de l'ancien système. Cela signifie que cela fonctionne AUSSI si vous voulez installer une nouvelle version d'Ubuntu.


Je peux ajouter une approche différente...

Si j'étais vous, je n'utiliserais pas tar mais rsync . Vous pouvez utiliser rsync sur un système en cours d'exécution et vous pouvez utiliser une destination externe. Quelque chose comme ça :

sudo rsync -ahPHAXx --delete --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found} / {user}@{host}:/backup/{date}/ 

(vous pouvez retirer mnt et media de cette liste si vous effectuez des sauvegardes incrémentielles (voir ci-dessous) ; tous les autres sont des tmpfs et ne sont donc pas adaptés à une sauvegarde) avec l'avantage supplémentaire que la restauration se fait fichier par fichier et qu'il n'est pas nécessaire de faire attention à l'espace disque. De plus, vous pouvez restaurer un seul fichier si nécessaire.

Si vous voulez une sauvegarde complète et que vous avez l'espace nécessaire, vous pouvez avoir plus d'une sauvegarde en ajoutant une {date} à la destination. Sur la destination, vous pouvez supprimer les anciennes sauvegardes en utilisant une certaine logique (conserver 7, 14, 30 jours et supprimer les anciennes sauvegardes).

rsync peut également effectuer des sauvegardes incrémentielles (donc ne copier que les différences depuis la dernière sauvegarde), ce qui réduit considérablement l'utilisation de la bande passante. Le principe est le suivant : toutes les sauvegardes obtiennent un horodatage, votre première sauvegarde est une sauvegarde complète, toutes les autres sauvegardes comparent le dernier horodatage avec votre système actuel et créent ensuite une sauvegarde des différences. Avantage : vous pouvez demander à rsync de restaurer un horodatage spécifique (par exemple, "faire en sorte que le système soit comme il était à 13:00 il y a 2 jours").

0voto

Raffa Points 11919

Testé sur le serveur Ubuntu 20.04 ... La procédure suivante vous permettra de cloner le disque entier d'une machine distante après avoir exécuté le système depuis la RAM et détaché tous les disques/partitions de disque ... Risque inclus bien sûr (mais contenu autant que possible).

Références :

Aller à la RAM

  • SSH à votre serveur( Maintenez cette connexion SSH en permanence et ne la fermez pas avant la fin. ).

  • Alors, devenez root :

    sudo -i
  • Ensuite, enregistrez la liste des systèmes de fichiers montés( référence ) vers un fichier mounted_fs :

    df -TH > mounted_fs
  • Ensuite, essayez d'arrêter les services en cours d'exécution qui peuvent être stoppés (à l'exception des services suivants SSH ) :

    systemctl list-units --type=service --state=running --no-pager --no-legend | awk '!/ssh/ {print $1}' | xargs systemctl stop
  • Ensuite, démontez tout ce qui est inutilisé :

    umount -a
  • Ensuite, préparez un environnement système en RAM( prendra environ 2.2G ) en exécutant la commande suivante six les commandes l'une après l'autre dans le même ordre :

    mkdir /tmp/tmproot
    mount none /tmp/tmproot -t tmpfs
    mkdir /tmp/tmproot/{proc,sys,usr,var,run,dev,tmp,oldroot}
    cp -ax /{bin,etc,mnt,sbin,lib,lib64} /tmp/tmproot/
    cp -ax /usr/{bin,sbin,lib,lib64} /tmp/tmproot/usr/
    cp -ax /var/{lib,local,lock,opt,run,spool,tmp} /tmp/tmproot/var/
  • Alors, cours :

    mount --make-rprivate /
  • Ensuite, changez la racine du système pour cet environnement :

    pivot_root /tmp/tmproot /tmp/tmproot/oldroot
  • Ensuite, montez les pièces nécessaires au système :

    for i in dev proc sys run; do mount --move /oldroot/$i /$i; done
  • Ensuite, redémarrez SSH :

    systemctl restart sshd
  • Alors, cours :

    systemctl list-units --type=service --state=running --no-pager --no-legend | awk '!/ssh/ {print $1}' | xargs systemctl restart
  • Alors, cours :

    systemctl daemon-reexec
  • Ensuite, démontez la racine du système original( sur le disque ) :

    umount -l /oldroot/
  • Ensuite, exécutez df -h et démonter tous les disques/partitions de disques restants montés comme /boot .

Maintenant, le système sur le serveur fonctionne totalement à partir de la RAM et les disques/partitions de disques sont totalement détachés et vous êtes connecté par SSH ... C'est, plus ou moins, comme si vous aviez démarré à partir d'une clé USB active.

Imagerie

Vous pouvez maintenant utiliser dd ( avec grand soin ) pour cloner votre ou vos disques entiers et sauvegarder l'image ou les images clonées sur un disque de secours sur le même serveur ( montez d'abord le disque de secours ) ou sur un autre serveur/NAS du même réseau.

Vous pouvez également enregistrer l'image directement sur votre machine( lien internet direct et rapide requis ) comme suit :

  • Utilisez dd ( avec grand soin ) pour créer une image de l'ensemble du disque et préparez l'envoi de l'image du serveur à votre machine avec un bouton nc auditeur( Changement /dev/sda vers le disque que vous voulez imager sur le serveur) :

    dd if=/dev/sda | nc -l 4444
  • Ensuite, ouvrir un nouveau terminal sur votre machine pour recevoir l'image et l'enregistrer( Changement 10.0.0.100 avec l'IP de votre serveur ) :

    nc 10.0.0.100 4444 > disk.img
  • Attendez que cela se termine ... Vous verrez un message de dd du côté du serveur, quelque chose comme ça :

    10737418240 bytes (11 GB, 10 GiB) copied, 500.935 s, 21.4 MB/s
  • Ensuite, fermez le nouveau terminal (ou la clé CTRL + C )

Maintenant, vous avez cloné avec succès le ou les disques du serveur.

Revenir de la RAM

Le moyen le plus simple de ramener le serveur à son état normal( racine du système sur le disque ) est de simplement redémarrer( Je suggère fortement de redémarrer, c'est plus sûr. ) ... alors, nettoyez :

rm mounted_fs

Ensuite, redémarrez( Aucun système de fichiers permanent n'est monté, donc, l'envoi juste b a /proc/sysrq-trigger devrait être assez sûr ) :

echo "b" > /proc/sysrq-trigger

Si, par contre, vous préférez ne pas redémarrer le serveur alors :

  • Montez votre partition racine originale (celle sur le disque) ou LV vers /oldroot ( _Changement device avec la partition racine ou le volume logique et se référer à l'enregistrement précédemment effectué mounted_fs fichier_ ) :

    mount device /oldroot
  • Alors, cours :

    mount --make-rprivate /
  • Ensuite, remplacez la racine du système par celle qui se trouve sur le disque :

    pivot_root /oldroot /oldroot/tmp/tmproot
  • Ensuite, préparez certaines parties importantes du système en exécutant les opérations suivantes trois les commandes l'une après l'autre dans le même ordre :

    for i in dev proc sys run; do mount --move /tmp/tmproot/$i /$i; done 
  • Ensuite, démontez /tmp/tmproot :

    umount -l /tmp/tmproot
  • Alors, cours :

    rmdir /tmp/tmproot
  • Ensuite, montez les systèmes de fichiers originaux :

    mount -a
  • Ensuite, redémarrez SSH :

    systemctl restart ssh
  • Ensuite, démarrez les services qui ont échoué :

    systemctl list-units --type=service --state=failed --no-pager --no-legend | awk '!/ssh/ {print $2}' | xargs systemctl restart
  • Ensuite, redémarrez les services en cours d'exécution :

    systemctl list-units --type=service --state=running --no-pager --no-legend | awk '!/ssh/ {print $1}' | xargs systemctl restart
  • Alors, cours :

    mount --make-rshared /
  • Alors, cours :

    systemctl isolate default.target
  • Ensuite, ouvrir un nouveau terminal et connectez-vous en SSH à votre serveur ... Si les choses fonctionnent comme prévu à partir de la nouvelle connexion SSH, alors vous avez terminé.

  • Nettoyer :

    rm mounted_fs

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X