tag puddletag picard para musicbrainz mp3tag kid3 easytag linux logging linux-kernel kernel circular-buffer

linux - picard - puddletag



¿Cómo leer el buffer de anillo dentro del espacio del kernel de Linux? (2)

Esto está más allá de la muy buena respuesta de Pavan (me enseñó mucho):

Distintas distribuciones pueden 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 kernel, porque el kernel implementa su operación de búfer en anillo dentro 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 cola -f / proc / kmsg

Pero solo puede ver todos los mensajes generados DESPUÉS de que haya emitido este comando; no se imprimirán todos los mensajes anteriores en el búfer de anillo. Y para ver el resultado del archivo físico, puede buscar el usuario de "/ proc / kmsg":

sudo lsof | grep proc.kmsg

Y mi máquina indicó esto:

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, veamos 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 así que ahí está, pid 1743 es rsyslogd, y redirige la salida de / proc / kmsg a archivos como / var / log / syslog y /var/log/kern.log etc.

Estoy escribiendo un controlador de caracteres de Linux que puede imprimir registros del sistema en el espacio del usuario. Al igual que el comando ''dmesg'' hace. Me he enterado de que todo el registro que imprimimos con ''printk'' se enviará a un espacio llamado búfer de anillo. Así que tengo las preguntas:

  1. ¿Está el búfer de anillo dentro del espacio del kernel?
  2. Si es así, ¿cómo puedo leer el búfer de anillo dentro del espacio del kernel? (He intentado leer el código fuente de dmesg.c. Pero no ayudó.)

Lo que estás buscando es /proc/kmsg . Este es el búfer de anillo del núcleo!

  1. Sí, esto está dentro del espacio del kernel. ¡Cualquier proceso que intente leerlo debe tener privilegios de superusuario para leerlo!

  2. ¿Cómo leerlo el buffer de anillo? Aquí hay una hermosa ilustración de IBM Developerworks

dmesg sería su primer recurso! ¿Cómo cumple dmesg su tarea? Por una llamada a syslog() ! ¿Cómo hace syslog su trabajo? A través de la interfaz de llamada del sistema que a su vez llama a do_syslog() . do_syslog() hace el acto final como this .

Aquí hay algunos recursos más para obtener más información sobre /proc/kmsg y el 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