Date: Wed, 22 Nov 2000 21:40:41 +0100 From: Poul-Henning Kamp <phk@freebsd.org> To: current@freebsd.org, arch@freebsd.org Subject: RFC: /dev/console -> /var/log/messages idea/patch Message-ID: <1050.974925641@critter>
next in thread | raw e-mail | index | archive | help
The attached patch is a "proof-of-concept" on which I would like to get some comments: It bugs me big time that the output from /etc/rc and all other output to /dev/console is volatile and lost once it scrolls of your console. It particular bugs me for systems which are configured with a modem on a serial port as console, if something choked badly in /etc/rc I will never know. (Don't tell me to use a SilentWriter or DecWriter as console, OK ? Been There, Done That, Got The Piles Of Paper To Prove It. :-) Ideally our console would be much more functional, but that is a project which would fall sideways off my todo list if I tried to balance it there. (If anybody is looking for a medium complex kernel task, a new console system is a place to look. Enquire within). So I though about it from a "how little can we get away with" and realized that by simply grabbing a copy of everything written to /dev/console and feeding it to syslogd would gain us a lot of mileage. Now, there are several issues to understand here, so please read on before you apply paint to this bikeshed: By "/dev/console" output I mean just and only that. Characters which arrive by write(2)/writev(2) on a fd opened to "/dev/console". Kernel printfs are not /dev/console output in this context. Characters written directly to your console device ("/dev/ttyd0", "/dev/ttyv0" or "/dev/cuaa0") are *not* /dev/console output either. Input from /dev/console are not part of this. You will not be able to see the answers people give fsck. The output do of course still also arrive on your console device. Obviously, if syslogd were to write these messages back to /dev/console bad things would happen. Syslogd may need to gain a tabu there. The formatting cannot be preserved. If somebody were to: echo -n "You're screwed now ---> " > /dev/console we would never see the message in syslogd if the code waited for the final '\n' to arrive. (I guess a timeout based solution could be feasible, what do people think ?) In this patch I have deliberatly output a '"' in front of all messages, this is merely for debugging right now. The patch probably has all sorts of issues, style, locking, you name it. It is only intended as a proof-of-concept patch. Sample output from /var/log/messages attached below. Comments, volounteers, ideas most welcome... Poul-Henning Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "swapon: adding /dev/ad1s1b as swap device Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "swapon: adding /dev/ad0s1b as swap device Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Automatic boot in progress... Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad0s1a: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad0s1a: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 134807 free Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(823 frags, 16748 blocks, 0.4% fragmentation) Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad1s1e: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad1s1e: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 184706 free Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(138 frags, 23071 blocks, 0.1% fragmentation) Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad1s1f: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad1s1f: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 1775231 free Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(13343 frags, 220236 blocks, 0.7% fragmentation) Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad0s1e: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad0s1e: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 2032838 free Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(14 frags, 254103 blocks, 0.0% fragmentation) Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ccd0c: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ccd0c: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 3464429 free Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(3245 frags, 865296 blocks, 0.1% fragmentation) Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Can't use /entropy as an entropy file, trying other sources Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "cat: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "malloc.conf Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ": Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "No such file or directory Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Doing initial network setup: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " hostname Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " inet 212.242.40.133 netmask 0xfffffff0 broadcast 212.242.40.143 Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " ether 00:90:27:2c:60:72 Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " media: autoselect (100baseTX <full-duplex>) status: active Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " supported media: autoselect 100baseTX <full-duplex> 100baseTX 10baseT/UTP <full-duplex> 10baseT/UTP Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " inet 127.0.0.1 netmask 0xff000000 Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "add net default: gateway 212.242.40.129 Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Additional routing options: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " tcp extensions=NO Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " TCP keepalive=YES Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "routing daemons: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "additional daemons: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " syslogd Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "rm: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/var/run/dev.db Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ": Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "No such file or directory Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Doing additional network setup: Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " portmap Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "Starting final network daemons: Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "setting ELF ldconfig path: /usr/lib /usr/lib/compat /usr/X11R6/lib /usr/local/lib Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "setting a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "starting standard daemons: Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: " inetd Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: " cron Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: " sendmail Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: " sshd Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "Recovering vi editor sessions Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "Initial rc.i386 initialization: Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "rc.i386 configuring syscons: Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: " blank_time Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "additional ABI support: Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "Local package initialization: Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ". Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "Additional TCP options: Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ". Index: sys/syslog.h =================================================================== RCS file: /home/ncvs/src/sys/sys/syslog.h,v retrieving revision 1.19 diff -u -r1.19 syslog.h --- sys/syslog.h 1999/12/29 04:24:48 1.19 +++ sys/syslog.h 2000/11/22 20:02:26 @@ -107,6 +107,7 @@ #define LOG_FTP (11<<3) /* ftp daemon */ #define LOG_NTP (12<<3) /* NTP subsystem */ #define LOG_SECURITY (13<<3) /* security subsystems (firewalling, etc.) */ +#define LOG_CONSOLE (14<<3) /* /dev/console output */ /* other codes through 15 reserved for system use */ #define LOG_LOCAL0 (16<<3) /* reserved for local use */ @@ -127,6 +128,7 @@ CODE facilitynames[] = { { "auth", LOG_AUTH, }, { "authpriv", LOG_AUTHPRIV, }, + { "console", LOG_CONSOLE, }, { "cron", LOG_CRON, }, { "daemon", LOG_DAEMON, }, { "ftp", LOG_FTP, }, Index: kern/subr_prf.c =================================================================== RCS file: /home/ncvs/src/sys/kern/subr_prf.c,v retrieving revision 1.64 diff -u -r1.64 subr_prf.c --- kern/subr_prf.c 2000/10/02 07:13:10 1.64 +++ kern/subr_prf.c 2000/11/22 20:14:50 @@ -49,6 +49,7 @@ #include <sys/tprintf.h> #include <sys/syslog.h> #include <sys/cons.h> +#include <sys/uio.h> /* * Note that stdarg.h and the ANSI style va_start macro is used for both @@ -223,6 +224,52 @@ logwakeup(); return retval; } + +#define CONSCHUNK 4096 +static char consbuffer[CONSCHUNK]; + +void +log_console(struct uio *uio) +{ + int s, c, i, error, iovlen, nlf = 0; + struct uio muio; + struct iovec *miov = NULL; + + muio = *uio; + iovlen = uio->uio_iovcnt * sizeof (struct iovec); + MALLOC(miov, struct iovec *, iovlen, M_TEMP, M_WAITOK); + bcopy((caddr_t)muio.uio_iov, (caddr_t)miov, iovlen); + muio.uio_iov = miov; + uio = &muio; + + s = splhigh(); + error = 0; + while (error == 0 && uio->uio_resid > 0) { + c = imin(uio->uio_resid, CONSCHUNK); + error = uiomove(consbuffer, c, uio); + if (!error) { + for (i = 0; i < c; i++) { + if (!nlf) { + logpri(LOG_INFO | LOG_CONSOLE); + msglogchar('"', 0); + nlf = 1; + } + msglogchar(consbuffer[i], 0); + if (consbuffer[i] == '\n') { + nlf = 0; + logwakeup(); + } + } + } + } + if (nlf) + msglogchar('\n', 0); + logwakeup(); + splx(s); + FREE(miov, M_TEMP); + return; +} + static void logpri(level) Index: kern/tty_cons.c =================================================================== RCS file: /home/ncvs/src/sys/kern/tty_cons.c,v retrieving revision 1.84 diff -u -r1.84 tty_cons.c --- kern/tty_cons.c 2000/10/29 16:06:34 1.84 +++ kern/tty_cons.c 2000/11/22 20:20:20 @@ -352,6 +352,7 @@ dev = constty->t_dev; else dev = cn_tab->cn_dev; + log_console(uio); return ((*devsw(dev)->d_write)(dev, uio, flag)); } -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk@FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1050.974925641>