Auteur Sujet: Script lancé à l'arrêt de Linux: Quid de sync pour la sauvegarde d'un RAM disk ?  (Lu 3639 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 47 175
    • Twitter LaFibre.info
Script lancé à l'arrêt de Linux : Quid de sync pour la sauvegarde d'un RAM disk persistant ?

Je cherche a adapter mes scripts Optimisation d'un serveur Linux pour un SSD : réduire au maximum les écritures sur le SSD à systemd, pour upgrader vers Ubuntu 16.04

Pour Munin, je souhaite éviter que les fichiers .rrd et les images soient crées sur le disque dur, pour privilégier un ramdisque qui est sauvegardé.

Je pense que le plus propre est de mettre un script dans /lib/systemd/system-shutdown : Les scripts de ce dossiers sont executés avant d'éteindre le système, alors que les systèmes de fichiers sont déjà en read only :

#!/bin/sh
# Munin: Sauvegarde des fichiers du ramdisk /tmp/munin-rrd vers le SSD /root/munin-rrd.tar.lzop
mount -oremount,rw /
rm /root/munin-rrd.tar.lzop
cd /tmp
tar --lzop -cf /root/munin-rrd.tar.lzop munin-rrd
sync
mount -oremount,ro /
sleep 1
Note : /tmp est un ramdisque crée dans /etc/fstab avec tmpfs

Je me pose deux questions :

1/ Est-il nécessaire de faire un sync ? Si on passe un système de fichiers en read only, c'est fait à ce moment là ?

2/ Pour laisser le temps au cache intégré sur les disques, Linux attendrais une seconde avant d'éteindre une machine. Ce temps d'attente est-il executé avant ou après l’exécution des scripts de /lib/systemd/system-shutdown ?


A noter qu'au démarrage, pour la restauration du ramdisque persistant, je trouvé que le moyen le plus simple est la crontab avec le raccourci @reboot, en complétant le fichier /etc/cron.d/munin qui existe déjà et qui sert à lancer Munin toutes les 5 minutes.

echo "# Démarrage: Copie des fichiers du SSD /root/munin-rrd.tar.lzop vers le ramdisk /tmp/munin-rrd" >> /etc/cron.d/munin
echo "@reboot         root    cd /tmp ; tar --lzop -xf /root/munin-rrd.tar.lzop" >> /etc/cron.d/munin
echo "# Démarrage: Création du dossier pour les images, dans le ramdisk /tmp" >> /etc/cron.d/munin
echo "@reboot         munin   mkdir /tmp/munin-www ; chown munin:munin /tmp/munin-www" >> /etc/cron.d/munin

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 091
  • Paris (75)
cf http://docs.observium.org/persistent_ramdisk/ , la partie derniere partie notamment.
'.

vivien

  • Administrateur
  • *
  • Messages: 47 175
    • Twitter LaFibre.info
J'ai ce type de script avec Ubuntu 14.04 LTS et System V.

Mon problème viens du fait qu'Ubuntu 16.04 LTS utilise systemd à la place de System V.

La problématique est d’exécuter un script avant l'arrêt de Linux (le système dois attendre que ce script se termine pour s'éteindre et il ne dois pas killer le script).

