;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès ;;; ;;; 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 . (define-module (gnu system file-systems) #:use-module (ice-9 match) #:use-module (guix records) #:use-module (guix store) #:use-module ((gnu build file-systems) #:select (string->uuid uuid->string)) #:re-export (string->uuid uuid->string) #:export ( 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-mount? file-system-check? file-system-create-mount-point? file-system-dependencies file-system->spec specification->file-system-mapping uuid %fuse-control-file-system %binary-format-file-system %shared-memory-file-system %pseudo-terminal-file-system %tty-gid %immutable-store %control-groups %elogind-file-systems %base-file-systems %container-file-systems 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 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)) (mount? file-system-mount? ; Boolean (default #t)) (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)) (dependencies file-system-dependencies ; list of (default '()))) ; or (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 (($ device title mount-point type flags options _ _ check?) (list device title mount-point type flags options check?)))) (define (specification->file-system-mapping spec writable?) "Read the SPEC and return the corresponding . SPEC is a string of the form \"SOURCE\" or \"SOURCE=TARGET\". The former specifies that SOURCE from the host should be mounted at SOURCE in the other system. The latter format specifies that SOURCE from the host should be mounted at TARGET in the other system." (let ((index (string-index spec #\=))) (if index (file-system-mapping (source (substring spec 0 index)) (target (substring spec (+ 1 index))) (writable? writable?)) (file-system-mapping (source spec) (target spec) (writable? writable?))))) (define-syntax uuid (lambda (s) "Return the bytevector corresponding to the given UUID representation." (syntax-case s () ((_ str) (string? (syntax->datum #'str)) ;; A literal string: do the conversion at expansion time. (let ((bv (string->uuid (syntax->datum #'str)))) (unless bv (syntax-violation 'uuid "invalid UUID" s)) (datum->syntax #'str bv))) ((_ str) #'(string->uuid str))))) ;;; ;;; Common file systems. ;;; (define %fuse-control-file-system ;; Control file system for Linux' file systems in user-space (FUSE). (file-system (device "fusectl") (mount-point