~ruther/guix-local

9331ba5dd9dc2224b427d71f2ee56250463f4ef3 — 宋文武 11 years ago 4379c35
linux-boot: Make /etc/mtab a symlink to /proc/self/mounts.

Fixes <http://bugs.gnu.org/19491>.

* gnu/build/linux-boot.scm (mount-root-file-system): Make /root/etc/mtab
  a symlink to /proc/self/mounts.
* gnu/build/file-systems.scm (mount-file-system): Don't update /etc/mtab.
* guix/build/syscalls.scm (mount, umount): Have #:update-mtab? default to
  #f.
3 files changed, 7 insertions(+), 11 deletions(-)

M gnu/build/file-systems.scm
M gnu/build/linux-boot.scm
M guix/build/syscalls.scm
M gnu/build/file-systems.scm => gnu/build/file-systems.scm +1 -8
@@ 287,13 287,6 @@ run a file system check."
       (mount source mount-point type (mount-flags->bit-mask flags)
              (if options
                  (string->pointer options)
                  %null-pointer))

       ;; Update /etc/mtab.
       (mkdir-p (string-append root "/etc"))
       (let ((port (open-file (string-append root "/etc/mtab") "a")))
         (format port "~a ~a ~a ~a 0 0~%"
                 source mount-point type (or options "rw"))
         (close-port port))))))
                  %null-pointer))))))

;;; file-systems.scm ends here

M gnu/build/linux-boot.scm => gnu/build/linux-boot.scm +4 -1
@@ 275,7 275,10 @@ UNIONFS."
        (check-file-system root type)
        (mount root "/root" type)))

  (copy-file "/proc/mounts" "/root/etc/mtab"))
  ;; Make sure /root/etc/mtab is a symlink to /proc/self/mounts.
  (when (file-exists? "/root/etc/mtab")
    (delete-file "/root/etc/mtab"))
  (symlink "/proc/self/mounts" "/root/etc/mtab"))

(define (switch-root root)
  "Switch to ROOT as the root file system, in a way similar to what

M guix/build/syscalls.scm => guix/build/syscalls.scm +2 -2
@@ 130,7 130,7 @@
  (let* ((ptr  (dynamic-func "mount" (dynamic-link)))
         (proc (pointer->procedure int ptr `(* * * ,unsigned-long *))))
    (lambda* (source target type #:optional (flags 0) options
                     #:key (update-mtab? #t))
                     #:key (update-mtab? #f))
      "Mount device SOURCE on TARGET as a file system TYPE.  Optionally, FLAGS
may be a bitwise-or of the MS_* <sys/mount.h> constants, and OPTIONS may be a
string.  When FLAGS contains MS_REMOUNT, SOURCE and TYPE are ignored.  When


@@ 159,7 159,7 @@ error."
  (let* ((ptr  (dynamic-func "umount2" (dynamic-link)))
         (proc (pointer->procedure int ptr `(* ,int))))
    (lambda* (target #:optional (flags 0)
                     #:key (update-mtab? #t))
                     #:key (update-mtab? #f))
      "Unmount TARGET.  Optionally FLAGS may be one of the MNT_* or UMOUNT_*
constants from <sys/mount.h>."
      (let ((ret (proc (string->pointer target) flags))