guix-play/gnu/system/file-systems.scm
David Thompson 575b4b092d gnu: system: Move file-system->spec to (gnu system file-systems).
* gnu/system/linux-initrd.scm (file-system->spec): Move this...
* gnu/system/file-systems.scm: ... to here.
2015-07-07 21:20:59 -04:00

243 lines
7.7 KiB
Scheme
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@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 file-systems)
#:use-module (ice-9 match)
#:use-module (guix gexp)
#:use-module (guix records)
#:use-module (guix store)
#:export (<file-system>
file-system
file-system?
file-system-device
file-system-title
file-system-mount-point
file-system-type
file-system-needed-for-boot?
file-system-flags
file-system-options
file-system-check?
file-system-create-mount-point?
file-system->spec
%fuse-control-file-system
%binary-format-file-system
%shared-memory-file-system
%pseudo-terminal-file-system
%devtmpfs-file-system
%immutable-store
%control-groups
%base-file-systems
mapped-device
mapped-device?
mapped-device-source
mapped-device-target
mapped-device-type
mapped-device-kind
mapped-device-kind?
mapped-device-kind-open
mapped-device-kind-close
<file-system-mapping>
file-system-mapping
file-system-mapping?
file-system-mapping-source
file-system-mapping-target
file-system-mapping-writable?
%store-mapping))
;;; Commentary:
;;;
;;; Declaring file systems to be mounted.
;;;
;;; Code:
;; File system declaration.
(define-record-type* <file-system> file-system
make-file-system
file-system?
(device file-system-device) ; string
(title file-system-title ; 'device | 'label | 'uuid
(default 'device))
(mount-point file-system-mount-point) ; string
(type file-system-type) ; string
(flags file-system-flags ; list of symbols
(default '()))
(options file-system-options ; string or #f
(default #f))
(needed-for-boot? %file-system-needed-for-boot? ; Boolean
(default #f))
(check? file-system-check? ; Boolean
(default #t))
(create-mount-point? file-system-create-mount-point? ; Boolean
(default #f)))
(define-inlinable (file-system-needed-for-boot? fs)
"Return true if FS has the 'needed-for-boot?' flag set, or if it's the root
file system."
(or (%file-system-needed-for-boot? fs)
(string=? "/" (file-system-mount-point fs))))
(define (file-system->spec fs)
"Return a list corresponding to file-system FS that can be passed to the
initrd code."
(match fs
(($ <file-system> device title mount-point type flags options _ check?)
(list device title mount-point type flags options check?))))
(define %fuse-control-file-system
;; Control file system for Linux' file systems in user-space (FUSE).
(file-system
(device "fusectl")
(mount-point "/sys/fs/fuse/connections")
(type "fusectl")
(check? #f)))
(define %binary-format-file-system
;; Support for arbitrary executable binary format.
(file-system
(device "binfmt_misc")
(mount-point "/proc/sys/fs/binfmt_misc")
(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.
996)
(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 %shared-memory-file-system
;; Shared memory.
(file-system
(device "tmpfs")
(mount-point "/dev/shm")
(type "tmpfs")
(check? #f)
(flags '(no-suid no-dev))
(options "size=50%") ;TODO: make size configurable
(create-mount-point? #t)))
(define %immutable-store
;; Read-only store to avoid users or daemons accidentally modifying it.
;; 'guix-daemon' has provisions to remount it read-write in its own name
;; space.
(file-system
(device (%store-prefix))
(mount-point (%store-prefix))
(type "none")
(check? #f)
(flags '(read-only bind-mount))))
(define %control-groups
(cons (file-system
(device "cgroup")
(mount-point "/sys/fs/cgroup")
(type "tmpfs")
(check? #f))
(map (lambda (subsystem)
(file-system
(device "cgroup")
(mount-point (string-append "/sys/fs/cgroup/" subsystem))
(type "cgroup")
(check? #f)
(options subsystem)
(create-mount-point? #t)))
'("cpuset" "cpu" "cpuacct" "memory" "devices" "freezer"
"blkio" "perf_event" "hugetlb"))))
(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
%shared-memory-file-system
%immutable-store)
%control-groups))
;;;
;;; Mapped devices, for Linux's device-mapper.
;;;
(define-record-type* <mapped-device> mapped-device
make-mapped-device
mapped-device?
(source mapped-device-source) ;string
(target mapped-device-target) ;string
(type mapped-device-type)) ;<mapped-device-kind>
(define-record-type* <mapped-device-type> mapped-device-kind
make-mapped-device-kind
mapped-device-kind?
(open mapped-device-kind-open) ;source target -> gexp
(close mapped-device-kind-close ;source target -> gexp
(default (const #~(const #f)))))
;;;
;;; Shared file systems, for VMs/containers.
;;;
;; Mapping of host file system SOURCE to mount point TARGET in the guest.
(define-record-type* <file-system-mapping> file-system-mapping
make-file-system-mapping
file-system-mapping?
(source file-system-mapping-source) ;string
(target file-system-mapping-target) ;string
(writable? file-system-mapping-writable? ;Boolean
(default #f)))
(define %store-mapping
;; Mapping of the host's store into the guest.
(file-system-mapping
(source (%store-prefix))
(target (%store-prefix))
(writable? #f)))
;;; file-systems.scm ends here