Question:
Comment puis-je réduire l'écriture dans les fichiers journaux
Frank Breitling
2017-02-26 17:21:27 UTC
view on stackexchange narkive permalink

Un souci commun des utilisateurs de Raspberry Pi est l ' usure et la destruction de leur carte SD (qui ont des cycles d'écriture limités) par trop d'écritures. L'expérience rapportée par les utilisateurs soutient cette hypothèse.

La journalisation est une source d'accès en écriture fréquent.

La question se pose donc de savoir comment cela peut être réduit sur Raspbian.

Vous pouvez déplacer l'emplacement des fichiers journaux sur un lecteur externe ou un lecteur flash, mais IMO, ces préoccupations sont exagérées.
* "L'expérience rapportée par les utilisateurs soutient cette hypothèse." * -> ** Seulement s'ils sont dénués de raison. ** Internet regorge de rapports hystériques de personnes hystériques. Bigfoot! OVNIS! La journalisation a détruit ma carte SD! Etc. Veuillez consulter http://unix.stackexchange.com/a/84905/25985
Ce qui m'inquiète plus, en tant que personne qui tire souvent la fiche, est de savoir que rien n'écrira sur la carte SD lorsque je tirera sur le cordon.
@SteveRobillard @goldilocks Plus que trop d'écritures, c'est la perte de puissance inattendue; ce n'est peut-être pas le point culminant des dommages sd mais, juste au cas où, je fais toujours un "arrêt maintenant" et plus de corruption SD.
@goldilocks Je suis sceptique quant à votre calcul. Cela semble assez optimiste. Jetez un œil à [celui-ci détaillé] (http://stackoverflow.com/a/24360304/2235831). > «De cette façon, l'enregistrement toutes les 10 minutes [...] ce sera bon pendant 20 000 ans ... Le calcul ci-dessus suppose un nivellement parfait de l'usure et un système de fichiers très efficace. (ce qui n'est pas le cas) «Bien sûr, cela peut être gâché assez facilement», par exemple si la carte est pleine, etc. La dégradation peut alors être de plusieurs ordres de grandeur plus rapide.
Je suis d'accord que c'est hyperbolique - mais je pense que c'est explicite. Cette chape est une antitoxine. Le fait est que la * grande majorité * des utilisateurs n'ont pas à s'inquiéter à ce sujet. Les gens ne devraient pas considérer qu'il est correct et normal de fonctionner avec un système de fichiers racine complètement rempli sur un pi, leur ordinateur portable, un serveur inet, etc. par défaut, ext fs a réservé 5% pour une utilisation root uniquement pour aider à atténuer cela. Donc, en réalité, vous parlez de ** cas de coin **, et ce que j'ai ici, c'est que vous l'avez présenté comme s'il devait être considéré comme un problème par tout citoyen conscient de lui-même. * Non, ça ne devrait pas. *
Cela dépend de l'application. Par exemple, j'utilise un Pi avec Apache et PHP pour contrôler et tester la machine. Le navigateur intégré actualise constamment la page d'affichage avec l'état (compteurs, température, etc.), ce qui se fait via des appels ajax à des programmes PHP. Chaque actualisation ajoute une ligne au fichier access.log. En fonction du taux de rafraîchissement, cela peut être beaucoup d'écritures. Et l'appareil est allumé en permanence.
Cinq réponses:
#1
+12
joan
2017-02-26 17:33:33 UTC
view on stackexchange narkive permalink

Si vous n'êtes pas intéressé par les journaux, vous pouvez en désactiver beaucoup en utilisant un paramètre de configuration de journal.

Modifiez le fichier /etc/rsyslog.conf et juste après le section commençant

  ################## RULES ################# #  

ajoutez la ligne suivante.

  *. * ~  

Si vous voulez être plus fin- grainé, vous devrez lire les commentaires du fichier.

N'oubliez pas de redémarrer le démon rsyslog:

  sudo service rsyslog restart  
Solution simple et propre. J'ai commenté tout ce qui écrit dans / var / out. Cela * devrait * fonctionner.
Mais je suis intéressé par les logs. Ils sont très importants pour trouver les problèmes du système!
Si vous êtes intéressé par les journaux, il existe de nombreuses approches pour les conserver, tout en évitant les écritures SD. Envoyez les journaux à / dev / shm (RAM), puis exécutez logrotate toutes les 300 secondes et envoyez les journaux à Amazon S3. Ou Dropbox. N'oubliez pas que les journaux ont une valeur LIMITÉE qui diminue avec le temps. Vous n'avez souvent vraiment besoin que de journaux actualisés et opportuns ...
#2
+9
Frank Breitling
2017-02-26 19:22:00 UTC
view on stackexchange narkive permalink

Ma solution pour Raspbian 8.0 (Jessie) basée sur la connexion à la RAM

Il existe déjà le paquet Ramlog Debian et les instructions d'installation pour cela. Cependant, cela n'a pas fonctionné pour moi (Démarrage de ramlog-tmpfs 2.0.0: Erreur: / var / log est en cours d'utilisation ... [échec]).

Utilisation de iotop -bktoqqq J'ai trouvé les accès en écriture les plus fréquents. Il s'avère que aussi / var / cache / samba / est fréquemment écrit dans. Donc, cela doit également aller dans la RAM en plus de / var / tmp / où les nouveaux fichiers journaux seront.

1. Création du disque virtuel

Donc, tout d'abord, ces deux entrées doivent être ajoutées à / etc / fstab :

  tmpfs / var / tmp tmpfs size = 10M, nodev, nosuid 0 0tmpfs / var / cache / samba tmpfs size = 5M, nodev, nosuid 0 0  

2. Le script log2disk

Nous devons enregistrer ce script dans / usr / local / bin / log2disk qui ajoutera et supprimera le contenu de tous les fichiers journaux dans / var / tmp / log / aux fichiers dans /var/log/.

  #! / bin / sh # Auteur: Frank Breitling <frank.breitling @ gmx.de>DESC = "Déplacement du contenu de / var / tmp / log / vers / var / log /" if [$ (id -u) -ne 0] then echo "Veuillez exécuter en tant que root" exitfiecho $ DESCexec >> / var / log /log2disk.log 2>&1datecd / var / tmp / pour i dans le journal / *; faire basename $ i cat $ i >> / var / $ i > $ idone  

et le rendre exécutable sudo chmod + x / usr / local / bin / log2disk .

3. Ajout à crontab

Nous voulons exécuter ce script toutes les 3 heures et ajouter cette ligne au /etc/crontab

  10 * / 3 * * * root / usr / local / bin / log2disk  

(N'oubliez pas une dernière nouvelle ligne qui est nécessaire à crontab.)

4. Installation de log2disk.service

Nous devons créer un service systemd dans /lib/systemd/system/log2disk.service qui exécute ce script avant l'arrêt et le redémarrage, afin que le contenu du fichier journal soit préservé:

  [Unit] Description = Ecrire les fichiers journaux sur diskRequiresMountsFor = / Before = rsyslog.service [Service] Type = oneshotRemainAfterExit = trueExecStart = / bin / trueExecStop = / usr / local / bin / log2disk [Install] WantedBy = multi-user.target  

et installez-le avec sudo systemctl enable log2disk .

5. Sélection des fichiers journaux pour la RAM

Nous pouvons maintenant dire à /etc/rsyslog.conf quels fichiers journaux conserver dans la RAM. Ces fichiers sont auth.log, syslog, daemon.log, user.log et messages et nous remplaçons pour chacune de leurs entrées le chemin log / par tmp / log / par exemple comme ceci:

  auth, authpriv. * /var/tmp/log/auth.log  

Done!

Après un redémarrage, le système enregistrera désormais les entrées de journal les plus fréquentes dans / var / tmp / log et les synchronisera toutes les 3 heures et avant l'arrêt.

Nous pouvons à nouveau utiliser iotop pour trouver une activité d'écriture considérablement réduite. Cependant, nous ne devons pas nous inquiéter du voyant vert ACT clignotant. Apparemment, ce n'est pas un bon indicateur d'accès en écriture.

* "J'ai élaboré la solution suivante pour Raspbian 8.0 (Jessie) basée sur l'idée de se connecter à la RAM." * -> Vu comment Jessie est basé sur systemd, il y a déjà quelques lignes de configuration modifiées de cela via journald. Jetez un œil à `man journald.conf` et notez` Storage = volatile`, etc. Ensuite, il suffit de * désactiver * rsyslog (il est alimenté par journald maintenant de toute façon) et, de toute façon, l'enregistrement basé sur la RAM avec beaucoup de cloches et de sifflets et d'options de personnalisation . Sans aucun problème.
@goldilocks Je me demande comment cela pourrait être utile pour créer un tel tampon de fichier journal que j'ai créé.
Je ne sais pas ce que tu veux dire. TBH Je ne suis pas un fan de journald (principalement à cause du format binaire), et la raison pour laquelle j'en sais beaucoup à ce sujet est que c'est ce que je fais avec - désactiver la journalisation sur le disque (et laisser cela à rsyslog), et donnez-lui une quantité modeste de RAM à utiliser comme tampon. Si vous voulez le vider périodiquement sur le disque, je ne vois pas pourquoi.
@goldilocks Alors comment?
Si vous ne l'avez jamais utilisé, vous devriez jeter un œil à `man journalctl`. Comme je l'ai dit, je suis un gars syslog à l'ancienne, mais je remarque qu'il y a un commutateur `-s --since`; alors vous devez juste l'obtenir pour le vider d'une manière appropriée à la redirection vers un fichier (cela peut ne pas arriver par défaut ... si vous jouez un peu, vous aurez l'image).
@goldilocks Cela semble assez vague et pour être honnête, je n'ai aucune idée de ce dont vous parlez. Mais généralement, il s'avère que les choses ne sont pas aussi simples que vous le pensez.
#3
+2
CoderX
2017-05-28 22:37:33 UTC
view on stackexchange narkive permalink

La façon dont je contourne cela est d'installer mon répertoire racine sur une clé USB au lieu de la carte SD. J'utilise la carte SD uniquement pour le démarrage.

Cela m'évite d'avoir à me soucier des écritures sur ma carte SD.

J'utilise berryboot pour y parvenir.

#4
  0
Fabian
2018-01-31 01:26:34 UTC
view on stackexchange narkive permalink

Pour réduire les opérations d'écriture de fichiers journaux sur le RPi, vous pouvez configurer un serveur de journaux centralisé avec rsyslog. Si vous souhaitez conserver les entrées, envoyez simplement les messages au serveur de journalisation distant, sinon à / dev / null.

#5
  0
Nick Painter
2019-06-01 03:03:45 UTC
view on stackexchange narkive permalink

Plutôt que de modifier rsyslog.conf, vous pouvez simplement arrêter le service si vous souhaitez éliminer tous les journaux.

  sudo service rsyslog stop  

Ensuite, vous pouvez le désactiver au démarrage:

  sudo systemctl disable rsyslog  

pour le réactiver au démarrage:

  sudo systemctl activer rsyslog  
Mais cela arrête toute journalisation.
Vous avez oublié de préfixer les commandes avec `sudo`. Si vous utilisez `systemctl`, vous devez également l'utiliser pour arrêter un service avec` sudo systemctl stop rsyslog.service`.
Très bon retour. J'ai mis à jour cette réponse pour refléter ces deux commentaires.
BTW si vous copiez la réponse de quelqu'un d'autre, il est généralement poli de la référencer. Ici, je vais le faire pour vous: https://stackoverflow.com/a/32553762/4453048


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...