1KLOGD(8)                  Linux System Administration                 KLOGD(8)
2
3
4

NAME

6       klogd - Kernel Log Daemon
7

SYNOPSIS

9       klogd  [ -c n ] [ -d ] [ -f fname ] [ -iI ] [ -n ] [ -o ] [ -p ] [ -s ]
10       [ -k fname ] [ -v ] [ -x ] [ -2 ]
11

DESCRIPTION

13       klogd is a system daemon which intercepts and logs  Linux  kernel  mes‐
14       sages.
15

OPTIONS

17       -c n   Sets the default log level of console messages to n.
18
19       -d     Enable  debugging  mode.   This  will generate LOTS of output to
20              stderr.
21
22       -f file
23              Log messages to the specified filename rather than to the syslog
24              facility.
25
26       -i -I  Signal  the  currently  executing  klogd  daemon.  Both of these
27              switches control the loading/reloading  of  symbol  information.
28              The  -i  switch  signals  the daemon to reload the kernel module
29              symbols.  The -I switch signals for a reload of both the  static
30              kernel symbols and the kernel module symbols.
31
32       -n     Avoid  auto-backgrounding.   This  is  needed  especially if the
33              klogd is started and controlled by init(8).
34
35       -o     Execute in 'one-shot' mode.  This causes klogd to read  and  log
36              all  the  messages that are found in the kernel message buffers.
37              After a single read and log cycle the daemon exits.
38
39       -p     Enable paranoia.  This option controls when klogd  loads  kernel
40              module  symbol information.  Setting this switch causes klogd to
41              load the kernel  module  symbol  information  whenever  an  Oops
42              string is detected in the kernel message stream.
43
44       -s     Force  klogd to use the system call interface to the kernel mes‐
45              sage buffers.
46
47       -k file
48              Use the specified file as the source of kernel  symbol  informa‐
49              tion.
50
51       -v     Print version and exit.
52
53       -x     Omits  EIP translation and therefore doesn't read the System.map
54              file.
55
56       -2     When symbols are expanded, print  the  line  twice.   Once  with
57              addresses  converted  to  symbols, once with the raw text.  This
58              allows external programs such as ksymoops do their own  process‐
59              ing on the original data.
60

OVERVIEW

62       The  functionality  of klogd has been typically incorporated into other
63       versions of syslogd but this seems to be a poor place for it.   In  the
64       modern  Linux kernel a number of kernel messaging issues such as sourc‐
65       ing,  prioritization  and  resolution  of  kernel  addresses  must   be
66       addressed.  Incorporating kernel logging into a separate process offers
67       a cleaner separation of services.
68
69       In Linux there are two potential sources of kernel log information: the
70       /proc  file  system  and  the  syscall (sys_syslog) interface, although
71       ultimately they are one and the same.   Klogd  is  designed  to  choose
72       whichever  source of information is the most appropriate.  It does this
73       by first checking for the presence of a mounted /proc file system.   If
74       this  is  found the /proc/kmsg file is used as the source of kernel log
75       information.  If the proc file system is not mounted klogd uses a  sys‐
76       tem  call  to obtain kernel messages.  The command line switch (-s) can
77       be used to force klogd to use the system call interface as its  messag‐
78       ing source.
79
80       If  kernel  messages  are directed through the syslogd daemon the klogd
81       daemon, as of version 1.1, has the ability to properly prioritize  ker‐
82       nel messages.  Prioritization of the kernel messages was added to it at
83       approximately version 0.99pl13 of the kernel.  The raw kernel  messages
84       are of the form:
85
86              <[0-7]>Something said by the kernel.
87
88       The priority of the kernel message is encoded as a single numeric digit
89       enclosed inside the <> pair.  The definitions of these values is  given
90       in  the  kernel include file kernel.h.  When a message is received from
91       the kernel the klogd daemon reads this priority level and  assigns  the
92       appropriate  priority level to the syslog message.  If file output (-f)
93       is used the prioritization sequence is left pre-pended  to  the  kernel
94       message.
95
96       The  klogd  daemon also allows the ability to alter the presentation of
97       kernel messages to the system console.  Consequent with the prioritiza‐
98       tion  of  kernel messages was the inclusion of default messaging levels
99       for the kernel.  In a stock kernel the the default console log level is
100       set  to 7.  Any messages with a priority level numerically lower than 7
101       (higher priority) appear on the console.
102
103       Messages of priority level 7 are considered to be 'debug' messages  and
104       will thus not appear on the console.  Many administrators, particularly
105       in a multi-user environment, prefer that all kernel messages be handled
106       by  klogd and either directed to a file or to the syslogd daemon.  This
107       prevents 'nuisance' messages such as line printer out of paper or  disk
108       change detected from cluttering the console.
109
110       When  -c  is  given  on the commandline the klogd daemon will execute a
111       system call to inhibit all kernel messages from being displayed on  the
112       console.   Former versions always issued this system call and defaulted
113       to all kernel messages except for panics.  This is handled  differently
114       nowardays  so  klogd doesn't need to set this value anymore.  The argu‐
115       ment given to the -c switch specifies the priority  level  of  messages
116       which  will be directed to the console.  Note that messages of a prior‐
117       ity value LOWER than the indicated number will be directed to the  con‐
118       sole.
119
120              For example, to have the kernel display all messages with a pri‐
121              ority level of 3 (KERN_ERR) or more severe the following command
122              would be executed:
123
124                   klogd -c 4
125
126       The  definitions of the numeric values for kernel messages are given in
127       the file kernel.h which can be found in the  /usr/include/linux  direc‐
128       tory  if  the  kernel sources are installed.  These values parallel the
129       syslog priority values which are defined in the file syslog.h found  in
130       the /usr/include/sys sub-directory.
131
132       The  klogd daemon can also be used in a 'one-shot' mode for reading the
133       kernel message buffers.  One shot mode is selected by specifying the -o
134       switch on the command line.  Output will be directed to either the sys‐
135       logd daemon or to an alternate file specified by the -f switch.
136
137              For example, to read all the kernel messages after a system boot
138              and  record them in a file called krnl.msg the following command
139              would be given.
140
141                   klogd -o -f ./krnl.msg
142

