Как прочитать кольцевой буфер в пространстве ядра Linux? - PullRequest
18 голосов
/ 02 марта 2012

Я пишу драйвер символов для Linux, который может печатать системные журналы в пространстве пользователя. Так же, как и команда «dmesg». Я узнал, что весь журнал, который мы печатаем с помощью 'printk', будет отправлен в пространство с именем кольцевого буфера. Итак, у меня есть вопросы:

  1. Является ли кольцевой буфер внутри пространства ядра?
  2. Если так, как я могу прочитать кольцевой буфер внутри пространства ядра? (Я пытался прочитать исходный код dmesg.c. Но это не помогло.)

Ответы [ 2 ]

43 голосов
/ 02 марта 2012

То, что вы ищете, это /proc/kmsg. Это кольцевой буфер ядра!

  1. Да, это внутри пространства ядра. Любой процесс, пытающийся прочитать его, должен иметь права суперпользователя для чтения!

  2. Как прочитать это кольцевой буфер? Вот красивая иллюстрация от IBM Developerworks

Reading the Kernel Ring Buffer

dmesg будет вашим первым курортом! Как dmesg выполняет свою задачу? При звонке на syslog()! Как syslog выполняет свою работу? Через интерфейс системного вызова, который в свою очередь вызывает do_syslog(). do_syslog() выполняет отделочные работы как это .

Вот еще несколько ресурсов, чтобы получить больше информации о /proc/kmsg и общем журнале ядра -

  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

5 голосов
/ 11 декабря 2015

Это еще один очень хороший ответ Павана (многому меня научил):

Различные дистрибутивы могут перенаправлять вывод / proc / kmsg на любые физические файлы журналов или виртуальные устройства (/ dev / xxx), которые им нравятся. Но "/ proc / kmsg" является исходным источником журнала ядра, потому что ядро ​​реализует свою операцию кольцевого буфера внутри 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,
};

Итак, как вы видите вывод:

хвост sudo -f / proc / kmsg

Но вы можете видеть только все сообщения, сгенерированные ПОСЛЕ того, как вы выполнили эту команду - все предыдущие сообщения в кольцевом буфере не будут распечатаны. И поэтому, чтобы увидеть вывод физического файла, вы можете найти пользователя «/ proc / kmsg»:

sudo lsof | grep proc.kmsg

И моя машина указала это:

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

Так что теперь это pid 1743, давайте посмотрим файлы, открытые к 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

Итак, pid 1743 - это rsyslogd, и он перенаправляет вывод / proc / kmsg в такие файлы, как / var / log / syslog и /var/log/kern.log и т. Д.

...