#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.
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 ?
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