Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/02/2025, à 17:10

geole

Service de sauvegarde d'un disque interne dans un disque externe.

Bonjour.
En début d'année, deux discussions sur la duplication des données  ont éveillées mon  intérêt.

La première était basée sur l'utilisation  de clonezilla; Duplication de tout le disque interne dans le disque externe;
Le but recherché était de pouvoir rebooter immédiatement si le disque interne  devenait hors service.
La contrainte annoncée  est que cette opération prend trop de temps pour de la sauvegarde quotidienne qui ne modifie pas beaucoup de chose.
La demande était:  Est-il possible de faire autrement?

La seconde est basée sur la commande rsync qui dérape lorsque le disque externe n'est pas branché.

J'ai fabriqué quelque chose qui commence  à prendre forme. Je le publie  pour des propositions d'amélioration  ou  pour exemple.  C'est sous forme de pavés  avec des commandes les plus compréhensibles possibles.
Il y a utilisation des services udev systemd  avec utilisation de zenity. Ce qui fut très difficile en étant root. (Je ne m'y attendais pas du tout)!

1) Les Prérequis.
-  Le logiciel utilisé est UBUNTU 24.04.1 et EFI  avec affichage WAYLAND

 lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 24.04.1 LTS
Release:	24.04
Codename:	noble

[ -d /sys/firmware/efi ] && echo "Session EFI" || echo "Session non-EFI"
Session EFI

echo $XDG_SESSION_TYPE
wayland

- Toutes les partitions montées dans les fichiers /etc/fstab doivent l'être en utilisant les UUID des partitions et non des labels car la méthode va s'appuyer sur des changements de label et  non de UUID  afin de conserver  intact le  reboot automatique  lorsque le disque externe deviendra le référant. Cependant l'utilisation de LABEL reste possible si l'option nofail a été ajoutée. Cela permettra alors aux logiciels du disque externe de booter sans se planter.

- Si possible, toutes les partitions du disque interne auront des labels.https://forum.ubuntu-fr.org/search.php?action=show_replies&user_id=1715611
     Spécialement les partitions de données.
     Le script fait exception pour les partitions contenant  l'O.S. en fonctionnement installé dans une partition EXT4 et dans une partition BTRFS. Mais le test n est pas fait. Cela devrait être l'un ou l'autre et pas les deux à la fois.

- Les partitions du disque externe  doivent être préalablement créées.
      Je pense que si boot LEGACY et disque entrée GPT, le disque sortie doit aussi être avec une table de partition GPT  et une partition Bios-boot de même taille et au même endroit ( généralement en début de disque).

-  Le logiciel installé dans une partition BTRFS doit être préventivement dupliqué car le script ne sait pas  refabriquer le même UUID.  L'application gparted sait faire du copier/coller de partition.

2) Récupérer les caractéristiques  du disque.
Il faudra brancher le disque externe, récupérer sa désignation par la commande lsblk -fe7  puis demander ses caractéristiques techniques. Exemple pour le disque /dev/sde

udevadm info -a -p /sys/block/sde  | grep -E "manufacturer|product|serial" 
    ATTRS{manufacturer}=="Seagate"
    ATTRS{product}=="Slim  SL"
    ATTRS{serial}=="NA4T1SG4"
    ATTRS{manufacturer}=="Linux 6.8.0-51-generic xhci-hcd"
    ATTRS{product}=="xHCI Host Controller"
    ATTRS{serial}=="0000:00:14.0"

3) Indiquer que la détection du disque doit déclencher un service systemd.

echo 'KERNEL=="sd[c-z]", ACTION=="add", ATTRS{manufacturer}=="Seagate",  ATTRS{product}=="Slim  SL", ATTRS{serial}=="NA4T1SG4", TAG+="systemd", ENV{SYSTEMD_WANTS}="Sauvegarde@$devnode.service"  ' | sudo tee  /lib/udev/rules.d/76-Sauvegarde.rules
sleep 1
cat /lib/udev/rules.d/76-Sauvegarde.rules
sudo udevadm control --reload 
journalctl --no-pager -b -n 5

Quelques remarques
    Pour mon  ordinateur, la numérotation du disque externe commence à sdc. C'est à adapter.
    La codification du nom du service systemd est très particulière avec sa  terminaison  @ et son extension $devnode.service qui  transmettra le nom du disque au service.
   On peut définir plusieurs disques lançant la même procédure pour avoir la sécurité en plusieurs exemplaires ou lançant  des procédures différentes: Un gros disque interne  avec des disques externes plus petits nécessitant de  séparer les partitions pour que tout tienne.

4) Créer le service utilisateur autorisant root à discuter avec l'utilisateur wayland.
C'est la surprise de la quinzaine!  Je n'ai pas su faire autrement. Donc par désespoir, je contourne de cette façon pas très professionnelle me semble t -il.   Comme quoi root n'aurait pas tous les droits!

