GNU/Linux >> Linux Esercitazione >  >> Linux

Come aggiungere un messaggio che verrà letto con dmesg?

Soluzione 1:

Puoi, come root, scrivere a /dev/kmsg per stampare nel buffer dei messaggi del kernel:

 fixnum:~# echo Some message > /dev/kmsg
 fixnum:~# dmesg | tail -n1
 [28078118.692242] Some message

L'ho testato sul mio server e su un dispositivo Linux integrato e funziona su entrambi, quindi presumo che funzioni praticamente ovunque.

Soluzione 2:

dmesg mostra cosa c'è nel buffer del kernel, mentre logger sta per syslogd . Penso che se vuoi stampare cose nel buffer del kernel dovrai creare un driver che usi il printk() funzione del kernel. Se lo vuoi solo in /var/log/messages , quindi con una configurazione "normale" penso a quello che hai fatto con logger va già bene.

L'esempio più semplice di un driver con printk() sarebbe:

ciao.c:

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
    printk(KERN_INFO "Hello world\n");
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world\n");

}

Makefile:

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

Quindi:

$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
 [7089996.746366] Hello world

http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 per ulteriori informazioni...

Soluzione 3:

Basato sul modulo di Kyle sopra:


#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>

static int pk_write(struct file *file, const char *buffer, unsigned long count, void *data)
{
        char string[256];
        count = count < 255 ? count : 255;

        if(copy_from_user(string, buffer, count))
                return -EFAULT;

        string[count] = '\0';        
        printk(string);
        return count;
}


static int __init printk_init(void)
{
        struct proc_dir_entry *pk_file;

        pk_file = create_proc_entry("printk", 0222, NULL);
        if(pk_file == NULL)
                return -ENOMEM;

        pk_file->write_proc = pk_write;
        pk_file->owner = THIS_MODULE;

        return 0;
}

static void __exit printk_cleanup(void)
{
        remove_proc_entry("printk", NULL);
}

module_init(printk_init);
module_exit(printk_cleanup);
MODULE_LICENSE("GPL");

Per eseguire un printk dallo spazio utente:

echo "Hello" > /proc/printk

Soluzione 4:

La risposta di @Calandoa non funziona più per Kernel +3.10. Combinato il suo codice e il codice di esempio che ho trovato qui. Poi migliorato la qualità del codice...

Codice salvato in printk_user.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>

static ssize_t write_proc(struct file *filep, const char *buffer, size_t count, loff_t *offsetp)
{
    char string[256];
    count = count < 255 ? count : 255;

    if(copy_from_user(string, buffer, count) != 0) {
        return -EFAULT;
    }

    string[count] = '\0';
    printk(string);
    return count;
}

static const struct file_operations proc_fops = {
    .owner = THIS_MODULE,
    .write = write_proc,
};

static int proc_init(void) {
    struct proc_dir_entry *proc_file;
    proc_file = proc_create("printk_user", 0, NULL, &proc_fops);

    if(proc_file == NULL) {
        return -ENOMEM;
    }

    return 0;
}

static void proc_cleanup(void) {
    remove_proc_entry("printk_user", NULL);
}

MODULE_LICENSE("GPL"); 
module_init(proc_init);
module_exit(proc_cleanup);

Usa questo Makefile

TARGET = printk_user
obj-m := $(TARGET).o

KERNEL_VERSION=$(shell uname -r)
KDIR = /lib/modules/$(KERNEL_VERSION)/build
PWD = $(shell pwd)

printk:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
    $(MAKE) -C $(KDIR) M=$(PWD) clean

Soluzione 5:

Sulla base della risposta di Kyle, ecco un breve tutorial che mostra come fare proprio questo.


Linux
  1. Aggiungi utente al gruppo in Linux, come farlo (con esempi)

  2. Come eseguire un comando che prevede il reindirizzamento o il piping con Sudo?

  3. Come generare file e ignorare le righe che iniziano con "?"?

  4. Come aggiungere utenti a Linux tramite uno script di shell

  5. Come aggiungere un messaggio che verrà letto con dmesg?

Come creare o aggiungere un indice in MySQL con esempi

Come leggere un file con spazi in Linux

Come aggiungere un nuovo utente MySQL con autorizzazioni GRANT

Come aggiungere dispositivi da monitorare con ManageEngine OpManager

Come posso stampare un messaggio su stderr in Go?

Come costruire un modulo del kernel Linux in modo che sia compatibile con tutte le versioni del kernel?