Как читать кольцевой буфер в пространстве ядра Linux?
Я пишу драйвер символов Linux, который может печатать системные журналы в пользовательском пространстве. Так же, как и команда dmesg.
Я узнал, что весь журнал, который мы печатаем с помощью "printk", будет отправлен в пространство с кольцевым буфером. Поэтому у меня есть вопросы:
- Является ли кольцевой буфер внутри пространства ядра?
- Если да, то как я могу прочитать кольцевой буфер внутри пространства ядра? (Я пытался прочитать исходный код dmesg.c. Но это не помогло.)
Ответы
Ответ 1
То, что вы ищете, это /proc/kmsg
. Это буфер кольцевого кольца!
-
Да, это внутри пространства ядра. Любой процесс, пытающийся прочитать его, должен иметь привилегии суперпользователя, чтобы прочитать его!
-
Как читать кольцевой буфер? Вот красивая иллюстрация от IBM Developerworks
![Reading the Kernel Ring Buffer]()
dmesg
станет вашим первым курортом! Как dmesg выполнить свою задачу? По вызову syslog()
! Как syslog выполнять свою работу? Через интерфейс системного вызова, который в свою очередь вызывает do_syslog()
. do_syslog()
делает финишный акт как this.
Вот еще несколько ресурсов, чтобы получить дополнительную информацию о /proc/kmsg
и общем запуске ядра -
Ответ 2
Это касается Павана очень хорошего ответа (многому научил меня):
Различные дистрибутивы могут перенаправлять вывод /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 tail -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, посмотрим файлы 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
Итак, вот вы, pid 1743 - rsyslogd, и перенаправляет вывод /proc/kmsg в файлы, такие как /var/log/syslog и/var/log/kern.log и т.д.