2012-03-02 16 views
15

Estoy escribiendo un controlador de caracteres Linux que puede imprimir registros del sistema en el espacio del usuario. Tal como lo hace el comando 'dmesg'. He aprendido que todo el registro que imprimimos con 'printk' se enviará a un espacio llamado buffer de anillo. Entonces tengo las preguntas:¿Cómo se lee el búfer de anillo dentro del espacio del kernel de Linux?

  1. ¿Hay memoria intermedia dentro del espacio del núcleo?
  2. Si es así, ¿cómo puedo leer el buffer de anillo dentro del espacio del núcleo? (He intentado leer el código fuente de dmesg.c. Pero no ayudó.)

Respuesta

37

Lo que estás buscando es /proc/kmsg. Este es el buffer del anillo kernel!

  1. Sí, esto es dentro de kernel space. ¡Cualquier proceso que intente leerlo debería tener privilegios de superusuario para leerlo!

  2. ¿Cómo leerlo? Aquí es un hermoso ejemplo de IBM developerWorks

Reading the Kernel Ring Buffer

dmesg sería su primer complejo! ¿Cómo cumple dmesg su tarea? ¡Llamando al syslog()! ¿Cómo hace el syslog su trabajo? A través de la interfaz de llamada del sistema, que a su vez llama al do_syslog(). do_syslog() hace el acto de acabado como this.

Éstos son algunos más recursos para obtener más información sobre /proc/kmsg y registro del núcleo en general-

  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

+0

¡Increíble! ¡Respuesta muy profesional y útil! Ya ves, soy un recién llegado para la Programación Kernel de Linux, no puedo apreciar más tu ayuda. Gracias hombre. –

+0

Me alegro de poder ayudarte :) ¡Bienvenido a SO! –

1

Esto es además de la muy buena respuesta de Pavan (me enseñó mucho):

Diferente distribución puede redirigir la salida de/proc/kmsg a cualquier archivo de registro físico o dispositivo virtual (/ dev/xxx) que les guste. Pero "/ proc/kmsg" es la fuente original del registro del núcleo, debido a que el núcleo de poner en práctica su funcionamiento búfer de anillo interior 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, 
}; 

Entonces, ¿cómo ves la salida es la siguiente:

sudo tail-f/proc/kmsg

Pero sólo se puede ver todos los mensajes generados DESPUÉS de haber emitido este comando - todos los mensajes anteriores en la memoria cíclica no se imprimen. Y para ver la salida del archivo físico, puede buscar el usuario de "/ proc/kmsg":

sudo lsof | grep proc.kmsg

Y mi máquina indicaron lo siguiente:

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 

Así que ahora es pid 1743, vamos a ver los archivos fd abiertos por 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 

y esto es todo, pid 1743 se rsyslogd, y redirigir la salida de/proc/kmsg de archivos como/var/log/syslog y /var/log/kern.log etc.

Cuestiones relacionadas