GNU/Linux >> Linux の 問題 >  >> Linux

dmesgで読むメッセージを追加するには?

解決策 1:

root として /dev/kmsg に書き込むことができます カーネル メッセージ バッファに出力するには:

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

サーバーと組み込み Linux デバイスでこれをテストしましたが、両方で動作するので、ほぼどこでも動作すると仮定します。

解決策 2:

dmesg logger に対して、カーネル バッファーの内容を表示します。 syslogd 用です .カーネル バッファに出力したい場合は、printk() を使用するドライバを作成する必要があると思います。 カーネル関数。 /var/log/messagesでそれが欲しいだけなら 、次に「通常の」セットアップで、 logger で何をしたと思いますか

printk() のドライバーの最も基本的な例

hello.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");

}

メイクファイル:

obj-m += hello.o

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

次に:

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

http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 詳しくは...

解決策 3:

上記のカイルのモジュールに基づく:


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

ユーザー空間から printk を実行するには:

echo "Hello" > /proc/printk

解決策 4:

@Calandoaの回答は、カーネル+3.10では機能しなくなりました。彼のコードと、ここで見つけたサンプルコードを組み合わせました。その後、コードの品質が向上しました...

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

この 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

解決策 5:

Kyle の回答に基づいて、これを行う方法を示す簡単なチュートリアルを次に示します。


Linux
  1. Linuxのグループにユーザーを追加する方法(例を含む)

  2. Linuxツール:dmesgを使用してメッセージを出力する

  3. Yumリポジトリを追加する方法

  1. Wgetが使用するリスト内のファイルの名前を具体的に変更するにはどうすればよいですか?

  2. / var / mailから一度に1つのメッセージを読む方法は?

  3. 数文字の長さの区切り文字で並べ替える方法は?

  1. ドキュメントの行数を数えるには?

  2. Goでstderrにメッセージを出力するにはどうすればよいですか?

  3. シェル スクリプトを使用して Linux にユーザーを追加する方法