summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/guix.texi8
-rw-r--r--gnu/services/base.scm2
-rw-r--r--gnu/system/file-systems.scm26
-rw-r--r--gnu/system/shadow.scm4
-rw-r--r--guix/build/linux-initrd.scm5
5 files changed, 36 insertions, 9 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index a88b546380..4490ff1deb 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -3074,6 +3074,14 @@ The @code{devtmpfs} file system to be mounted on @file{/dev}.  This is a
 requirement for udev (@pxref{Base Services, @code{udev-service}}).
 @end defvr
 
+@defvr {Scheme Variable} %pseudo-terminal-file-system
+This is the file system to be mounted as @file{/dev/pts}.  It supports
+@dfn{pseudo-terminals} created @i{via} @code{openpty} and similar
+functions (@pxref{Pseudo-Terminals,,, libc, The GNU C Library Reference
+Manual}).  Pseudo-terminals are used by terminal emulators such as
+@command{xterm}.
+@end defvr
+
 @defvr {Scheme Variable} %binary-format-file-system
 The @code{binfmt_misc} file system, which allows handling of arbitrary
 executable file types to be delegated to user space.  This requires the
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 9a67109db0..2c9054af48 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -482,7 +482,7 @@ passed to @command{guix-daemon}."
              ;; Udev needs /dev to be a 'devtmpfs' mount so that new device
              ;; nodes can be added: see
              ;; <http://www.linuxfromscratch.org/lfs/view/development/chapter07/udev.html>.
-             (requirement '(root-file-system file-system-/dev))
+             (requirement '(root-file-system))
 
              (documentation "Populate the /dev directory, dynamically.")
              (start #~(lambda ()
diff --git a/gnu/system/file-systems.scm b/gnu/system/file-systems.scm
index ea8d961317..76460d95af 100644
--- a/gnu/system/file-systems.scm
+++ b/gnu/system/file-systems.scm
@@ -85,11 +85,33 @@
     (device "none")
     (mount-point "/dev")
     (type "devtmpfs")
-    (check? #f)))
+    (check? #f)
+
+    ;; Mount it from the initrd so /dev/pts & co. can then be mounted over it.
+    (needed-for-boot? #t)))
+
+(define %tty-gid
+  ;; ID of the 'tty' group.  Allocate it statically to make it easy to refer
+  ;; to it from here and from the 'tty' group definitions.
+  1004)
+
+(define %pseudo-terminal-file-system
+  ;; The pseudo-terminal file system.  It needs to be mounted so that
+  ;; statfs(2) returns DEVPTS_SUPER_MAGIC like libc's getpt(3) expects (and
+  ;; thus openpty(3) and its users, such as xterm.)
+  (file-system
+    (device "none")
+    (mount-point "/dev/pts")
+    (type "devpts")
+    (check? #f)
+    (needed-for-boot? #f)
+    (create-mount-point? #t)
+    (options (string-append "gid=" (number->string %tty-gid) ",mode=620"))))
 
 (define %base-file-systems
   ;; List of basic file systems to be mounted.  Note that /proc and /sys are
   ;; currently mounted by the initrd.
-  (list %devtmpfs-file-system))
+  (list %devtmpfs-file-system
+        %pseudo-terminal-file-system))
 
 ;;; file-systems.scm ends here
diff --git a/gnu/system/shadow.scm b/gnu/system/shadow.scm
index ae6eac9a5b..e29dbb8c3e 100644
--- a/gnu/system/shadow.scm
+++ b/gnu/system/shadow.scm
@@ -20,6 +20,8 @@
   #:use-module (guix records)
   #:use-module (guix gexp)
   #:use-module (guix monads)
+  #:use-module ((gnu system file-systems)
+                #:select (%tty-gid))
   #:use-module ((gnu packages admin)
                 #:select (shadow))
   #:use-module (gnu packages bash)
@@ -84,7 +86,7 @@
 
         ;; The following groups are conventionally used by things like udev to
         ;; control access to hardware devices.
-        (user-group (name "tty"))
+        (user-group (name "tty") (id %tty-gid))
         (user-group (name "dialout"))
         (user-group (name "kmem"))
         (user-group (name "video"))
diff --git a/guix/build/linux-initrd.scm b/guix/build/linux-initrd.scm
index abf86f6a77..08df32ad1e 100644
--- a/guix/build/linux-initrd.scm
+++ b/guix/build/linux-initrd.scm
@@ -670,11 +670,6 @@ to it are lost."
              (switch-root "/root")
              (format #t "loading '~a'...\n" to-load)
 
-             ;; Obviously this has to be done each time we boot.  Do it from here
-             ;; so that statfs(2) returns DEVPTS_SUPER_MAGIC like libc's getpt(3)
-             ;; expects (and thus openpty(3) and its users, such as xterm.)
-             (mount "none" "/dev/pts" "devpts")
-
              ;; TODO: Remove /lib, /share, and /loader.go.
              (primitive-load to-load)