mkdir -pv $HOME/.config/systemd/user
cat <<"EOF" >$HOME/.config/systemd/user/ROOT.service
[Unit]
Description=Autoriser Root à écrire dans l'écran.
[Service]
Type=simple
ExecStartPre=sleep 30
# Inutile de se presser au démarrage: Si l'utilisateur n'a pas encore eu le temps de se connecter, la commande foire.
ExecStart=xhost si:localuser:root
[Install]
WantedBy=default.target
EOF
sleep 1
systemctl --user   stop ROOT.service;systemctl --user daemon-reload
systemctl --user enable ROOT.service;systemctl --user start ROOT.service;
systemctl --user status ROOT.service;

5)  Créer le service d'exécution de la sauvegarde en étant root.

sudo -i
cat <<EOF>/etc/systemd/system/Sauvegarde@.service
[Unit] 
Description=Service de sauvegarde dans un disque externe.
DefaultDependencies=no
[Service]
Type=simple
Environment="DISQUE=%I"
Environment="UTILISATEUR=a"
TimeoutSec=123minutes
ExecStartPre=echo La sauvegarde va se réaliser.
ExecStartPre=sleep 15 
ExecStart=/home/a/Sauvegarde.sh
# Attendons que les diverse partitions aient le temps de se monter
ExecStopPost=echo La sauvegarde est terminée. 
EOF
sleep 1
systemctl daemon-reload
exit

Dernière modification par geole (Le 04/02/2025, à 18:25)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#2 Le 04/02/2025, à 17:10

geole

Re : Service de sauvegarde d'un disque interne dans un disque externe.

6) Créer  le script de sauvegarde.

