unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
blob 5368dec32c256c51c27bee2c13d40138b2880558 3518 bytes (raw)
name: gnu/system/linux-container.scm 	 # note: path name is non-authoritative(*)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 David Thompson <davet@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu system linux-container)
  #:use-module (ice-9 match)
  #:use-module (guix config)
  #:use-module (guix store)
  #:use-module (guix gexp)
  #:use-module (guix derivations)
  #:use-module (guix monads)
  #:use-module (gnu build linux-container)
  #:use-module (gnu system)
  #:use-module (gnu system file-systems)
  #:export (mapping->file-system
            system-container
            container-script))

(define (mapping->file-system mapping)
  "Return a file system that realizes MAPPING."
  (match mapping
    (($ <file-system-mapping> source target writable?)
     (file-system
       (mount-point target)
       (device source)
       (type "none")
       (flags (if writable?
                  '(bind-mount)
                  '(bind-mount read-only)))
       (check? #f)
       (create-mount-point? #t)))))

(define (system-container os)
  (mlet* %store-monad
      ((profile (operating-system-profile os))
       (etc     (operating-system-etc-directory os))
       (boot    (operating-system-boot-script os #:container? #t))
       (locale  (operating-system-locale-directory os)))
    (file-union "system-container"
                `(("boot" ,#~#$boot)
                  ("profile" ,#~#$profile)
                  ("locale" ,#~#$locale)
                  ("etc" ,#~#$etc)))))

(define* (container-script os #:key (mappings '()))
  (let* ((mappings     (map mapping->file-system
                            ;; Bind-mount the store in addition to
                            ;; user-specified mappings.
                            (cons %store-mapping mappings)))
         (file-systems (filter file-system-needed-for-boot?
                               (operating-system-file-systems os)))
         (specs        (map file-system->spec
                            (append file-systems mappings))))

    (mlet* %store-monad ((os-drv (system-container os)))

      (define script
        #~(begin
            (use-modules (gnu build linux-container))

            (call-with-container '#$specs
              (lambda ()
                (setenv "HOME" "/root")
                (setenv "TMPDIR" "/tmp")
                (setenv "GUIX_NEW_SYSTEM" #$os-drv)
                (for-each mkdir '("/run" "/bin" "/etc" "/home" "/var"))
                (primitive-load (string-append #$os-drv "/boot"))))))

      (gexp->script "run-container" script
                    #:modules '((ice-9 match)
                                (srfi srfi-98)
                                (guix config)
                                (guix utils)
                                (guix build utils)
                                (guix build syscalls)
                                (gnu build linux-container))))))

debug log:

solving 5368dec ...
found 5368dec in https://yhetil.org/guix-devel/1436188604-2813-11-git-send-email-dthompson2@worcester.edu/

applying [1/1] https://yhetil.org/guix-devel/1436188604-2813-11-git-send-email-dthompson2@worcester.edu/
diff --git a/gnu/system/linux-container.scm b/gnu/system/linux-container.scm
new file mode 100644
index 0000000..5368dec

Checking patch gnu/system/linux-container.scm...
Applied patch gnu/system/linux-container.scm cleanly.

index at:
100644 5368dec32c256c51c27bee2c13d40138b2880558	gnu/system/linux-container.scm

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).