Как добавить сообщение, которое будет прочитано с dmesg?

Я когда-то прочитал запись в блоге на этом URL, отправленном 13 июля 2009: http://www.mysqlperformanceblog.com/2009/07/13/what_problems_will_i_have_migrating_into_the_cloud/

Вот выборка от Точки № 1: инструменты Most High Availability (как MMM или DRBD+Heartbeat) работают над принципалом наличия плавающего IP-адреса, который используется, чтобы приложение соединилось с текущим ведущим устройством. С EC2 Вы не можете сделать этого.

Теперь, если это верно в некоторой степени, Вам, вероятно, придется реализовать некоторое циклическое выравнивание нагрузки в Вашем приложении для Записей DB к Вашим серверам MySQL в установке MultiMaster. Вы многие должны сделать это только для избегания рискованных действий.

Необходимо выглядеть глубже то, как выравнивание нагрузки EC2 работает.

Вы используете выравнивание нагрузки EC2 на своих ведомых устройствах чтения? Проверьте, что нагрузки серверов на тех работают в качестве ведомого устройства, чтобы удостовериться, что выравнивание нагрузки на самом деле происходит.

44
задан 10 May 2010 в 21:24
7 ответов

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

}

Make-файл:

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 для больше...

37
ответ дан 28 November 2019 в 19:40

На основе модуля Kyle выше:


#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
13
ответ дан 28 November 2019 в 19:40

Базирующийся прочь ответа Kyle, вот быстрое учебное руководство, показывающее, как сделать просто это.

3
ответ дан 28 November 2019 в 19:40

Вы можете как root записать в / dev / kmsg для печати в буфер сообщений ядра:

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

Я тестировал это на своем сервере и встроенном Устройство Linux, и оно работает на обоих, поэтому я просто предполагаю, что оно работает практически везде.

108
ответ дан 28 November 2019 в 19:40

@ Ответ Каландоа больше не работает для ядра +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
ответ дан 28 November 2019 в 19:40

Мне просто нужны быстрые отладочные сообщения в демоне, написанные кем-то другим в кросс-совместимом ядре. Я столкнулся с ошибкой компиляции при попытке использовать printk , так как не мог быть включен. Вместо того чтобы чрезмерно бороться с этим (чтобы сделать это правильно), я обманул и использовал следующий ленивый, но функциональный 5-минутный обходной путь:

void dmesg( const char *tag, const char *msg, const int len )
{
    const int TAG_LEN=3;
    char buffer[128]={0};
    memcpy( &buffer[0], tag, TAG_LEN );
    memcpy( &buffer[TAG_LEN], msg, len );
    int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
    write( fd_kmsg, &buffer, TAG_LEN+len );
    close( fd_kmsg );
}
void dmesgWarn(  const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
void dmesgInfo(  const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }
0
ответ дан 28 November 2019 в 19:40

Подумал, что я бы пошел дальше и включил полномасштабный пример чего-то, что люди могут просто скомпилировать и запустить для тех, кто не так хорошо разбирается в C, основываясь на ответе @BuvinJ

#include <stdio.h>
#include <string.h>
#include <fcntl.h> // open function
#include <unistd.h> // close function
#include "sys/syscall.h"


int main(); // Let's not worry about this for now

void dmesg( const char *tag, const char *msg, const int len )
{
    const int TAG_LEN=3;
    char buffer[128]={0};
    memcpy( &buffer[0], tag, TAG_LEN );
    memcpy( &buffer[TAG_LEN], msg, len );
    int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
    write( fd_kmsg, &buffer, TAG_LEN+len );
    close( fd_kmsg );
}
void dmesgWarn(  const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
void dmesgInfo(  const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }


int main(int argc, char **argv)
{
    int getmysize = strlen(argv[1]);
    printf("%d\n", getmysize);

    printf("To be written: %s\nSize of argument: %d\n", argv[1], getmysize);
    // dmesgWarn dmesgInfo or dmesgDebug
    dmesgDebug(argv[1], getmysize);
};

Для запуска сохраните указанное выше как kmsg.c и gcc kmsg.c -o kmsg; sudo ./kmsg «строка, которую вы хотите добавить в / dev / kmsg»

2
ответ дан 28 November 2019 в 19:40

Теги

Похожие вопросы