KERNEL ADDRESS RESOLUTION

144       If the kernel detects an internal error condition a general  protection
145       fault  will  be  triggered.   As part of the GPF handling procedure the
146       kernel prints out a status report indicating the state of the processor
147       at the time of the fault.  Included in this display are the contents of
148       the microprocessor's registers, the contents of the kernel stack and  a
149       tracing of what functions were being executed at the time of the fault.
150
151       This  information is EXTREMELY IMPORTANT in determining what caused the
152       internal error condition.  The difficulty comes when a kernel developer
153       attempts  to  analyze  this  information.   The raw numeric information
154       present in the protection fault printout is of very little use  to  the
155       developers.  This is due to the fact that kernels are not identical and
156       the addresses of variable locations or functions will not be  the  same
157       in  all kernels.  In order to correctly diagnose the cause of failure a
158       kernel developer needs to know what specific kernel functions or  vari‐
159       able locations were involved in the error.
160
161       As  part  of  the kernel compilation process a listing is created which
162       specified the address locations of important variables and function  in
163       the kernel being compiled.  This listing is saved in a file called Sys‐
164       tem.map in the top of the kernel directory  source  tree.   Using  this
165       listing  a  kernel  developer can determine exactly what the kernel was
166       doing when the error condition occurred.
167
168       The process of resolving the  numeric  addresses  from  the  protection
169       fault  printout  can  be done manually or by using the ksymoops program
170       which is included in the kernel sources.
171
172       As a convenience klogd will attempt to resolve kernel numeric addresses
173       to their symbolic forms if a kernel symbol table is available at execu‐
174       tion time.  If you require the original address of the symbol, use  the
175       -2 switch to preserve the numeric address.  A symbol table may be spec‐
176       ified by using the -k switch on the command line.  If a symbol file  is
177       not explicitly specified the following filenames will be tried:
178
179       /boot/System.map
180       /System.map
181       /usr/src/linux/System.map
182
183       Version information is supplied in the system maps as of kernel 1.3.43.
184       This version information is used to direct an intelligent search of the
185       list  of  symbol tables.  This feature is useful since it provides sup‐
186       port for both production and experimental kernels.
187
188       For example a production  kernel  may  have  its  map  file  stored  in
189       /boot/System.map.   If  an experimental or test kernel is compiled with
190       the sources in the 'standard' location of /usr/src/linux the system map
191       will  be  found  in /usr/src/linux/System.map.  When klogd starts under
192       the experimental kernel the map in /boot/System.map will be bypassed in
193       favor of the map in /usr/src/linux/System.map.
194
195       Modern  kernels as of 1.3.43 properly format important kernel addresses
196       so that they will be recognized and translated by klogd.  Earlier  ker‐
197       nels  require  a  source  code  patch be applied to the kernel sources.
198       This patch is supplied with the sysklogd sources.
199
200       The process of analyzing kernel protections faults works very well with
201       a static kernel.  Additional difficulties are encountered when attempt‐
202       ing to diagnose errors which occur in loadable kernel  modules.   Load‐
203       able  kernel  modules  are  used to implement kernel functionality in a
204       form which can be loaded or unloaded at will.  The use of loadable mod‐
205       ules  is  useful  from a debugging standpoint and can also be useful in
206       decreasing the amount of memory required by a kernel.
207
208       The difficulty with diagnosing errors in loadable modules is due to the
209       dynamic nature of the kernel modules.  When a module is loaded the ker‐
210       nel will allocate memory  to  hold  the  module,  when  the  module  is
211       unloaded this memory will be returned back to the kernel.  This dynamic
212       memory allocation makes it impossible  to  produce  a  map  file  which
213       details  the  addresses of the variable and functions in a kernel load‐
214       able module.  Without this location map it is not possible for a kernel
215       developer to determine what went wrong if a protection fault involves a
216       kernel module.
217
218       klogd has support for dealing with the problem of diagnosing protection
219       faults  in  kernel  loadable  modules.   At  program  start  time or in
220       response to a signal the daemon will interrogate the kernel for a list‐
221       ing  of  all modules loaded and the addresses in memory they are loaded
222       at.  Individual modules can also register the  locations  of  important
223       functions  when  the module is loaded.  The addresses of these exported
224       symbols are also determined during this interrogation process.
225
226       When a protection fault occurs an attempt will be made to resolve  ker‐
227       nel  addresses from the static symbol table.  If this fails the symbols
228       from the currently loaded modules are examined in an attempt to resolve
229       the addresses.  At the very minimum this allows klogd to indicate which
230       loadable module was responsible for generating  the  protection  fault.
231       Additional  information  may be available if the module developer chose
232       to export symbol information from the module.
233
234       Proper and accurate resolution of addresses in kernel modules  requires
235       that  klogd be informed whenever the kernel module status changes.  The
236       -i and -I switches can be used to signal the currently executing daemon
237       that symbol information be reloaded.  Of most importance to proper res‐
238       olution of module symbols is the -i switch.  Each time a kernel  module
239       is  loaded  or  removed from the kernel the following command should be
240       executed:
241
242       klogd -i
243
244       The -p switch can also be used to insure that module symbol information
245       is up to date.  This switch instructs klogd to reload the module symbol
246       information whenever a protection fault is detected.  Caution should be
247       used  before invoking the program in ´paranoid´ mode.  The stability of
248       the kernel and the operating environment is always under question  when
249       a  protection fault occurs.  Since the klogd daemon must execute system
250       calls in order to read the module symbol information there is the  pos‐
251       sibility that the system may be too unstable to capture useful informa‐
252       tion.  A much better policy is to insure that klogd is updated whenever
253       a  module  is  loaded  or unloaded.  Having uptodate symbol information
254       loaded increases the probability of  properly  resolving  a  protection
255       fault if it should occur.
256
257       Included  in  the  sysklogd  source distribution is a patch to the mod‐
258       ules-2.0.0 package which allows the insmod, rmmod and  modprobe  utili‐
259       ties  to  automatically  signal  klogd whenever a module is inserted or
260       removed from the kernel.  Using this patch will insure that the  symbol
261       information  maintained  in klogd is always consistent with the current
262       kernel state.
263

SIGNAL HANDLING

265       The klogd will respond  to  eight  signals:  SIGHUP,  SIGINT,  SIGKILL,
266       SIGTERM,  SIGTSTP,  SIGUSR1, SIGUSR2 and SIGCONT.  The SIGINT, SIGKILL,
267       SIGTERM and SIGHUP signals will cause the daemon to  close  its  kernel
268       log sources and terminate gracefully.
269
270       The  SIGTSTP and SIGCONT signals are used to start and stop kernel log‐
271       ging.  Upon receipt of a SIGTSTP signal the daemon will close  its  log
272       sources and spin in an idle loop.  Subsequent receipt of a SIGCONT sig‐
273       nal will cause the daemon to go through its initialization sequence and
274       re-choose  an  input  source.  Using SIGSTOP and SIGCONT in combination
275       the kernel log input can be re-chosen without stopping  and  restarting
276       the  daemon.   For example if the /proc file system is to be un-mounted
277       the following command sequence should be used:
278
279            # kill -TSTP pid
280            # umount /proc
281            # kill -CONT pid
282
283       Notations will be made in the system logs with LOG_INFO priority  docu‐
284       menting the start/stop of logging.
285
286       The  SIGUSR1 and SIGUSR2 signals are used to initiate loading/reloading
287       of kernel symbol information.  Receipt of the SIGUSR1 signal will cause
288       the  kernel  module  symbols to be reloaded.  Signaling the daemon with
289       SIGUSR2 will cause both the static kernel symbols and the kernel module
290       symbols to be reloaded.
291
292       Provided  that the System.map file is placed in an appropriate location
293       the signal of generally greatest  usefulness  is  the  SIGUSR1  signal.
294       This  signal  is  designed  to be used to signal the daemon when kernel
295       modules are loaded/unloaded.  Sending this signal to the daemon after a
296       kernel  module  state change will insure that proper resolution of sym‐
297       bols will occur if a protection fault occurs in the address space occu‐
298       pied by a kernel module.
299

FILES

301       /proc/kmsg
302              One Source for kernel messages klogd
303       /var/run/klogd.pid
304              The file containing the process id of klogd
305       /boot/System.map, /System.map, /usr/src/linux/System.map
306              Default locations for kernel system maps.
307

BUGS

309       Probably numerous.  Well formed context diffs appreciated.
310

AUTHOR

312       The  klogd  was  originally written by Steve Lord (lord@cray.com), Greg
313       Wettstein made major improvements.
314
315       Dr. Greg Wettstein (greg@wind.enjellic.com)
316       Enjellic Systems Development
317
318       Oncology Research Divsion Computing Facility
319       Roger Maris Cancer Center
320       Fargo, ND 58122
321
322
323
324Version 1.4                     21 August, 1999                       KLOGD(8)
Impressum