Il me semble que le dossier /lib/systemd/system-shutdown est fait pour ça. Par contre les scripts de ce dossier s’exécutent à la fin de l’arrêt du système (c'est pas plus mal pour une sauvegarde) alors que les systèmes de fichiers sont déjà en read only.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 091
  • Paris (75)
tu peux écrire ton service systemd (il faut un .service qui décrive les dépendences et les actions stop et start)

t'as un exemple/tuto ici: https://erlhelinfotech.wordpress.com/2013/02/20/ramdisk-service-for-systemd/ que tu peux adapter avec tes scripts.

un plus complet ici: https://github.com/graysky2/anything-sync-daemon (d'ailleurs ce projet fait a peu près ce que tu veux ...au besoin tu peux l'installer et t'en servir directement sinon dans le dossier init t'as un exemple de .service).

zoc

  • Abonné Orange Fibre
  • *
  • Messages: 4 282
  • Antibes (06) / Mercury (73)
tu peux écrire ton service systemd (il faut un .service qui décrive les dépendences et les actions stop et start)
C'est ce que j'ai fait chez moi sur un 16.04 LTS, où j'ai mis les RRD d'Observium en ramdisk. Voir mon "persistent-ramdisk.service" ci-dessous. Attention, par contre, petite spécificité dans mon cas, observium tourne dans un container lxc, donc le ramdisk est restoré (par l'hote) juste avant que lxc ne démarre (à adapter selon le besoin, il faut modifier le paramètre "Before"). Après, pour le script "ramdisk.sh", c'est du classique comme tu as déjà pu le proposer dans un autre fil @vivien:
[Unit]
Description=RAM-Disk Manager
After=local-fs.target
Requires=local-fs.target
Before=lxc.service

[Install]
WantedBy=default.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/ramdisk.sh start
ExecStop=/usr/local/sbin/ramdisk.sh stop

vivien

  • Administrateur
  • *
  • Messages: 47 175
    • Twitter LaFibre.info
Merci pour les conseils, vous m'avez convaincu d'écrire mon service systemd.
Mon problème : rien ne s’exécute au démarrage.

J'ai crée un fichier /etc/systemd/system/munin-ramdisk.service qui s'occupe de restaurer le contenu du ramdisque et de le sauvegarder.
Il est exécuté au démarrage après local-fs.target, donc dès que le système de fichier est monté
Pour la sauvegarde, il est exécuté avant umount.target

[Unit]
Description=RAM disque persistant pour Munin
Requires=local-fs.target
RequiresMountsFor=/var/lib/munin
After=local-fs.target
Before=umount.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/chown munin:munin /var/lib/munin ; cd /var/lib ; /bin/tar --lzop -xf /root/munin-rrd.tar.lzop
ExecStop=/bin/rm /root/munin-rrd.tar.lzop ; cd /var/lib ; /bin/tar --lzop -cf /root/munin-rrd.tar.lzop munin

[Install]
WantedBy=default.target
je l'ai rendu exécutable (chmod +x /etc/systemd/system/munin-ramdisk.service)

Les log sont vides :
# journalctl -u munin-ramdisk.service
-- No entries --


Si je lance manuellement chown munin:munin /var/lib/munin ; cd /var/lib ; tar --lzop -xf /root/munin-rrd.tar.lzop , c'est ok

A noter que en ramdisque est crée dans /etc/fstab en rajoutant ces lignes :

# RamDisque pour Munin
tmpfs   /var/lib/munin          tmpfs   defaults,size=1500M  0 0

Hugues

  • AS2027 MilkyWan
  • Modérateur
  • *
  • Messages: 12 443
  • Lyon (69) / St-Bernard (01)
    • Twitter
tu l'as bien 'enable' au démarrage ?

Genre

hugues@saturn:~$ sudo systemctl enable dhclient
Created symlink from /etc/systemd/system/multi-user.target.wants/dhclient.service to /etc/systemd/system/dhclient.service.

Et un "service munin-ramdisk status" donne quoi ?

vivien

  • Administrateur
  • *
  • Messages: 47 175
    • Twitter LaFibre.info
Il n’apprécie pas d'avoir un "cd" dans les deux commandes ci-dessous :
ExecStart=/bin/chown munin:munin /var/lib/munin ; cd /var/lib ; /bin/tar --lzop -xf /root/munin-rrd.tar.lzop
ExecStop=/bin/rm /root/munin-rrd.tar.lzop ; cd /var/lib ; /bin/tar --lzop -cf /root/munin-rrd.tar.lzop munin


# systemctl status munin-ramdisk.service
● munin-ramdisk.service - RAM disque persistant pour Munin
   Loaded: loaded (/etc/systemd/system/munin-ramdisk.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

juil. 04 14:33:54 systemd[1]: [/etc/systemd/system/munin-ramdisk.service:11] Executable path is not absolute, ignoring: cd /var/lib ; /bin/tar --lzop -xf /root/munin-rrd.tar.
juil. 04 14:33:54 systemd[1]: [/etc/systemd/system/munin-ramdisk.service:12] Executable path is not absolute, ignoring: cd /var/lib

Je pense que la solution est de travailler avec un script externe...

Hugues

  • AS2027 MilkyWan
  • Modérateur
  • *
  • Messages: 12 443
  • Lyon (69) / St-Bernard (01)
    • Twitter
C'est moche d'utiliser cd dans un script de manière générale :)

vivien

  • Administrateur
  • *
  • Messages: 47 175
    • Twitter LaFibre.info
Sans les CD, cela marche parfaitement, sauvegarde et restauration.

Voici le fichier /etc/systemd/system/munin-ramdisk.service que j'utilise :
[Unit]
Description=RAM disque persistant pour Munin
Requires=local-fs.target
#RequiresMountsFor=/var/lib/munin
After=local-fs.target
Before=umount.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/chown munin:munin /var/lib/munin ; /bin/tar --lzop -xf /root/munin-rrd.tar.lzop -C /var/lib
ExecStop=/bin/rm /root/munin-rrd.tar.lzop ; /bin/tar --lzop -cf /root/munin-rrd.tar.lzop -C /var/lib munin

[Install]
WantedBy=default.target

Ne pas oublier un apt install lzop pour la prise en charge de cet algo de compression très rapide (il prend moins de CPU que gzip pour une compression équivalente)

zoc

  • Abonné Orange Fibre
  • *
  • Messages: 4 282
  • Antibes (06) / Mercury (73)
Et avec un
WorkingDirectory=/var/lib

Dans la section [Service] ?

Disponible à partir de systemd en version 227. La version distribuée avec Ubuntu 16.04 est la 229.


vivien

  • Administrateur
  • *
  • Messages: 47 175
    • Twitter LaFibre.info
J'ai mis l'option "-C" dans tar et cela fonctionne bien.

Je ne sais pas comment je me suis débrouillé, mais j'avais dans le passé testé ça dans tar et cela ne fonctionnait pas d'où les "cd" dans mes scripts.

Merci pour votre aide, c'est bien plus propre que ce je pensais faire au début.