cat <<"EOF" >$HOME/Sauvegarde.sh
#!/usr/bin/bash
Dsk=${DISQUE//-//}   ##### On remplace tous les tirets par des  slashs. Soit /dev/sdX
EXT4=/dev/sda8    #### On dit que la partition EXT4  qui contient le logiciel est sur SDA8
BTRFS=/dev/sda9   #### On dit que la partition BTRFS qui contient le logiciel est sur SDA9
BIOS=/dev/sda22   #### On dit que la partition BIOS-GRUB qui contient la structure de boot legacy est sur SDA22
rm -f /tmp/Sauvegarde*
echo $Dsk>/tmp/Sauvegarde-Dsk.txt
echo Sauvegarde enclenchée dans $Dsk.
Info() { DISPLAY=:1 zenity --info  --title="Sauvegarde dans $Dsk" --text "$1" ; echo "$1"; }
Info "Le fonctionnement du logiciel sera fortement ralenti à cause de la sauvegarde en cours dans $Dsk."
#Regardons si les conditions de montage sont remplies.
# On sait déjà que le disque est dans la liste de ceux autorisés mais a-t-il encore les bonnes partitions?
Liste=$(lsblk -fe7 $Dsk); lsblk -fe7 $Dsk>/tmp/Sauvegarde-lsblk-txt
for Label in SAVEFI SAVEXT4 SAVDATA1 SAVDATA2 SAVDATA3 SAVDATA4 SAVBTRFS SAVCommun SAVW21H2a;
do if [[ $Liste =~  $Label  ]];then echo $Label Ok>/dev/null;else echo $Label absent>>/tmp/Sauvegarde-erreurs.txt;fi;done
if [ -e /tmp/Sauvegarde-erreurs.txt ];then Info "Il y a des erreurs d'identification. Consulter /tmp/Sauvegarde-erreurs.txt";exit 1;fi

#Si boot en LEGACY, copier le MBR
if [ ! -d /sys/firmware/efi ];then
   echo Copie du MBR  
   sudo dd if=/dev/sda of=$Dsk count=1 bs=446 1>>/tmp/erreurs.txt 2>/dev/null
   # Copier la partition BIOS-GRUB si présente, sinon copier le début du disque.
   Dsk1=$(fdisk -l  $Dsk | grep Amorçage | cut -c1-10)
   if [ ! -z $Dsk1 ];then      echo Copie de la partition bios-grub  
      dd if=$BIOS of=$Dsk1  1>>/tmp/Sauvegarde-erreurs.txt 2>/dev/null
   else       echo Copie du début du disque
      dd if=/dev/sda of=/dev/$Dsk count=2047 skip=1 seek=1  1>>/tmp/Sauvegarde-erreurs.txt 2>/dev/null
   fi
fi

# Copions la partition EFI ## Pour une raison que j'ignore la partition FAT32 ne se monte pas automatiquement.
echo  utilisateur détecté=$UTILISATEUR.
if ! mountpoint -q /media/$UTILISATEUR/SAVEFI;then echo savefi non monté;mkdir -v /media/$UTILISATEUR/SAVEFI;sleep 1;mount /dev/disk/by-label/SAVEFI /media/$UTILISATEUR/SAVEFI;fi
if mountpoint -q /media/$UTILISATEUR/SAVEFI;then 
   echo Copie de la partition EFI; echo rsync -a /boot/efi/EFI /media/$UTILISATEUR/SAVEFI >>/tmp/Sauvegarde-rsync.txt  
   (time rsync -a --stats /boot/efi/EFI /media/$UTILISATEUR/SAVEFI 1>>/tmp/Sauvegarde-rsync.txt 2>>/tmp/Sauvegarde-erreurs.txt) &>>/tmp/Sauvegarde-rsync.txt
else echo Sauvegarde impossible pour SAVEFI >>/tmp/erreurs.txt;fi 
udisksctl unmount -b /dev/disk/by-label/SAVEFI;rmdir /media/$UTILISATEUR/SAVEFI
 
#Copions le logiciel EXT4
if ! mountpoint -q /media/$UTILISATEUR/SAVEXT4;then echo SAVEXT4 non monté;mkdir -v /media/$UTILISATEUR/SAVEXT4;sleep 1;mount /dev/disk/by-label/SAVEXT4 /media/$UTILISATEUR/SAVEXT4;fi
if mountpoint -q /media/$UTILISATEUR/SAVEXT4;then
   ## Vérifions si la partition émettrice est  en exécution
   Mount=$(lsblk -no MOUNTPOINTS $EXT4)
   if [ $Mount == "/" ];then
      echo Copie du logiciel EXT4 en exécution sous $UTILISATEUR; echo rsync -a -x --delete-after --exclude={'/proc','/sys','/swapfile','*.swap','/var/log/journal','/tmp','/var/tmp','.cache'} / /media/$UTILISATEUR/SAVEXT4 >>/tmp/Sauvegarde-rsync.txt
   (time rsync -a -x --stats --delete-after --exclude={'/proc','/sys','/swapfile','.swap','/var/log/journal','/var/log/kern.*','/var/log/syslog.*','/tmp','/var/tmp','.cache','.gvfs'} / /media/$UTILISATEUR/SAVEXT4 1>>/tmp/Sauvegarde-rsync.txt 2>>/tmp/Sauvegarde-erreurs.txt) &>>/tmp/Sauvegarde-rsync.txt
   else
      if ! mountpoint -q /media/EXT4;then echo EXT4 non monté >>/tmp/Sauvegarde-erreurs.txt
      else
      echo Copie totale du logiciel EXT4 sous $UTILISATEUR; echo rsync -a -x  /media/EXT4 /media/$UTILISATEUR/SAVEXT4 >>/tmp/Sauvegarde-rsync.txt
   (time rsync -a -x --stats --delete-after  /media/EXT4 /media/$UTILISATEUR/SAVEXT4 1>>/tmp/Sauvegarde-rsync.txt 2>>/tmp/Sauvegarde-erreurs.txt) &>>/tmp/Sauvegarde-rsync.txt
      fi
   fi  
else 
   echo Montage absent pour SAVEXT4 >>/tmp/Sauvegarde-erreurs.txt;  
fi
udisksctl unmount -b /dev/disk/by-label/SAVEXT4;rmdir /media/$UTILISATEUR/SAVEXT4
  
#On se permet de contrôler que les deux UUID sont identiques.
UUIDSAVEXT4=$(lsblk -no UUID /dev/disk/by-label/SAVEXT4)  ##;  echo $UUIDSAVEXT4
UUIDROOT=$(lsblk -no UUID /dev/disk/by-label/EXT4) ##&& echo $UUIDROOT
if [ "$UUIDSAVEXT4" != "$UUIDROOT" ];then 
   e2fsck -fy /dev/disk/by-label/SAVEXT4
   tune2fs -U $UUIDROOT /dev/disk/by-label/SAVEXT4
fi
UUIDSAVEXT4=$(lsblk -no UUID /dev/disk/by-label/SAVEXT4)  ##;  echo $UUIDSAVEXT4
if [ "$UUIDSAVEXT4" != "$UUIDROOT" ];then echo les UUID des partitions EXT4 ne sont pas toujours identiques, après correction. >>/tmp/Sauvegarde-erreurs.txt
fi
 
#Copions les autres partitions
Info "Le logiciel est fini de dupliquer."
for Label in SAVDATA1 SAVDATA2 SAVDATA3 SAVDATA4;do
    if mountpoint -q /media/${Label: 3};then
       echo "/media/$UTILISATEUR/$Label"; echo rsync -a -x --delete-after /media/$UTILISATEUR$/${Label: 3} /media/$UTILISATEUR/$Label >>/tmp/Sauvegarde-rsync.txt  
       if mountpoint -q /media/$UTILISATEUR/$Label;then  
          (time rsync -a -x --stats --delete-after /media/${Label:3} /media/$UTILISATEUR/$Label 1>>/tmp/Sauvegarde-rsync.txt 2>>/tmp/Sauvegarde-erreurs.txt) &>>/tmp/Sauvegarde-rsync.txt
          udisksctl unmount -b /dev/disk/by-label/$Label
       else echo Montage absent pour $Label >>/tmp/Sauvegarde.erreurs.txt;fi
    else echo Montage absent pour ${Label: 3} >>/tmp/Sauvegarde.erreurs.txt;fi
#On se permet de contrôler que les deux UUID sont identiques.
UUIDSAVEXT4=$(lsblk -no UUID /dev/disk/by-label/$Label) ##;  echo $UUIDSAVEXT4
UUIDROOT=$(lsblk  -no UUID /dev/disk/by-label/${Label:3}) ##;  echo $UUIDROOT
if [ "$UUIDSAVEXT4" != "$UUIDROOT" ];then 
   e2fsck -fy /dev/disk/by-label/$Label
   tune2fs -U $UUIDROOT /dev/disk/by-label/$Label
fi
UUIDSAVEXT4=$(lsblk -no UUID /dev/disk/by-label/$Label) ;  echo $UUIDSAVEX
if [ "$UUIDSAVEXT4" != "$UUIDROOT" ];then echo les UUID des partitions $Label ne sont pas toujours identiques, après correction. >>/tmp/Sauvegarde-erreurs.txt
fi
done

#Traitons la partition logicielle btrfs qui semble aussi ne pas se monter automatiquement.
if ! mountpoint -q /media/$UTILISATEUR/SAVBTRFS;then echo SAVBTRFS non monté;mkdir -v /media/$UTILISATEUR/SAVBTRFS;sleep 1;mount /dev/disk/by-label/SAVBTRFS /media/$UTILISATEUR/SAVBTRFS;fi
if mountpoint -q /media/$UTILISATEUR/SAVBTRFS;then 
   ## Vérifions si la partition émettrice est  en exécution
   Mount=$(lsblk -no MOUNTPOINTS $BTRFS)
   if [ $Mount == "/" ];then echo Copie de la partition BTRFS en exécution;
   echo rsync -ahx --delete-after --exclude={'/home','/dev','/proc','/run','/sys','/swapfile','/var/log/journal','/tmp','/var/tmp','.cache','.gvfs','timeshift*'}  /*  /media/$UTILISATEUR/SAVBTRFS/@  1>>/tmp/Sauvegarde-rsync.txt
        (time rsync -ahx --stats --delete-after --exclude={'/home','/dev','/proc','/run','/sys','/swapfile','/var/log/journal','/var/log/kern.*','/var/log/syslog.*','/tmp','/var/tmp','.cache','.gvfs','timeshift*'}  /*  /media/$UTILISATEUR/SAVBTRFS/@  1>>/tmp/Sauvegarde-rsync.txt 2>>/tmp/Sauvegarde-erreurs.txt) &>>/tmp/Sauvegarde-rsync.txt
   echo rsync -ahx --delete-after /home/*  /media/$UTILISATEUR/SAVBTRFS/@home  >>/tmp/Sauvegarde-rsync.txt
        (time rsync -ahx --stats --delete-after /home/*  /media/$UTILISATEUR/SAVBTRFS/@home  1>>/tmp/Sauvegarde-rsync.txt 2>>/tmp/Sauvegarde-erreurs.txt) &>>/tmp/Sauvegarde-rsync.txt
    else  echo Copie  totale de la partition BTRFS;
         echo rsync -ahx --delete-after --exclude={'timeshift*}' /media/BTRFS/*  /media/$UTILISATEUR/SAVBTRFS >>/tmp/Sauvegarde-rsync.txt
        (time rsync -ahx --stats --delete-after --exclude={'timeshift*}'/media/BTRFS/*  /media/$UTILISATEUR/SAVBTRFS 1>>/tmp/Sauvegarde-rsync.txt 2>>/tmp/Sauvegarde-erreurs.txt) &>>/tmp/Sauvegarde-rsync.txt
    fi   
    udisksctl unmount -b /dev/disk/by-label/SAVBTRFS; rmdir /media/$UTILISATEUR/SAVBTRFS
    UUIDSAVBTRFS=$(lsblk -no UUID /dev/disk/by-label/SAVBTRFS)  ##;  echo $UUIDSAVBTRFS
    UUIDBTRFS=$(lsblk -no UUID /dev/disk/by-label/BTRFS) ##&& echo $UUIDBTRFS
    if [ "$UUIDSAVBTRFS" != "$UUIDBTRFS" ];then echo les UUID des partitions BTRFS ne sont pas identiques  >>/tmp/Sauvegarde-erreurs.txt;fi
    ####btrfstune -U $UUIDROOT /dev/disk/by-label/SAVBTRFS ==> ERROR: fsid c27eecf2-7139-4041-b3aa-a6f646180dee is not unique
else echo Montage absent pour SAVBTRFS >>/tmp/Sauvegarde-erreurs.txt;fi

#Traitons le logiciel windows autrement que par rsync car avec ses 2 millions de fichiers, cela prend trop de temps.
umount -v /dev/disk/by-label/SAVW21H2a
DISPLAY=:1 zenity --question --text  "La sauvegarde windows est estimée à quinze minutes. Faut-il le sauvegarder?"
if [ $? = 0 ];then 
    Dsk2=$(lsblk -fe7 $Dsk | grep SAVW21H2a | cut -c7-11)
    echo Duplication du logiciel windows
    umount -v /dev/sda4  ### La partition entrée.
    (time ntfsclone --overwrite /dev/$Dsk2 /dev/sda4 1>/tmp/Sauvegarde-ntfsclone1.txt 2>/tmp/Sauvegarde-ntfsclone2.txt) &>>/tmp/Sauvegarde-ntfsclone1.txt
    ntfslabel --force $Dsk2 SAVW21H2a 1>>/tmp/Sauvegarde-ntfsclone1.txt 2>>/tmp/Sauvegarde-ntfsclone2.txt
    mount -v /dev/sda4
    if grep -q ERROR /tmp/Sauvegarde-partclone2.txt;then cat /tmp/Sauvegarde-ntfsclone2.txt >>/tmp/erreurs.txt;fi
    
    #The disk contains an unclean file system"
else echo Pas de sauvegarde demandée pour windows >/tmp/Sauvegarde-ntfsclone.txt;fi


### Traitons la sauvegarde des données personnelles  dans une partition chiffrée.
#  Montage de la partition
Data=SAVCommun
zpool export  $Data ### Pour se prémunir d un montage antérieur ailleurs.
zpool import -f $Data
for (( i=1; i < 6; i++ ));  do 
    Statut=$(zfs get mounted  $Data |tail -1 )
    if [[  $Statut =~  "no"  ]] ; then  
      ret2=`DISPLAY=:1 zenity --entry --title="Montage de la partition $Data ($i/6)." --text "veuillez fournir la phrase de déchiffrement de $Data." ` 
      zfs mount -vl $Data <<<$ret2
    else i=6    
    fi   
done
if  [[ ! $Statut =~  "yes"  ]] ; then
    DISPLAY=:1 zenity --error --text "La partition $Data n'est pas disponible; veuillez investiguer!"
    echo "La partition $Data n'est pas disponible; veuillez investiguer!" >>/tmp/erreurs.txt
else
    echo rsync -a  --delete-after --exclude={'/Sports','/a/Téléchargements'} /media/Commun/* /media/SAVCommun >>/tmp/Sauvegarde-rsync.txt
    ### Et oui, ce second disque externe de test est plus petit que la partition. Donc il faut faire un choix.
    (time sudo rsync -a --progress --stats --delete-after --exclude={'/Sports','/a/Téléchargements'} /media/Commun/* /media/SAVCommun 1>>/tmp/Sauvegarde-rsync.txt 2>>/tmp/Sauvegarde-erreurs.txt) &>>/tmp/Sauvegarde-rsync.txt
zpool export  $Data 
fi

# Tout s'est-il bien passé?
if [ -s /tmp/Sauvegarde-erreurs.txt ];then  Info "Il y a des erreurs de duplication . Consulter /tmp/Sauvegrde-erreurs.txt"
else Info "Félicitations. La duplication de toutes les partitions est terminée sans aucune erreur. Le disque $Dsk peut être débranché." 
fi
EOF
sleep 1
chmod +x $HOME/Sauvegarde.sh
wc -l $HOME/Sauvegarde.sh

Dernière modification par geole (Le 11/02/2025, à 12:42)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#3 Le 04/02/2025, à 17:11

geole

Re : Service de sauvegarde d'un disque interne dans un disque externe.

Les remarques.
Pour l'environnement zenity
   Initialement, je maîtrisais zenity dans un script user  utilisé pour monter ma partition de données personnelles chiffrée.
   Le service de sauvegarde a été créé en root  pour faire la sauvegarde logicielle. Je voulais informer l'utilisateur. Les exemples  trouvés étaient par email. Je voulais sur l écran.

Dans un premier temps, j'ai changé la nature du service pour mettre utilisateur.  Zenity fonctionnait   Mais la commande RSYNC ne fonctionnait plus pour sauvegarder ce qui était interdit à l' utilisateur d'où l'obligation de  mettre un sudo et d'introduire le mot de passe. Là, non plus, je n'ai pas su faire.
Donc je suis revenu à un service systemd et ce palliatif. Je ne sais pas si c'est un bug ou une fonctionnalité.

Pour l'exécution
-  La première connexion lance le script avec le disque connu comme étant SDC.
  Mais je dois faire mal quelque chose car si je relance, il devient SDD. Ainsi de suite.
Ce qui m'a permit  de voir qu'après SDZ, il s'appellera SDAA. Mais mes scripts n'ont prévu que pour trois caractères.
- Si à la fin de la duplication, j'oublie de le débrancher, De façon "aléatoire", le script se relance. J'ai même l'impression qu'il se relance quelquefois en double exemplaire et je n'ai pas prévu le  cas.
Je suis sur l'hypothèse d'un faux contact dans le port USB qui ferait croire à une nouvelle connexion.
Mais les trois ports auraient cette faiblesse!
- Plus surprenant
    La partition FAT32   n'est pas montée automatiquement. Je n'en vois pas trop la raison
    Une partition EXT4 et la partition  BTRFS ne sont  pas montées automatiquement. Je pense que la cause est UUID  déjà monté. Je vais regarder avec les autres partitions EXT4.

Pour le suivi de l'exécution.
Comme c'est un service, on peut suivre classiquement son fonctionnement.

watch systemctl status Sauvegarde@-dev-sdX

La lettre X peut être trouvée facilement avec la commande lsblk -fe7
Je suis surpris par la consommation mémoire

systemctl status Sauvegarde@-dev-sdd
● Sauvegarde@-dev-sdd.service - Service de sauvegarde dans un disque externe.
     Loaded: loaded (/etc/systemd/system/Sauvegarde@.service; static)
     Active: active (running) since Wed 2025-02-05 17:30:29 CET; 14min ago
    Process: 7483 ExecStartPre=echo La sauvegarde va se réaliser. (code=exited, status=0/SUCCESS)
    Process: 7486 ExecStartPre=sleep 15 (code=exited, status=0/SUCCESS)
   Main PID: 7582 (Sauvegarde.sh)
      Tasks: 3 (limit: 6893)
     Memory: 2.1G (peak: 2.1G)
        CPU: 2min 27.861s
     CGroup: /system.slice/system-Sauvegarde.slice/Sauvegarde@-dev-sdd.service
             ├─7582 /bin/bash /home/a/Sauvegarde.sh
             ├─8888 /bin/bash /home/a/Sauvegarde.sh
             └─8889 ntfsclone --overwrite /dev/sdd8 /dev/sda4

févr. 05 17:33:24 p Sauvegarde.sh[7582]: /media/a/SAVDATA3
févr. 05 17:33:24 p Sauvegarde.sh[7985]: Unmounted /dev/sdd6.
févr. 05 17:33:24 p Sauvegarde.sh[7582]: /media/a/SAVDATA4
févr. 05 17:33:24 p Sauvegarde.sh[7995]: Unmounted /dev/sdd7.
févr. 05 17:33:24 p Sauvegarde.sh[7582]: Copie de la partition BTRFS
févr. 05 17:39:40 p Sauvegarde.sh[8826]: Unmounted /dev/sdd10.
févr. 05 17:39:40 p Sauvegarde.sh[8844]: rmdir: impossible de supprimer '/media/a/SAVBTRFS': Aucun fichier ou dossier de ce nom
févr. 05 17:39:41 p Sauvegarde.sh[8856]: umount: /media/a/SAVW21H2a (/dev/sdd8) démonté
févr. 05 17:39:48 p Sauvegarde.sh[7582]: Duplication du logiciel windows
févr. 05 17:39:48 p Sauvegarde.sh[8887]: umount: /dev/sda4: non monté.

On peut aussi suivre avec

ail /tmp/Sauvegarde*
==> /tmp/Sauvegarde-Dsk.txt <==
/dev/sdd

==> /tmp/Sauvegarde-erreurs.txt <==
rsync: [sender] link_stat "/media/DATA1" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]
rsync: [sender] link_stat "/media/DATA2" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]
rsync: [sender] link_stat "/media/DATA3" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]
rsync: [sender] link_stat "/media/DATA4" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]
les UUID des partitions BTRFS ne sont pas identiques

==> /tmp/Sauvegarde-lsblk-txt <==
├─sdd2  vfat              FAT32 SAVEFI    2DF0-F2F2                                           
├─sdd3  ext4              1.0   SAVEXT4   45b57b34-0e1d-4d6e-aab3-e56dc7f254d1                
├─sdd4  ext4              1.0   SAVDATA1  b2c77c2d-6f93-44f3-b9df-53f7a601ba04   41,7G     0% /media/a/SAVDATA1
├─sdd5  ext4              1.0   SAVDATA2  76fa5e77-cbf3-4ca9-af93-ee0b083280e2   41,7G     0% /media/a/SAVDATA2
├─sdd6  ext4              1.0   SAVDATA3  46464c26-d979-433c-93cf-e8905b904204   41,4G     1% /media/a/SAVDATA3
├─sdd7  ext4              1.0   SAVDATA4  7d93117c-596b-492b-988d-70ea47326c20   41,4G     1% /media/a/SAVDATA4
├─sdd8  ntfs                    SAVW21H2a 164AA5F175A60C9A                       69,9G     0% /media/a/SAVW21H2a
├─sdd9  linux_raid_member 1.2   p:0       1732f595-be29-30e0-e967-a3de83c6145c                
├─sdd10 btrfs                   SAVBTRFS  e0c5b943-1c02-44a2-bbaf-87ebda5e363b    8,9G    88% /media/a/SAVBTRFS
└─sdd11 linux_raid_member 1.2   p:0       dde975e6-cdf9-dc3c-f42a-f85c93c380dc                

==> /tmp/Sauvegarde-ntfsclone1.txt <==
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 75124174848 bytes (75125 MB)
Current device size: 75124178944 bytes (75125 MB)
Scanning volume ...
100.00 percent completed
Accounting clusters ...
Space in use       : 57145 MB (76,1%)   
Cloning NTFS ...
 35,06 percent completed
==> /tmp/Sauvegarde-ntfsclone2.txt <==
ntfsclone v2022.10.3 (libntfs-3g)

==> /tmp/Sauvegarde-rsync.txt <==
total size is 58,81G  speedup is 39,64

real	5m10,711s
user	0m10,988s
sys	0m41,951s
rsync -ahx --delete-after /home/a /home/b /media/a/SAVBTRFS/@home

real	0m59,069s
user	0m1,422s
sys	0m5,570s

Pour le script lui-même

L'initialisation
- Je n'ai pas su dire dans le script que j'autorisais root à  faire de l'affichage dans l'écran.
- J'ai choisi de récupérer le nom du disque en utilisant le service systemd. Je pouvais le récupérer aussi à partir  de la commande lsblk. Je n'ai besoin de ce nom que pour la mise à jour de la structure légacy.
- J'ai choisi de ne rien lancer s'il manque quelque chose. C'est discutable.

La mise à jour légacy
  J'ai écris les séquences, elles sont probablement sans erreur.  Mais comme mon ordinateur est EFI, je ne peux pas les exécuter pour vérifier que le boot légacy se fait bien. Le test est donc  entièrement à faire.
La partition EFI
  Je n'ai pas compris pourquoi elle ne se monte pas. Je suis parti du principe que la source était déjà montée dans l'instance. Mais rien ne l'oblige surtout si on utilise refind. Dans ce cas, elle peut être une partition totalement indépendante.

La partition logicielle EXT4
Un test  fait pour savoir si cette partition logicielle est en exécution.
     Si pas en eécution, on sauvegarde tout
     Si cette partition est en exécution, on peut ne pas tout sauvegarder. Dans cas il faut qu'une vieille copie des répertoires/fichiers non sauvegardés existe soit par un clone initial soit par un rsync initial  ne faisant pas d'exclusion.
D'autre part, si pendant la copie, une grosse activité de mise à jour logiciel se fait, on va retrouver des erreurs de synchronisation.

file has vanished: "/usr/lib/linux/triggers/6.8.0-52-generic"
file has vanished: "/var/lib/dpkg/updates/0000"
file has vanished: "/var/lib/dpkg/updates/0001"
file has vanished: "/var/lib/dpkg/updates/0002"
file has vanished: "/var/lib/dpkg/updates/0003"
file has vanished: "/var/lib/dpkg/updates/0004"
file has vanished: "/var/lib/dpkg/updates/0005"
file has vanished: "/var/lib/dpkg/updates/0006"
file has vanished: "/var/lib/dpkg/updates/0007"
file has vanished: "/var/lib/dpkg/updates/0008"

Ou pire des incohérances entre fichiers..  La fin de la sauvegarde de cette partition est signalée afin de libérer de cette contrainte.
Il y a contrôle de cohérence avec signalement d'erreur puis réparation.
Il  faudrait que je change: Contrôle, réparation si besoin et recontrôle avec signalement d'erreur au besoin. Il faudrait d'ailleurs généraliser. Mais je ne sais pas si c'est une bonne idée de réparer car initialement cela doit être correct.
Ce contrôle serait à généraliser pour toutes les partitions.

La sauvegarde des diverses partitions.
J'ai très peu développé.  Tant de partitions me semble anormal, De plus mettre dans un support externe sans chiffrer ne fait pas sérieux.
Une partition de données NTFS est ce contexte.

La sauvegarde de la partition BTRFS.
Même remarque que pour la partition contenant le logiciel, en prenant en compte la notion de sous-volume, que la réparation UUD est impossible et  qu'à un moment donné, une seule des deux est opérationnelle.

La sauvegarde du logiciel WINDOW
Une demande de sauvegarde est faite. Je considère que le RSYNC n'est pas une bonne solution dans ce contexte et je fais autrement.

Sauvegarde sécurisée des données utilisateurs.
Rappel, une solution pour fabriquer la partition réceptrice.
1) Fabriquer une partition EXT4  de taille convenable.
2) Fabriquer la partition ZFS avec cette commande à adapter.

sudo zpool create -f -m /media/SAVCommun -O encryption=on -O keyformat=passphrase -O keylocation=prompt -o feature@lz4_compress=enabled SAVCommun  /dev/sdXN

Cela apporte le chiffrement, la compression  et la gestion  d'une autre façon  moins connue   mais plus facile me semble-t-il. Mais ce n'est que mon choix.

Dernière modification par geole (Le 11/02/2025, à 12:20)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#4 Le 04/02/2025, à 19:06

Watael

Re : Service de sauvegarde d'un disque interne dans un disque externe.

salut,

tu devrais demander un déplacement sous "Trucs, asstuces, et scripts utiles".

tu dois vérifier qui exécute le script :

((UID)) || { >&2 echo 'must be root'; exit 1;}
Dsk=/dev/${DISQUE: -3:3}

c'est bizarre. Que peut contenir "DISQUE" ?
function et () c'est ceinture et bretelles, il y en a un de trop. Pour te décider, sache que POSIX ne connais pas function. wink

Liste=$(lsblk -fe7 $Dsk | tee /tmp/Sauvegarde-lsblk-txt)

* d'où viennent SAVEFI SAVEXT4...; je n'en ai aucun. Le script ne fonctionnera jamais chez moi ?

sleep 60

mais pourquoi si longtemps !?
...


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 05/02/2025, à 16:33

iznobe

Re : Service de sauvegarde d'un disque interne dans un disque externe.

Bonjour , petite remarque en passant :

Dsk=/dev/${DISQUE: -3:3}   ##### On Récupère les trois derniers caractères. Soit sdX

quid des disque nvme ?


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#6 Le 05/02/2025, à 16:55

geole

Re : Service de sauvegarde d'un disque interne dans un disque externe.

Bonjour à tous.
Mon but n'est pas d'en faire une script  universel mais quelque chose chose qui fonctionnerait correctement dans mon ordinateur et adaptable ailleurs.
Vos remarques vont certainement permettre de l'améliorer.
Mais déjà, il  a plein de commandes spécifiques tel que mon choix de dire que les labels commencent par SAV  en dur.
Il' y a aussi par exemple dd if=/dev/sda22.... Je dois bien être le seul à avoir une partition bios-grub avec cette valeur...

J'ai déjà noté vos remarques      Après l'allocation SDZ, le disque devient SDAA, donc la taille de trois caractères  ne tient pas, il va falloir que je codifie, "Récupérer tous lesfévr. 05 17:07:38 p systemd[1]: Started Sauvegarde@-dev-sdc.service - Service de sauvegarde dans un disque externe.. caractères qui suivent le dernier tiret" et je ne suis pas expert en script.

Pour Répondre déjà à une  ou deux questions
Voici la commande lancée par UDEV

févr. 05 17:07:38 p systemd[1]: Started Sauvegarde@-dev-sdc.service - Service de sauvegarde dans un disque externe..
Donc le paramètre $I du service contient -dev-sdc
C est donc ce que reçoit la variable $DISQUE
Il  va donc me suffire de remplacer tous les tirets par des / et le problème nvme sera réglé.
A moins de trouver comment agir en amont  afin d'éviter cette anomalie.

févr. 05 17:07:22 p systemd[1]: Invalid unit name "Sauvegarde@/dev/sdc.service" escaped as "Sauvegarde@-dev-sdc.service" (maybe you should 

Il me semble 60 secondes pour prendre connaissance d'un message d'erreur n'est pas grave.
Heureusement que le partitionnement de mon disque dur ne fait pas référence.... Le script, s'il est utilisé,  est à adapter à chaque contexte.

Dernière modification par geole (Le 05/02/2025, à 17:44)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#7 Le 05/02/2025, à 17:50

Watael

Re : Service de sauvegarde d'un disque interne dans un disque externe.

de quelles informations as-tu besoin émanant de lsblk ? cette commande possède une option -o qui permet d'afficher strictement ce dont tu as besoin, dans l'ordre que tu veux.

echo $Label Ok>/dev/null t'es sûr de ça ? smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 11/02/2025, à 12:37

geole

Re : Service de sauvegarde d'un disque interne dans un disque externe.

Bonjour
J'ai  incorporé vos principales remarques.

#!/usr/bin/bash
Dsk=${DISQUE//-//}   ##### On remplace tous les tirets par des  slashs.
Mount=$(lsblk -no MOUNTPOINTS $EXT4)

Je n'ai toujours pas compris le non-montage de la partition FAT32 et les remontages automatiques sans action de ma part.
Je pense à des faux contacts  ou une perte de puissance électrique plus qu'à un problème logiciel.
J'ai incorporé  une sauvegarde chiffrée et j'ai mis quelques paramètres en variables mais pas tous.
Je pense en rester là. Ce script ne doit rester qu'un exemple de possibilités. Mon but était avant tout de mettre en place un automatisme.

Dernière modification par geole (Le 11/02/2025, à 12:38)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne