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
Why are Stein manifolds/spaces the analog of affine varieties/schemes in algebraic geometry?
How was Daenerys able to legitimise this character?
Is there a context where the expression `a.b::c` makes sense?
Dad jokes are fun
Manager questioning my time estimates for a project
Is superuser the same as root?
Shorten or merge multiple lines of `&> /dev/null &`
I know that there is a preselected candidate for a position to be filled at my department. What should I do?
Can I tell a prospective employee that everyone in the team is leaving?
How to patch glass cuts in a bicycle tire?
How do I get the ς (final sigma) symbol?
Dealing with spaghetti codebase, manager asks for things I can't deliver
Why does the hash of infinity have the digits of π?
Why is the Eisenstein ideal paper so great?
Is there any relationship between frequency of signal and distance it travels?
Why isn't 'chemically-strengthened glass' made with potassium carbonate to begin with?
What Armor Optimization applies to a Mithral full plate?
What are the conditions for RAA?
Should there be an "a" before "ten years imprisonment"?
What are Antecedent & Consequent Phrases in Music?
Drums and punctuation
Why did Drogon spare this character?
Can a person survive on blood in place of water?
Is it possible to remotely hack the GPS system and disable GPS service worldwide?
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
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
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 |
7 Answers
7
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/kmesg
as non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsg
notkmesg
but I also confuse withdmesg
which 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 |
Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer
#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("%dn", getmysize);
printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
// dmesgWarn dmesgInfo or dmesgDebug
dmesgDebug(argv[1], getmysize);
;
To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"
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
7 Answers
7
active
oldest
votes
7 Answers
7
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.9k1252104
26.9k1252104
answered May 10 '10 at 18:30
Kyle BrandtKyle Brandt
66.8k62265414
66.8k62265414
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/kmesg
as non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsg
notkmesg
but I also confuse withdmesg
which 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/kmesg
as non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsg
notkmesg
but I also confuse withdmesg
which 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,161273
1,161273
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/kmesg
as non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsg
notkmesg
but I also confuse withdmesg
which 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/kmesg
as non-root.
– wvdschel
Jul 4 '12 at 11:56
3
That works. Thanks, interesting. By the way, itskmsg
notkmesg
but I also confuse withdmesg
which 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 |
Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer
#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("%dn", getmysize);
printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
// dmesgWarn dmesgInfo or dmesgDebug
dmesgDebug(argv[1], getmysize);
;
To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"
add a comment |
Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer
#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("%dn", getmysize);
printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
// dmesgWarn dmesgInfo or dmesgDebug
dmesgDebug(argv[1], getmysize);
;
To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"
add a comment |
Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer
#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("%dn", getmysize);
printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
// dmesgWarn dmesgInfo or dmesgDebug
dmesgDebug(argv[1], getmysize);
;
To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"
Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer
#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("%dn", getmysize);
printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
// dmesgWarn dmesgInfo or dmesgDebug
dmesgDebug(argv[1], getmysize);
;
To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"
answered May 10 at 20:29
linuxgeeklinuxgeek
212
212
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 Mar 19 at 23:54
BuvinJBuvinJ
22918
22918
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