GNU/Linux >> Tutoriels Linux >  >> Linux

Comment ajouter un message qui sera lu avec dmesg ?

Solution 1 :

Vous pouvez, en tant que root, écrire dans /dev/kmsg pour imprimer dans le tampon de messages du noyau :

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

J'ai testé cela sur mon serveur et sur un périphérique Linux intégré, et cela fonctionne sur les deux, donc je vais supposer que cela fonctionne à peu près partout.

Solution 2 :

dmesg affiche ce qui se trouve dans le tampon du noyau, alors que logger est pour syslogd . Je pense que si vous voulez imprimer des choses dans le tampon du noyau, vous devrez créer un pilote qui utilise le printk() fonction noyau. Si vous le voulez juste en /var/log/messages , puis avec une configuration "normale", je pense que ce que vous avez fait avec logger est déjà bien.

L'exemple le plus basique d'un pilote avec printk() serait :

bonjour.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

Ensuite :

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

http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 pour en savoir plus...

Solution 3 :

Basé sur le module de Kyle ci-dessus :


#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");

Pour faire un printk depuis l'espace utilisateur :

echo "Hello" > /proc/printk

Solution 4 :

La réponse de @Calandoa ne fonctionne plus pour Kernel +3.10. Combiné son code, et l'exemple de code que j'ai trouvé ici. Puis amélioration de la qualité du code...

Code enregistré dans 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);

Faire en utilisant ce 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

Solution 5 :

Basé sur la réponse de Kyle, voici un rapide tutoriel montrant comment faire exactement cela.


Linux
  1. Comment générer un fichier et ignorer les lignes commençant par "?" ?

  2. Comment ajouter automatiquement un compte utilisateur ET un mot de passe avec un script Bash ?

  3. Comment compter les lignes dans un document ?

  4. Comment construire un module de noyau Linux pour qu'il soit compatible avec toutes les versions du noyau ?

  5. Comment ajouter des utilisateurs à Linux via un script shell

Comment créer ou ajouter un index dans MySQL avec des exemples

Comment lire un fichier avec des espaces sous Linux

Comment ajouter un nouvel utilisateur MySQL avec des autorisations GRANT

Comment ajouter des appareils à surveiller avec ManageEngine OpManager

Comment ajouter un shebang # ! avec un script php sous linux?

Comment imprimer un message sur stderr dans Go ?