diff --git a/upstart-jobs/default.nix b/upstart-jobs/default.nix
index 2e86c780237..d1ea5b25508 100644
--- a/upstart-jobs/default.nix
+++ b/upstart-jobs/default.nix
@@ -79,6 +79,12 @@ let
       inherit config;
     })
 
+    # Klogd.
+    (import ../upstart-jobs/klogd.nix {
+      inherit (pkgs) sysklogd writeText;
+      inherit config;
+    })
+
     # The udev daemon creates devices nodes and runs programs when
     # hardware events occur.
     (import ../upstart-jobs/udev.nix {
diff --git a/upstart-jobs/klogd.nix b/upstart-jobs/klogd.nix
new file mode 100644
index 00000000000..35207b339bd
--- /dev/null
+++ b/upstart-jobs/klogd.nix
@@ -0,0 +1,26 @@
+{sysklogd, writeText, config}:
+
+let
+
+  klogdCmd = "${sysklogd}/sbin/klogd -c 1 -2 -k $(dirname $(readlink -f /var/run/booted-system/kernel))/System.map";
+
+in
+
+{
+  name = "klogd";
+  
+  job = ''
+    description "Kernel log daemon"
+  
+    start on syslogd
+    stop on shutdown
+
+    start script
+      # !!! this hangs for some reason (it blocks reading from
+      # /proc/kmsg).
+      #${klogdCmd} -o
+    end script
+
+    respawn ${klogdCmd} -n
+  '';
+}
diff --git a/upstart-jobs/syslogd.nix b/upstart-jobs/syslogd.nix
index 3b1c9ea59e7..c255eb0d9a8 100644
--- a/upstart-jobs/syslogd.nix
+++ b/upstart-jobs/syslogd.nix
@@ -3,7 +3,10 @@
 let
 
   syslogConf = writeText "syslog.conf" ''
-    *.*                           /dev/tty10
+    kern.warning;*.err;authpriv.none /dev/tty10
+
+    # Send emergency messages to all users.
+    *.emerg                       *
 
     # "local1" is used for dhcpd messages.
     local1.*                     -/var/log/dhcpd
@@ -20,7 +23,10 @@ in
 
 {
   name = "syslogd";
+  
   job = ''
+    description "Syslog daemon"
+  
     start on udev
     stop on shutdown