URL: https://linuxfr.org/news/sauvegardes-encore-et-restitution Title: Sauvegardes (encore !) et restitution Authors: Yves DEMUR ElectronLibre63, Xavier Teyssier et Ysabeau đ§¶ Date: 2024ćčŽ07æ08æ„T17:14:56+02:00 License: CC By-SA Tags: sauvegarde et bash Score: 34 Ben oui, ce sujet mâintĂ©resse car je suis motivĂ© par la prĂ©servation de ce que je considĂšre comme prĂ©cieux dans les donnĂ©es que je crĂ©e ou rĂ©cupĂšre sur mon PC. En tant que bidouilleur jâai moi aussi créé un outil pour cela. Il correspond Ă mon besoin et j'en suis satisfait. Voici mon cheminement. Jâai fait une recherche sur *LinuxFR.org* avec le mot *sauvegarde* et jâai trouvĂ© des articles et des rĂ©actions toutes trĂšs intĂ©ressantes. Les besoins, les solutions, les mises en Ćuvre sont trĂšs variĂ©es. Chacun choisit ou crĂ©e selon son ressenti et finit par ĂȘtre satisfait de ce quâil fait. Chacun partage son expĂ©rience, en espĂ©rant quâelle profitera Ă dâautres. Ă mon tour. Le meilleur outil de sauvegarde est celui quâon utilise et en lequel on a confiance.  Je te propose un jeu : demande Ă un utilisateur de PC, smartphone... si la destruction inopinĂ©e de son appareil entraĂźnerait des pertes de fichiers irrĂ©mĂ©diables qui pourraient lâaffecter (photos familiales, documents...). Demande ensuite sâil fait des copies et/ou des sauvegardes. Pour beaucoup, tu seras cataloguĂ© comme *vilain geek alarmiste*. Il y a du travail de prise de conscience ! ---- ---- # Notion de sauvegarde Une analyse trĂšs courte de la fonction sauvegarde serait « *ranger quelque part des donnĂ©es qui permettront de restituer ce que je considĂšre comme prĂ©cieux* ». Les mots clĂ©s sont « *ranger* » « *quelque part* » « *donnĂ©es* » « *restituer* » « *prĂ©cieux* ». On a deux verbes « *ranger* » « *restituer* », deux localisations de donnĂ©es « *quelque part* » « *ce qui est prĂ©cieux* », et une notion de filtrage dans le mot « *prĂ©cieux* ». Un autre point de vue serait de dire quâune information prĂ©cieuse doit rĂ©sider en deux endroits, pour que la dĂ©faillance de lâun puisse ĂȘtre compensĂ©e par lâautre. Une des consĂ©quences consiste Ă doubler les archivages : la libĂ©ration des espaces prĂ©cieux par la suppression de donnĂ©es inactives doit ĂȘtre prĂ©cĂ©dĂ©e de lâarchivage des donnĂ©es Ă supprimer vers **deux** supports distincts. Une autre consĂ©quence est dâutiliser un mĂ©dia spĂ©cifique pour recevoir les sauvegardes (autre que celui oĂč sont les donnĂ©es Ă sauver). La dĂ©faillance peut ĂȘtre de plusieurs origines : matĂ©rielle, corruption du mĂ©dia, utilisateur qui efface/Ă©crase... # Que demande-t-on Ă un outil de sauvegarde ? Si je rĂ©digeais un cahier des charges pour un outil de sauvegarde, je ferais les listes suivantes. Je suis dans mon contexte de PC isolĂ©, ayant accĂšs Ă©ventuellement Ă un petit serveur sur le rĂ©seau local. FonctionnalitĂ©s de base : * sauver juste ce qui a Ă©tĂ© modifiĂ© depuis la sauvegarde prĂ©cĂ©dente => opĂ©ration rapide, * compression des fichiers archives => prend peu de place sur lâespace de sauvegarde, * facile Ă lancer et rapide en exĂ©cution => sera lancĂ© souvent => sĂ©curisation accrue, * filtrage => possibilitĂ© de conserver dans les espaces sauvĂ©s des fichiers qui nâencombreront pas les sauvegardes, * robuste => confiance. FonctionnalitĂ©s nĂ©cessaires : * vĂ©rification de lâintĂ©gritĂ© des fichiers archives engendrĂ©s, * restitution facile malgrĂ© le grand nombre de fichiers archives Ă exploiter, * restitution qui permette de rĂ©gĂ©nĂ©rer (ailleurs) lâespace sauvegardĂ© dans le mĂȘme Ă©tat que ce quâil Ă©tait au moment dâune des opĂ©rations de sauvegarde (accĂšs aux Ă©tats antĂ©rieurs), * recherche/extraction de fichiers dans le grand nombre de fichiers archives obtenus, * traçage pour vĂ©rifier le bon dĂ©roulement des opĂ©rations. On peut ajouter aussi : * algorithme ouvert et source fourni, * qui sâaccommode de tous types de support de stockage, * qui utilise des formats standard, * qui a toutes ses fonctionnalitĂ©s accessibles en ligne de commande. Le dernier point permettra dâutiliser lâoutil comme une commande classique. On pourra le lancer dans un script *bash* qui adaptera lâusage au besoin spĂ©cifique du moment (ajout de montage/dĂ©montage du mĂ©dia de sauvegarde, `rsync` rĂ©seau des fichiers gĂ©nĂ©rĂ©s...). Câest une commoditĂ© qui me manque quand je suis coincĂ© dans lâusage dâun outil *cliquodrome*. # Un script shell Ă©crit sur un coin de table (au dĂ©but) Jâai rencontrĂ© le *shell* lors de mon premier contact avec *Unix*, en 1987. Au dĂ©but jâai eu le sentiment de rĂ©gresser par rapport Ă la syntaxe *COM* des *Vax/VMS*. Depuis, jâai appris Ă apprĂ©cier le *bash*, bien plus commode que ses ancĂȘtres *sh* *csh*. Une des philosophies du *shell* est de combiner des commandes simples et robustes pour en faire une rĂ©ponse Ă un besoin. Par exemple `ls | wc -l` renvoie le nombre de fichiers/rĂ©pertoires du rĂ©pertoire courant. Toutefois, il y a des cas sournois oĂč le rĂ©sultat est faux, on verra plus loin ce que je qualifie de **piĂšges**. Avec les pipelines, les redirections, les variables, les traitements de chaĂźnes de caractĂšres, et tout le reste, on peut construire Ă lâinfini des sĂ©quences dâopĂ©rations qui sâappuient sur des commandes simples Ă lancer mais puissantes (genre outil de compression, outil de parcours dâune arborescence de fichiers...). Beaucoup des fonctionnalitĂ©s du systĂšme *GNU* sont construites comme cela. Un bidouilleur systĂšme ne peut pas ignorer le *bash*. En plus, *emacs* permet un accĂšs trĂšs commode aux *man*. Je nâai jamais eu de projet ou de besoin qui me pousse Ă maĂźtriser *Perl* ou *Python*. Je pense quâils sont encore plus puissants que *bash*. Comme jâaime bien bidouiller, Ă la fin du 20^e siĂšcle jâavais dans lâidĂ©e de faire un outil de sauvegarde basique qui sâappuie sur un *pipeline* : une commande `find` qui sĂ©lectionne les fichiers modifiĂ©s, `tar` pour les copier et `gzip` pour compresser. Jâai fait divers essais. En 2021, je mây suis mis sĂ©rieusement et jâai dĂ©couvert beaucoup de subtilitĂ©s du *bash*. Un des problĂšmes des sauvegardes incrĂ©mentales est de deviner si un fichier doit ĂȘtre sauvĂ©, sans avoir Ă comparer son contenu avec la version sauvĂ©e derniĂšrement (ça coĂ»te trop cher). Il faut se baser sur les paramĂštres du systĂšme de fichiers. Il faut bien choisir ces paramĂštres (on surveille leur changement), au risque de rater certains fichiers ou alors dâen sĂ©lectionner trop. Je me suis arrĂȘtĂ© sur la date de modification du statut et le numĂ©ro d'*inode*. # Scripts *bash* **tzsauv** Je pense ĂȘtre arrivĂ© au bout des spĂ©cifications avec lâoutil *tzsauv* que jâai Ă©crit en *bash*. Il est disponible sur [mon site](http://yves.demur.free.fr). Je mâen sers quotidiennement. Selon les jours, jâenvoie les fichiers archives sur le 2e disque ou sur clĂ© USB. Je fais aussi un miroir du rĂ©pertoire disque des fichiers archives vers *GoogleDrive* (ceinture et bretelles). Je fais aussi une sauvegarde Ă longue pĂ©riodicitĂ© (six mois) sur une clĂ© USB dĂ©diĂ©e (double ceinture). Les opĂ©rations principales utilisent les commandes standard `find` `sed` `tar` `zstd` `md5sum`, le *bash* sert Ă enchaĂźner tout ça et sert aux dialogues. Pour installer, il suffit de copier deux scripts sur le mĂ©dia de sauvegarde (*SauverTZ_ProjXY_01.bash* *tzsauv.bash*, total 96k, ajouter Ă©ventuellement lâaide *Alire.txt*), et modifier quelques paramĂštres dans lâun des scripts (le script lanceur *SauverTZ_\*.bash*). Le lancement peut se faire en ligne de commande ou via lâexplorateur de fichiers par *Clic-Droit/Actions/LancerDansKonsole*. LâinterprĂ©tation du *bash* prend des ressources, mais je pense quâelles sont nĂ©gligeables par rapport Ă celles prises par les E/S et les commandes standard citĂ©es ci-dessus. Le compresseur *zstd* semble ĂȘtre trĂšs performant, en temps et en taux de compression. De plus, il est *multithread*, ce qui lui permet de tirer avantage des processeurs actuels qui gagnent en puissance en augmentant le nombre de cĆurs. Le paramĂ©trage de *tzsauv* permet de choisir parmi plusieurs formats dâarchives. Pour la sauvegarde vers le 2^e disque, jâai copiĂ© sur le *Bureau* le lanceur de *Konsole*, puis jâai renommĂ© la copie et dans ses *PropriĂ©tĂ©s/Application* jâai modifiĂ© lâargument (*-e ./SauverTZ_ProjXY_01.bash*) et le dossier de travail. Du coup, avec juste un double-clic je lance la sauvegarde en mode interactif (-> question « *... TOTALE o/n/q ?* »). Elle est pas belle la vie ? # SubtilitĂ©s et piĂšges Je fais rĂ©guliĂšrement des petits programmes *bash* pour explorer des dĂ©tails de fonctionnement soit du *bash*, soit des commandes. Les *man* ont beau ĂȘtre dĂ©taillĂ©s, ils ne peuvent pas tout dire. Pour un bug de `tar` je suis allĂ© jusquâĂ consulter le source C, le corriger par plaisir et vĂ©rifier que câĂ©tait OK. La remontĂ©e du bug nâa pas abouti (personne nâutilise lâoption `-u` de `tar` ! Câest de la tĂ©trapilectomie, je suis xyloglotte mais pas encore alopĂ©cique). Si tu lances sous *bash* `ls | wc -l` puis `touch -- 'a'$'\n''b'` puis de nouveau `ls | wc -l`, le nombre renvoyĂ© aura augmentĂ© de deux alors que tu nâas ajoutĂ© quâun seul fichier. Câest normal car le nom du fichier ajoutĂ© tient sur deux lignes ! Solution : `ls -q | wc -l` ou `ls --zero | tr '\n0ć' '0ć\n' | wc -l`. Pour voir le rĂ©sultat de `ls -q` envoyĂ© Ă `wc -l` via le *pipeline*, entrer `ls -q | cat`. Les deux seuls caractĂšres interdits dans les noms de fichiers/rĂ©pertoires *\*unix\** sont « **/** » et « **0ć** » (Ă mĂ©diter). Je tâinvite Ă crĂ©er sous *bash* un fichier piĂšge par `echo "abcd"> $' xyza\x01b\x02c\x03d\x04e\x05f\x06g\x07h\x08i\x09j\x0ak\x0bl\x0cm\x0dn\x0eo\x0fESC\x1bDEL\x7f\x80\xff\x26\x22\x27\x60\x5c SPC '`, Ă le sauver avec ton outil, puis Ă le restituer. Tu verras si ça passe et si le nombre de fichiers est correct. Pour le dĂ©truire `rm -i *xyza*` devrait convenir. Essaye aussi avec un sous-rĂ©pertoire `mkdir $' xyzp\x01b\x02c\x03d\x04e\x05f\x06g\x07h\x08i\x09j\x0ak\x0bl\x0cm\x0dn\x0eo\x0fESC\x1bDEL\x7f\x80\xff\x26\x22\x27\x60\x5c SPC '`. Mets-y un fichier, puis fais une sauvegarde totale, modifie le fichier et fais une incrĂ©mentale. Ensuite fais un essai de restitution. Joue aussi Ă modifier le nom du rĂ©pertoire parent du sous-rĂ©pertoire piĂšge. Pour jouer avec ces choses dangereuses, je te conseille de faire une zone Ă part, ne fais pas courir de risque Ă ta production. Sur ma *Mageia9.2-official*, le navigateur *Dolphin* nâarrive pas Ă dĂ©truire le rĂ©pertoire piĂšge. Je passe par la ligne de commande. Jâai rencontrĂ© tout plein de piĂšges et jâen ai imaginĂ© dâautres : un fichier de nom *-f*, un rĂ©pertoire de nom *-*, comment dĂ©truire le fichier ? Comment faire un `cd` vers le rĂ©pertoire ? Solutions : `rm -f -- -f` et `cd -- -/` et si le nom du rĂ©pertoire est dans la variable *var* `cd -- "${var%/}/"` (prĂ©voir le cas oĂč `var="/"`). Jâai dĂ©couvert que `zstd` en mode filtre lancĂ© par `tar`, se met en erreur sâil existe un sous-rĂ©pertoire de nom *-* dans le rĂ©pertoire courant (câest trĂšs particulier, en effet). Lâexamen des sources de `tar` et de `zstd` mâa confirmĂ© le problĂšme, la solution mâa parue simple (inverser lâordre de deux tests dans le source de `zstd`) mais la remontĂ©e de bug nâa pas abouti. Ce nâest pas grave, je sais maintenant quâil ne faut pas utiliser `tar ... --zstd ...`, et je mets plutĂŽt `zstd -c[d]` dans un *pipeline*. Jâen raconte un maximum dans le fichier *notes01.bash*. Toute cette expĂ©rience me permet de crĂ©er des scripts *bash* robustes. # Conclusion Ton outil de sauvegarde est le meilleur, car il te convient. Fais-toi une idĂ©e claire * de tous tes espaces contenant des fichiers prĂ©cieux Ă tes yeux, * de tous tes espaces de sauvegarde, * des mĂ©canismes de sauvegarde et de restitution. Cela participe Ă la confiance. Nâoublie pas de faire de temps en temps un contrĂŽle dâintĂ©gritĂ© des archives et un exercice de restitution. Câest un peu de travail, juste pour vĂ©rifier quâune mise Ă jour, ou une donnĂ©e inhabituelle, ou autre chose, nâa pas mis en dĂ©faut la capacitĂ© Ă restituer comme tu lâentends. Si la restitution est rendue impossible, câest comme si tu nâavais jamais sauvegardĂ© ! ***La confiance, en informatique ça se surveille du coin de lâĆil*** ***Lâinformatique est une science exacte pour la machine, pas pour lâhomme ; il compense par lâhumilitĂ© et lâempirisme***