How to add message that will be read with dmesg?Why is Syslog Not Writing Logs To The Designated Files?Linux...
Can you take a "free object interaction" while incapacitated?
Trouble reading roman numeral notation with flats
Why do Radio Buttons not fill the entire outer circle?
Could a welfare state co-exist with mega corporations?
Output visual diagram of picture
Air travel with refrigerated insulin
python displays `n` instead of breaking a line
Writing in a Christian voice
How to test the sharpness of a knife?
Pre-Employment Background Check With Consent For Future Checks
Did I make a mistake by ccing email to boss to others?
categorizing a variable turns it from insignificant to significant
Do native speakers use "ultima" and "proxima" frequently in spoken English?
Was Woodrow Wilson really a Liberal?
Why can't I get pgrep output right to variable on bash script?
When is the exact date for EOL of Ubuntu 14.04 LTS?
What is the tangent at a sharp point on a curve?
Highest stage count that are used one right after the other?
Is there a distance limit for minecart tracks?
A seasonal riddle
What properties make a magic weapon befit a Rogue more than a DEX-based Fighter?
What (if any) is the reason to buy in small local stores?
Strange behavior in TikZ draw command
Are hand made posters acceptable in Academia?
How to add message that will be read with dmesg?
Why is Syslog Not Writing Logs To The Designated Files?Linux Centos with dmesg timestampBusy Debian server (Xen guest) seems to go to sleep (energy saving mode)QEMU: Solaris 11 / Sparc64 Guest on Linux / X86-64 HostAppArmor - root: “You do not have enough privilege to read the profile set.”How to disable perf subsystem in Linux kernel?Poor performance with Linux software raid-10Running dmesg on Docker results in “dmesg: read kernel buffer failed: Permission denied”How to use wget with redirect and long URL?Prevent kernel messages from appearing in dmesg
I am trying to write some custom messages in my dmesg output. I tried:
logger "Hello"
but this does not work. It exits without error, but no "Hello" appears int the output of:
dmesg
I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.
Any idea?
linux syslog dmesg
add a comment |
I am trying to write some custom messages in my dmesg output. I tried:
logger "Hello"
but this does not work. It exits without error, but no "Hello" appears int the output of:
dmesg
I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.
Any idea?
linux syslog dmesg
add a comment |
I am trying to write some custom messages in my dmesg output. I tried:
logger "Hello"
but this does not work. It exits without error, but no "Hello" appears int the output of:
dmesg
I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.
Any idea?
linux syslog dmesg
I am trying to write some custom messages in my dmesg output. I tried:
logger "Hello"
but this does not work. It exits without error, but no "Hello" appears int the output of:
dmesg
I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.
Any idea?
linux syslog dmesg
linux syslog dmesg
asked May 10 '10 at 18:24
calandoacalandoa
7002814
7002814
add a comment |
add a comment |
6 Answers
6
active
oldest
votes
dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.
The most basic example of a driver with printk() would be:
hello.c:
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Hello worldn");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye worldn");
}
Makefile:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Then:
$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
[7089996.746366] Hello world
http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...
I got an error, since you have put spaces before themake -C ...in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.
– Wilf
Jul 11 '14 at 18:17
add a comment |
You can, as root, write to /dev/kmsg to print to the kernel message buffer:
fixnum:~# echo Some message > /dev/kmsg
fixnum:~# dmesg | tail -n1
[28078118.692242] Some message
I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.
1
Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.
– dotancohen
Jun 30 '12 at 8:53
15
Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try runningecho Some message | sudo tee /dev/kmesgas non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsgnotkmesgbut I also confuse withdmesgwhich has the e!
– dotancohen
Jul 4 '12 at 14:55
4
Much easier than compiling kernel module
– e271p314
Mar 3 '14 at 9:22
add a comment |
Based on Kyle's module above:
#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] = '';
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");
To do a printk from user space:
echo "Hello" > /proc/printk
1
This works for Linux kernel < 3.10 only. See my answer for a newer alternative.
– kevinf
Nov 25 '15 at 21:00
add a comment |
@Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...
Code saved to 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] = '';
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);
Make using this 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
add a comment |
Based off of Kyle's answer, here is a quick tutorial showing how to do just that.
add a comment |
I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:
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 ); }
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "2"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fserverfault.com%2fquestions%2f140354%2fhow-to-add-message-that-will-be-read-with-dmesg%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.
The most basic example of a driver with printk() would be:
hello.c:
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Hello worldn");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye worldn");
}
Makefile:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Then:
$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
[7089996.746366] Hello world
http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...
I got an error, since you have put spaces before themake -C ...in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.
– Wilf
Jul 11 '14 at 18:17
add a comment |
dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.
The most basic example of a driver with printk() would be:
hello.c:
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Hello worldn");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye worldn");
}
Makefile:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Then:
$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
[7089996.746366] Hello world
http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...
I got an error, since you have put spaces before themake -C ...in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.
– Wilf
Jul 11 '14 at 18:17
add a comment |
dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.
The most basic example of a driver with printk() would be:
hello.c:
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Hello worldn");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye worldn");
}
Makefile:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Then:
$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
[7089996.746366] Hello world
http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...
dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.
The most basic example of a driver with printk() would be:
hello.c:
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Hello worldn");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye worldn");
}
Makefile:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Then:
$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
[7089996.746366] Hello world
http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...
edited May 4 '15 at 20:01
kasperd
26.7k1251104
26.7k1251104
answered May 10 '10 at 18:30
Kyle Brandt♦Kyle Brandt
66.2k61263412
66.2k61263412
I got an error, since you have put spaces before themake -C ...in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.
– Wilf
Jul 11 '14 at 18:17
add a comment |
I got an error, since you have put spaces before themake -C ...in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.
– Wilf
Jul 11 '14 at 18:17
I got an error, since you have put spaces before the
make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.– Wilf
Jul 11 '14 at 18:17
I got an error, since you have put spaces before the
make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.– Wilf
Jul 11 '14 at 18:17
add a comment |
You can, as root, write to /dev/kmsg to print to the kernel message buffer:
fixnum:~# echo Some message > /dev/kmsg
fixnum:~# dmesg | tail -n1
[28078118.692242] Some message
I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.
1
Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.
– dotancohen
Jun 30 '12 at 8:53
15
Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try runningecho Some message | sudo tee /dev/kmesgas non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsgnotkmesgbut I also confuse withdmesgwhich has the e!
– dotancohen
Jul 4 '12 at 14:55
4
Much easier than compiling kernel module
– e271p314
Mar 3 '14 at 9:22
add a comment |
You can, as root, write to /dev/kmsg to print to the kernel message buffer:
fixnum:~# echo Some message > /dev/kmsg
fixnum:~# dmesg | tail -n1
[28078118.692242] Some message
I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.
1
Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.
– dotancohen
Jun 30 '12 at 8:53
15
Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try runningecho Some message | sudo tee /dev/kmesgas non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsgnotkmesgbut I also confuse withdmesgwhich has the e!
– dotancohen
Jul 4 '12 at 14:55
4
Much easier than compiling kernel module
– e271p314
Mar 3 '14 at 9:22
add a comment |
You can, as root, write to /dev/kmsg to print to the kernel message buffer:
fixnum:~# echo Some message > /dev/kmsg
fixnum:~# dmesg | tail -n1
[28078118.692242] Some message
I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.
You can, as root, write to /dev/kmsg to print to the kernel message buffer:
fixnum:~# echo Some message > /dev/kmsg
fixnum:~# dmesg | tail -n1
[28078118.692242] Some message
I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.
answered Feb 23 '12 at 14:47
wvdschelwvdschel
1,141273
1,141273
1
Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.
– dotancohen
Jun 30 '12 at 8:53
15
Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try runningecho Some message | sudo tee /dev/kmesgas non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsgnotkmesgbut I also confuse withdmesgwhich has the e!
– dotancohen
Jul 4 '12 at 14:55
4
Much easier than compiling kernel module
– e271p314
Mar 3 '14 at 9:22
add a comment |
1
Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.
– dotancohen
Jun 30 '12 at 8:53
15
Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try runningecho Some message | sudo tee /dev/kmesgas non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsgnotkmesgbut I also confuse withdmesgwhich has the e!
– dotancohen
Jul 4 '12 at 14:55
4
Much easier than compiling kernel module
– e271p314
Mar 3 '14 at 9:22
1
1
Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.
– dotancohen
Jun 30 '12 at 8:53
Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.
– dotancohen
Jun 30 '12 at 8:53
15
15
Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running
echo Some message | sudo tee /dev/kmesg as non-root.– wvdschel
Jul 4 '12 at 11:56
Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running
echo Some message | sudo tee /dev/kmesg as non-root.– wvdschel
Jul 4 '12 at 11:56
3
3
That works. Thanks, interesting. By the way, its
kmsg not kmesg but I also confuse with dmesg which has the e!– dotancohen
Jul 4 '12 at 14:55
That works. Thanks, interesting. By the way, its
kmsg not kmesg but I also confuse with dmesg which has the e!– dotancohen
Jul 4 '12 at 14:55
4
4
Much easier than compiling kernel module
– e271p314
Mar 3 '14 at 9:22
Much easier than compiling kernel module
– e271p314
Mar 3 '14 at 9:22
add a comment |
Based on Kyle's module above:
#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] = '';
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");
To do a printk from user space:
echo "Hello" > /proc/printk
1
This works for Linux kernel < 3.10 only. See my answer for a newer alternative.
– kevinf
Nov 25 '15 at 21:00
add a comment |
Based on Kyle's module above:
#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] = '';
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");
To do a printk from user space:
echo "Hello" > /proc/printk
1
This works for Linux kernel < 3.10 only. See my answer for a newer alternative.
– kevinf
Nov 25 '15 at 21:00
add a comment |
Based on Kyle's module above:
#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] = '';
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");
To do a printk from user space:
echo "Hello" > /proc/printk
Based on Kyle's module above:
#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] = '';
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");
To do a printk from user space:
echo "Hello" > /proc/printk
answered May 11 '10 at 9:34
calandoacalandoa
7002814
7002814
1
This works for Linux kernel < 3.10 only. See my answer for a newer alternative.
– kevinf
Nov 25 '15 at 21:00
add a comment |
1
This works for Linux kernel < 3.10 only. See my answer for a newer alternative.
– kevinf
Nov 25 '15 at 21:00
1
1
This works for Linux kernel < 3.10 only. See my answer for a newer alternative.
– kevinf
Nov 25 '15 at 21:00
This works for Linux kernel < 3.10 only. See my answer for a newer alternative.
– kevinf
Nov 25 '15 at 21:00
add a comment |
@Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...
Code saved to 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] = '';
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);
Make using this 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
add a comment |
@Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...
Code saved to 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] = '';
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);
Make using this 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
add a comment |
@Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...
Code saved to 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] = '';
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);
Make using this 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
@Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...
Code saved to 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] = '';
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);
Make using this 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
answered Nov 25 '15 at 20:59
kevinfkevinf
17116
17116
add a comment |
add a comment |
Based off of Kyle's answer, here is a quick tutorial showing how to do just that.
add a comment |
Based off of Kyle's answer, here is a quick tutorial showing how to do just that.
add a comment |
Based off of Kyle's answer, here is a quick tutorial showing how to do just that.
Based off of Kyle's answer, here is a quick tutorial showing how to do just that.
answered May 10 '10 at 18:35
TCampbellTCampbell
1,8941212
1,8941212
add a comment |
add a comment |
I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:
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 ); }
add a comment |
I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:
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 ); }
add a comment |
I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:
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 ); }
I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:
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 ); }
answered 16 mins ago
BuvinJBuvinJ
20918
20918
add a comment |
add a comment |
Thanks for contributing an answer to Server Fault!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fserverfault.com%2fquestions%2f140354%2fhow-to-add-message-that-will-be-read-with-dmesg%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown