;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2021 raid5atemyhomework ;;; ;;; 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 services file-systems) #:use-module (guix gexp) #:use-module (gnu services) #:use-module (gnu services shepherd)) ;;; ZFS (define (zfs-loader-shepherd-service system-zfs) (let* ((zpool (file-append system-zfs "/sbin/zpool"))) (list (shepherd-service (documentation "Load ZFS kernel module and import ZFS pools.") (provision '(zfs)) (requirement '(file-systems)) (one-shot? #t) (modules `((srfi srfi-1) (srfi srfi-34) (srfi srfi-35) (rnrs io ports) ,@%default-modules)) (start #~(lambda _ (if (not (file-exists? "/proc/sys/kernel/modprobe")) (begin (format (current-error-port) "error: ~a~%" "Kernel is missing loadable module support.") #f) (and (let ((modprobe (call-with-input-file "/proc/sys/kernel/modprobe" get-line))) (guard (c ((message-condition? c) (format (current-error-port) "error loading 'zfs' kernel module: ~a~%" (condition-message c)) #f)) (invoke/quiet modprobe "--" "zfs"))) (guard (c ((message-condition? c) (format (current-error-port) "error importing zpools: ~a~%" (condition-message c)) #f)) (invoke/quiet #$zpool "import" "-a")))))))))) (define-public zfs-loader-service-type (service-type (name 'zfs-loader) (description "Load ZFS kernel module and import ZFS pools.") (extensions (list (service-extension shepherd-root-service-type zfs-loader-shepherd-service)))))