pack: Add support for squashfs images.
* guix/scripts/pack.scm (%formats): Add "squashfs" format. (guix-pack): Adjust "archiver" dependent on pack-format. (squashfs-image): New procedure. * doc/guix.texi (Invoking guix pack): Document it.
This commit is contained in:
parent
5ffac538aa
commit
b2817f0fa5
|
@ -2856,6 +2856,22 @@ command. See the
|
||||||
@uref{https://docs.docker.com/engine/reference/commandline/load/, Docker
|
@uref{https://docs.docker.com/engine/reference/commandline/load/, Docker
|
||||||
documentation} for more information.
|
documentation} for more information.
|
||||||
|
|
||||||
|
@cindex Singularity, build an image with guix pack
|
||||||
|
@cindex SquashFS, build an image with guix pack
|
||||||
|
Yet another option is to produce a SquashFS image with the following
|
||||||
|
command:
|
||||||
|
|
||||||
|
@example
|
||||||
|
guix pack -f squashfs guile emacs geiser
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
The result is a SquashFS file system image that can either be mounted or
|
||||||
|
directly be used as a file system container image with the
|
||||||
|
@uref{http://singularity.lbl.gov, Singularity container execution
|
||||||
|
environment}, using commands like @command{singularity shell} or
|
||||||
|
@command{singularity exec}.
|
||||||
|
|
||||||
Several command-line options allow you to customize your pack:
|
Several command-line options allow you to customize your pack:
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
|
@ -2874,6 +2890,11 @@ specified binaries and symlinks.
|
||||||
This produces a tarball that follows the
|
This produces a tarball that follows the
|
||||||
@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md,
|
@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md,
|
||||||
Docker Image Specification}.
|
Docker Image Specification}.
|
||||||
|
|
||||||
|
@item squashfs
|
||||||
|
This produces a SquashFS image containing all the specified binaries and
|
||||||
|
symlinks, as well as empty mount points for virtual file systems like
|
||||||
|
procfs.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item --relocatable
|
@item --relocatable
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2015, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2015, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
|
;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
|
||||||
;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
|
;;; Copyright © 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
|
||||||
;;; Copyright © 2018 Konrad Hinsen <konrad.hinsen@fastmail.net>
|
;;; Copyright © 2018 Konrad Hinsen <konrad.hinsen@fastmail.net>
|
||||||
;;; Copyright © 2018 Chris Marusich <cmmarusich@gmail.com>
|
;;; Copyright © 2018 Chris Marusich <cmmarusich@gmail.com>
|
||||||
;;;
|
;;;
|
||||||
|
@ -214,6 +214,90 @@ added to the pack."
|
||||||
build
|
build
|
||||||
#:references-graphs `(("profile" ,profile))))
|
#:references-graphs `(("profile" ,profile))))
|
||||||
|
|
||||||
|
(define* (squashfs-image name profile
|
||||||
|
#:key target
|
||||||
|
deduplicate?
|
||||||
|
(compressor (first %compressors))
|
||||||
|
localstatedir?
|
||||||
|
(symlinks '())
|
||||||
|
(archiver squashfs-tools-next))
|
||||||
|
"Return a squashfs image containing a store initialized with the closure of
|
||||||
|
PROFILE, a derivation. The image contains a subset of /gnu/store, empty mount
|
||||||
|
points for virtual file systems (like procfs), and optional symlinks.
|
||||||
|
|
||||||
|
SYMLINKS must be a list of (SOURCE -> TARGET) tuples denoting symlinks to be
|
||||||
|
added to the pack."
|
||||||
|
(define build
|
||||||
|
(with-imported-modules '((guix build utils)
|
||||||
|
(guix build store-copy)
|
||||||
|
(gnu build install))
|
||||||
|
#~(begin
|
||||||
|
(use-modules (guix build utils)
|
||||||
|
(gnu build install)
|
||||||
|
(guix build store-copy)
|
||||||
|
(srfi srfi-1)
|
||||||
|
(srfi srfi-26)
|
||||||
|
(ice-9 match))
|
||||||
|
|
||||||
|
(setenv "PATH" (string-append #$archiver "/bin"))
|
||||||
|
|
||||||
|
;; We need an empty file in order to have a valid file argument when
|
||||||
|
;; we reparent the root file system. Read on for why that's
|
||||||
|
;; necessary.
|
||||||
|
(with-output-to-file ".empty" (lambda () (display "")))
|
||||||
|
|
||||||
|
;; Create the squashfs image in several steps.
|
||||||
|
;; Add all store items. Unfortunately mksquashfs throws away all
|
||||||
|
;; ancestor directories and only keeps the basename. We fix this
|
||||||
|
;; in the following invocations of mksquashfs.
|
||||||
|
(apply invoke "mksquashfs"
|
||||||
|
`(,@(call-with-input-file "profile"
|
||||||
|
read-reference-graph)
|
||||||
|
,#$output
|
||||||
|
|
||||||
|
;; Do not perform duplicate checking because we
|
||||||
|
;; don't have any dupes.
|
||||||
|
"-no-duplicates"
|
||||||
|
"-comp"
|
||||||
|
,#+(compressor-name compressor)))
|
||||||
|
|
||||||
|
;; Here we reparent the store items. For each sub-directory of
|
||||||
|
;; the store prefix we need one invocation of "mksquashfs".
|
||||||
|
(for-each (lambda (dir)
|
||||||
|
(apply invoke "mksquashfs"
|
||||||
|
`(".empty"
|
||||||
|
,#$output
|
||||||
|
"-root-becomes" ,dir)))
|
||||||
|
(reverse (string-tokenize (%store-directory)
|
||||||
|
(char-set-complement (char-set #\/)))))
|
||||||
|
|
||||||
|
;; Add symlinks and mount points.
|
||||||
|
(apply invoke "mksquashfs"
|
||||||
|
`(".empty"
|
||||||
|
,#$output
|
||||||
|
;; Create SYMLINKS via pseudo file definitions.
|
||||||
|
,@(append-map
|
||||||
|
(match-lambda
|
||||||
|
((source '-> target)
|
||||||
|
(list "-p"
|
||||||
|
(string-join
|
||||||
|
;; name s mode uid gid symlink
|
||||||
|
(list source
|
||||||
|
"s" "777" "0" "0"
|
||||||
|
(string-append #$profile "/" target))))))
|
||||||
|
'#$symlinks)
|
||||||
|
|
||||||
|
;; Create empty mount points.
|
||||||
|
"-p" "/proc d 555 0 0"
|
||||||
|
"-p" "/sys d 555 0 0"
|
||||||
|
"-p" "/dev d 555 0 0")))))
|
||||||
|
|
||||||
|
(gexp->derivation (string-append name
|
||||||
|
(compressor-extension compressor)
|
||||||
|
".squashfs")
|
||||||
|
build
|
||||||
|
#:references-graphs `(("profile" ,profile))))
|
||||||
|
|
||||||
(define* (docker-image name profile
|
(define* (docker-image name profile
|
||||||
#:key target
|
#:key target
|
||||||
deduplicate?
|
deduplicate?
|
||||||
|
@ -462,6 +546,7 @@ please email '~a'~%")
|
||||||
(define %formats
|
(define %formats
|
||||||
;; Supported pack formats.
|
;; Supported pack formats.
|
||||||
`((tarball . ,self-contained-tarball)
|
`((tarball . ,self-contained-tarball)
|
||||||
|
(squashfs . ,squashfs-image)
|
||||||
(docker . ,docker-image)))
|
(docker . ,docker-image)))
|
||||||
|
|
||||||
(define %options
|
(define %options
|
||||||
|
@ -626,9 +711,11 @@ Create a bundle of PACKAGE.\n"))
|
||||||
(compressor (if bootstrap?
|
(compressor (if bootstrap?
|
||||||
bootstrap-xz
|
bootstrap-xz
|
||||||
(assoc-ref opts 'compressor)))
|
(assoc-ref opts 'compressor)))
|
||||||
(archiver (if bootstrap?
|
(archiver (if (equal? pack-format 'squashfs)
|
||||||
%bootstrap-coreutils&co
|
squashfs-tools-next
|
||||||
tar))
|
(if bootstrap?
|
||||||
|
%bootstrap-coreutils&co
|
||||||
|
tar)))
|
||||||
(symlinks (assoc-ref opts 'symlinks))
|
(symlinks (assoc-ref opts 'symlinks))
|
||||||
(build-image (match (assq-ref %formats pack-format)
|
(build-image (match (assq-ref %formats pack-format)
|
||||||
((? procedure? proc) proc)
|
((? procedure? proc) proc)
|
||||||
|
|
Loading…
Reference in New Issue