GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menambahkan pesan yang akan dibaca dengan dmesg?

Solusi 1:

Anda dapat, sebagai root, menulis ke /dev/kmsg untuk mencetak ke buffer pesan kernel:

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

Saya telah menguji ini di server saya dan perangkat Linux tersemat, dan berfungsi di keduanya, jadi saya akan menganggap ini berfungsi hampir di semua tempat.

Solusi 2:

dmesg menampilkan apa yang ada di buffer kernel, sedangkan logger adalah untuk syslogd . Saya pikir jika Anda ingin mencetak sesuatu ke dalam buffer kernel, Anda perlu membuat driver yang menggunakan printk() fungsi kernel. Jika Anda hanya menginginkannya di /var/log/messages , lalu dengan pengaturan "normal", saya pikir apa yang telah Anda lakukan dengan logger sudah baik-baik saja.

Contoh paling dasar dari driver dengan printk() akan menjadi:

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

Lalu:

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

http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 untuk selengkapnya...

Solusi 3:

Berdasarkan modul Kyle di atas:


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

Untuk melakukan printk dari ruang pengguna:

echo "Hello" > /proc/printk

Solusi 4:

Jawaban @Calandoa tidak lagi berfungsi untuk Kernel +3.10. Menggabungkan kodenya, dan kode contoh yang saya temukan di sini. Kemudian tingkatkan kualitas kode...

Kode disimpan ke 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);

Buat menggunakan Makefile ini

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

Solusi 5:

Berdasarkan jawaban Kyle, berikut adalah tutorial singkat yang menunjukkan cara melakukannya.


Linux
  1. Bagaimana cara menambahkan akun pengguna DAN kata sandi secara otomatis dengan skrip Bash?

  2. Bagaimana cara menghitung baris dalam dokumen?

  3. Bagaimana cara menambahkan shebang #! dengan skrip php di linux?

  1. Tambahkan Pengguna ke Grup di Linux, Bagaimana Melakukannya (Dengan Contoh)

  2. Cara menambahkan pengguna ke Linux melalui skrip shell

  3. Bagaimana cara menambahkan pesan yang akan dibaca dengan dmesg?

  1. Alat Linux:Menyampaikan pesan dengan dmesg

  2. Bagaimana cara menambahkan repositori Yum

  3. Bagaimana Cara Mengeluarkan File &Mengabaikan Baris Yang Dimulai Dengan "?"?