~ruther/guix-local

cc0e575a94a4e22a0bf2bf1b0c7b0514f1c1fbb5 — Ludovic Courtès 10 years ago 7ee5db1
linux-boot: Mount /dev as a devtmpfs from the start.

Suggested by Petter <petter@mykolab.ch>
and Mark H Weaver <mhw@netris.org>.
Reported by Duncan Keall <duncan@duncankeall.com>.

Partly fixes <http://bugs.gnu.org/19190> by populating /dev/mapper
early enough.

* gnu/build/linux-boot.scm (mount-essential-file-systems): Mount /dev as
  a devtmpfs.
  (move-essential-file-systems): Add /dev.
  (mount-root-file-system): Mount /rw-root/dev as a devtmpfs instead of
  calling 'make-essential-device-nodes'.
  (boot-system): Remove call to 'make-essential-device-nodes'.
* gnu/system/file-systems.scm (%devtmpfs-file-system): Remove.
* doc/guix.texi (File Systems): Adjust accordingly.
3 files changed, 11 insertions(+), 31 deletions(-)

M doc/guix.texi
M gnu/build/linux-boot.scm
M gnu/system/file-systems.scm
M doc/guix.texi => doc/guix.texi +1 -6
@@ 5295,16 5295,11 @@ variables.

@defvr {Scheme Variable} %base-file-systems
These are essential file systems that are required on normal systems,
such as @var{%devtmpfs-file-system} and @var{%immutable-store} (see
such as @var{%pseudo-terminal-file-system} and @var{%immutable-store} (see
below.)  Operating system declarations should always contain at least
these.
@end defvr

@defvr {Scheme Variable} %devtmpfs-file-system
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

M gnu/build/linux-boot.scm => gnu/build/linux-boot.scm +9 -11
@@ 48,7 48,7 @@
;;; Code:

(define* (mount-essential-file-systems #:key (root "/"))
  "Mount /proc and /sys under ROOT."
  "Mount /dev, /proc, and /sys under ROOT."
  (define (scope dir)
    (string-append root
                   (if (string-suffix? "/" root)


@@ 60,6 60,10 @@
    (mkdir (scope "proc")))
  (mount "none" (scope "proc") "proc")

  (unless (file-exists? (scope "dev"))
    (mkdir (scope "dev")))
  (mount "none" (scope "dev") "devtmpfs")

  (unless (file-exists? (scope "sys"))
    (mkdir (scope "sys")))
  (mount "none" (scope "sys") "sysfs"))


@@ 71,7 75,7 @@
                (unless (file-exists? target)
                  (mkdir target))
                (mount dir target "" MS_MOVE)))
            '("/proc" "/sys")))
            '("/dev" "/proc" "/sys")))

(define (linux-command-line)
  "Return the Linux kernel command line as a list of strings."


@@ 100,7 104,7 @@ with the given MAJOR number, starting with MINOR."

(define* (make-essential-device-nodes #:key (root "/"))
  "Make essential device nodes under ROOT/dev."
  ;; The hand-made udev!
  ;; The hand-made devtmpfs/udev!

  (define (scope dir)
    (string-append root


@@ 255,7 259,8 @@ UNIONFS."
        (mount "none" "/rw-root" "tmpfs")

        ;; We want read-write /dev nodes.
        (make-essential-device-nodes #:root "/rw-root")
        (mkdir-p "/rw-root/dev")
        (mount "none" "/rw-root/dev" "devtmpfs")

        ;; Make /root a union of the tmpfs and the actual root.  Use
        ;; 'max_files' to set a high RLIMIT_NOFILE for the unionfs process


@@ 385,9 390,6 @@ to it are lost."
         (unless (configure-qemu-networking)
           (display "network interface is DOWN\n")))

       ;; Make /dev nodes.
       (make-essential-device-nodes)

       ;; Prepare the real root file system under /root.
       (unless (file-exists? "/root")
         (mkdir "/root"))


@@ 405,10 407,6 @@ to it are lost."
                                   #:volatile-root? volatile-root?)
           (mount "none" "/root" "tmpfs"))

       (unless (file-exists? "/root/dev")
         (mkdir "/root/dev")
         (make-essential-device-nodes #:root "/root"))

       ;; Mount the specified file systems.
       (for-each mount-file-system
                 (remove root-mount-point? mounts))

M gnu/system/file-systems.scm => gnu/system/file-systems.scm +1 -14
@@ 47,7 47,6 @@
            %binary-format-file-system
            %shared-memory-file-system
            %pseudo-terminal-file-system
            %devtmpfs-file-system
            %immutable-store
            %control-groups
            %elogind-file-systems


@@ 186,17 185,6 @@ UUID representation."
    (type "binfmt_misc")
    (check? #f)))

(define %devtmpfs-file-system
  ;; /dev as a 'devtmpfs' file system, needed for udev.
  (file-system
    (device "none")
    (mount-point "/dev")
    (type "devtmpfs")
    (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.


@@ 282,8 270,7 @@ UUID representation."
(define %base-file-systems
  ;; List of basic file systems to be mounted.  Note that /proc and /sys are
  ;; currently mounted by the initrd.
  (append (list %devtmpfs-file-system
                %pseudo-terminal-file-system
  (append (list %pseudo-terminal-file-system
                %shared-memory-file-system
                %immutable-store)
          %elogind-file-systems