Řešení 1:
Jako root můžete zapisovat do /dev/kmsg
pro tisk do vyrovnávací paměti zpráv jádra:
fixnum:~# echo Some message > /dev/kmsg
fixnum:~# dmesg | tail -n1
[28078118.692242] Some message
Testoval jsem to na svém serveru a vestavěném linuxovém zařízení a funguje to na obou, takže budu předpokládat, že to funguje téměř všude.
Řešení 2:
dmesg
zobrazuje, co je ve vyrovnávací paměti jádra, zatímco logger
je pro syslogd
. Myslím, že pokud chcete tisknout věci do vyrovnávací paměti jádra, budete muset vytvořit ovladač, který používá printk()
funkce jádra. Pokud to chcete jen v /var/log/messages
, pak s "normálním" nastavením myslím to, co jste udělali s logger
už je v pořádku.
Nejzákladnější příklad ovladače s printk()
by bylo:
ahoj.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
Potom:
$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
[7089996.746366] Hello world
http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 více...
Řešení 3:
Na základě Kyleova modulu výše:
#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");
Chcete-li provést printk z uživatelského prostoru:
echo "Hello" > /proc/printk
Řešení 4:
Odpověď @Calandoa již nefunguje pro jádro +3.10. Zkombinoval jeho kód a ukázkový kód, který jsem našel zde. Pak se zlepšila kvalita kódu...
Kód byl uložen na 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);
Použijte tento 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
Řešení 5:
Na základě Kyleovy odpovědi je zde rychlý návod, jak to udělat.