Comment lire ring buffer dans l'espace du noyau linux?

j'écris un pilote de caractères Linux qui peut imprimer des journaux système dans l'espace utilisateur. Tout comme la commande 'dmesg' ne. J'ai appris que tout le journal que nous imprimons avec 'printk' sera envoyé à un espace appelé ring buffer. Si j'ai des questions:

  1. est-ce que ring buffer est dans l'espace du noyau?
  2. si oui, comment puis-je lire le tampon de bague dans l'espace du noyau? (J'ai essayé de lire le code source de dmesg.c. Mais il n'a pas aidé.)
16
demandé sur Pavan Manjunath 2012-03-02 16:57:49

2 réponses

Ce que vous cherchez est /proc/kmsg. C'est le noyau de l'anneau de la mémoire tampon!

  1. Oui, c'est dans l'espace du noyau. Tout processus essayant de le lire devrait avoir des super privilèges d'utilisateur pour le lire!

  2. comment le lire le tampon annulaire? Voici une belle illustration D'IBM Developerworks

Reading the Kernel Ring Buffer

dmesg serait votre première station! Comment fonctionne dmesg accomplir sa tâche? Par un appel à syslog()! Comment fonctionne syslog faire son travail? Par l'intermédiaire de l'interface d'appel de système qui à son tour appel do_syslog(). do_syslog() la finition agir comme .

Voici quelques ressources pour vous plus d'infos sur /proc/kmsg et la journalisation du noyau général-

  1. http://www.makelinux.net/ldd3/chp-4-sect-2

  2. http://www.ibm.com/developerworks/linux/library/l-kernel-logging-apis/index.html

  3. http://oguzhanozmen.blogspot.in/2008/09/kernel-log-buffering-printk-syslog-ng.html

38
répondu Pavan Manjunath 2016-07-28 14:00:34

C'est-à-Pavan est très bonne réponse (m'a beaucoup appris):

une distribution différente peut rediriger la sortie de /proc/kmsg vers les fichiers journaux physiques ou les périphériques virtuels (/dev / xxx) qu'ils aiment. Mais "/ proc/kmsg" est la source originale du journal du noyau, parce que le noyau implémente son opération de tampon annulaire à l'intérieur de fs/proc / kmsg.c:

static const struct file_operations proc_kmsg_operations = {
        .read           = kmsg_read,
        .poll           = kmsg_poll,
        .open           = kmsg_open,
        .release        = kmsg_release,
        .llseek         = generic_file_llseek,
};

alors comment voyez-vous la sortie:

sudo tail-f / proc/kmsg

Mais vous ne pouvez voir tous les les messages générés après que vous ayez émis cette commande - tous les messages précédents dans le tampon de l'anneau ne seront pas imprimés. Et donc pour voir la sortie du fichier physique, vous pouvez rechercher l'utilisateur de "/ proc/kmsg":

sudo lsof / grep proc.kmsg

Et ma machine a indiqué ceci:

rsyslogd  1743               syslog    3r      REG                0,3          0 4026532041 /proc/kmsg
in:imuxso 1743 1755          syslog    3r      REG                0,3          0 4026532041 /proc/kmsg
in:imklog 1743 1756          syslog    3r      REG                0,3          0 4026532041 /proc/kmsg
rs:main   1743 1757          syslog    3r      REG                0,3          0 4026532041 /proc/kmsg

alors maintenant c'est le pid 1743, voyons les fichiers ouverts par fd 1743:

sudo ls-al / proc / 1743 / fd

lrwx------ 1 root   root   64 Dec 11 08:36 0 -> socket:[14472]
l-wx------ 1 root   root   64 Dec 11 08:36 1 -> /var/log/syslog
l-wx------ 1 root   root   64 Dec 11 08:36 2 -> /var/log/kern.log
lr-x------ 1 root   root   64 Dec 11 08:36 3 -> /proc/kmsg
l-wx------ 1 root   root   64 Dec 11 08:36 4 -> /var/log/auth.log

et voilà, le pid 1743 est rsyslogd, et il redirige la sortie de /proc /kmsg vers des fichiers comme/var/log /syslog et/var/log / kern.journal etc.

3
répondu Peter Teoh 2015-12-11 00:52:25