From c9c88118a12b0e22b7369b1dc6b0e2f9db894986 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@gnu.org>
Date: Mon, 10 Mar 2014 23:16:02 +0100
Subject: [PATCH] gnu: linux-initrd: Make the pseudo-tty device nodes.

* guix/build/linux-initrd.scm (make-essential-device-nodes): Create
  /dev/ptmx and /dev/pts.
* gnu/system/vm.scm (qemu-image): Umount /fs/dev/pts before /fs.
---
 gnu/system/vm.scm           | 8 +++++++-
 guix/build/linux-initrd.scm | 8 ++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index b8b0274f1fa..b6a777353fe 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -383,7 +383,13 @@ (define (graph-from-file file)
                              (system* grub "--no-floppy"
                                       "--boot-directory" "/fs/boot"
                                       "/dev/sda"))
-                            (zero? (system* umount "/fs"))
+                            (begin
+                              (when (file-exists? "/fs/dev/pts")
+                                ;; Unmount devpts so /fs itself can be
+                                ;; unmounted (failing to do that leads to
+                                ;; EBUSY.)
+                                (system* umount "/fs/dev/pts"))
+                              (zero? (system* umount "/fs")))
                             (reboot))))))))
     #:system system
     #:inputs `(("parted" ,parted)
diff --git a/guix/build/linux-initrd.scm b/guix/build/linux-initrd.scm
index 80ce6794960..9a8ea0ed4fc 100644
--- a/guix/build/linux-initrd.scm
+++ b/guix/build/linux-initrd.scm
@@ -114,6 +114,14 @@ (define (scope dir)
                   (device-number 4 n))
            (loop (+ 1 n)))))
 
+  ;; Pseudo ttys.
+  (mknod (scope "dev/ptmx") 'char-special #o666
+         (device-number 5 2))
+
+  (unless (file-exists? (scope "dev/pts"))
+    (mkdir (scope "dev/pts")))
+  (mount "none" (scope "dev/pts") "devpts")
+
   ;; Rendez-vous point for syslogd.
   (mknod (scope "dev/log") 'socket #o666 0)
   (mknod (scope "dev/kmsg") 'char-special #o600 (device-number 1 11))
-- 
GitLab