services: Add cachefilesd service.
Thanks to Bruno Victal "mirai" for cooperating on this patch and for generously sharing a wealth of insights about Guix services. Thanks to Jean-Baptiste Note for an early version of this service! * doc/guix.texi (Linux Services)[Cachefilesd Service]: New heading. * gnu/services/linux.scm (serialize-string, non-negative-integer?) (serialize-non-negative-integer, string, non-negative-integer) (make-option-serializer, make-percentage-threshold-serializer): New procedures. (cachefilesd-configuration): New record type. (cachefilesd-service-type): New variable. * gnu/tests/cachefilesd.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. Co-authored-by: Bruno Victal <mirai@makinata.eu> Signed-off-by: Ludovic Courtès <ludo@gnu.org>
parent
48d06aee7b
commit
b8ee6b8a59
|
@ -117,6 +117,7 @@ Copyright @copyright{} 2023 Karl Hallsby@*
|
|||
Copyright @copyright{} 2023 Nathaniel Nicandro@*
|
||||
Copyright @copyright{} 2023 Tanguy Le Carrour@*
|
||||
Copyright @copyright{} 2023 Brian Cully@*
|
||||
Copyright @copyright{} 2023 Felix Lechner@*
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||||
|
@ -38659,6 +38660,94 @@ parameters, can be done as follow:
|
|||
@end lisp
|
||||
@end defvar
|
||||
|
||||
@subsubheading Cachefilesd Service
|
||||
|
||||
@cindex cachefilesd
|
||||
@cindex fscache, file system caching (Linux)
|
||||
The Cachefilesd service starts a daemon that caches network file system
|
||||
data locally. It is especially useful for NFS and AFS shares, where it
|
||||
reduces latencies for repeated access when reading files.
|
||||
|
||||
The daemon can be configured as follows:
|
||||
|
||||
@lisp
|
||||
(service cachefilesd-service-type
|
||||
(cachefilesd-configuration
|
||||
(cache-directory "/var/cache/fscache")))
|
||||
@end lisp
|
||||
|
||||
@defvar cachefilesd-service-type
|
||||
The service type for starting @command{cachefilesd}. The value for this
|
||||
service type is a @code{cachefilesd-configuration}, whose only required
|
||||
field is @var{cache-directory}.
|
||||
|
||||
@end defvar
|
||||
|
||||
@c %start of fragment
|
||||
@deftp {Data Type} cachefilesd-configuration
|
||||
Available @code{cachefilesd-configuration} fields are:
|
||||
|
||||
@table @asis
|
||||
@item @code{cachefilesd} (default: @code{cachefilesd}) (type: file-like)
|
||||
The cachefilesd package to use.
|
||||
|
||||
@item @code{debug-output?} (default: @code{#f}) (type: boolean)
|
||||
Print debugging output to stderr.
|
||||
|
||||
@item @code{use-syslog?} (default: @code{#t}) (type: boolean)
|
||||
Log to syslog facility instead of stdout.
|
||||
|
||||
@item @code{scan?} (default: @code{#t}) (type: boolean)
|
||||
Scan for cachable objects.
|
||||
|
||||
@item @code{cache-directory} (type: maybe-string)
|
||||
Location of the cache directory.
|
||||
|
||||
@item @code{cache-name} (default: @code{"CacheFiles"}) (type: maybe-string)
|
||||
Name of cache (keep unique).
|
||||
|
||||
@item @code{security-context} (type: maybe-string)
|
||||
SELinux security context.
|
||||
|
||||
@item @code{pause-culling-for-block-percentage} (default: @code{7}) (type: maybe-non-negative-integer)
|
||||
Pause culling when available blocks exceed this percentage.
|
||||
|
||||
@item @code{pause-culling-for-file-percentage} (default: @code{7}) (type: maybe-non-negative-integer)
|
||||
Pause culling when available files exceed this percentage.
|
||||
|
||||
@item @code{resume-culling-for-block-percentage} (default: @code{5}) (type: maybe-non-negative-integer)
|
||||
Start culling when available blocks drop below this percentage.
|
||||
|
||||
@item @code{resume-culling-for-file-percentage} (default: @code{5}) (type: maybe-non-negative-integer)
|
||||
Start culling when available files drop below this percentage.
|
||||
|
||||
@item @code{pause-caching-for-block-percentage} (default: @code{1}) (type: maybe-non-negative-integer)
|
||||
Pause further allocations when available blocks drop below this
|
||||
percentage.
|
||||
|
||||
@item @code{pause-caching-for-file-percentage} (default: @code{1}) (type: maybe-non-negative-integer)
|
||||
Pause further allocations when available files drop below this
|
||||
percentage.
|
||||
|
||||
@item @code{log2-table-size} (default: @code{12}) (type: maybe-non-negative-integer)
|
||||
Size of tables holding cullable objects in logarithm of base 2.
|
||||
|
||||
@item @code{cull?} (default: @code{#t}) (type: boolean)
|
||||
Create free space by culling (consumes system load).
|
||||
|
||||
@item @code{trace-function-entry-in-kernel-module?} (default: @code{#f}) (type: boolean)
|
||||
Trace function entry in the kernel module (for debugging).
|
||||
|
||||
@item @code{trace-function-exit-in-kernel-module?} (default: @code{#f}) (type: boolean)
|
||||
Trace function exit in the kernel module (for debugging).
|
||||
|
||||
@item @code{trace-internal-checkpoints-in-kernel-module?} (default: @code{#f}) (type: boolean)
|
||||
Trace internal checkpoints in the kernel module (for debugging).
|
||||
|
||||
@end table
|
||||
@end deftp
|
||||
@c %end of fragment
|
||||
|
||||
@cindex rasdaemon
|
||||
@cindex Platform Reliability, Availability and Serviceability daemon
|
||||
@subsubheading Rasdaemon Service
|
||||
|
|
|
@ -770,6 +770,7 @@ GNU_SYSTEM_MODULES = \
|
|||
%D%/tests.scm \
|
||||
%D%/tests/audio.scm \
|
||||
%D%/tests/base.scm \
|
||||
%D%/tests/cachefilesd.scm \
|
||||
%D%/tests/ci.scm \
|
||||
%D%/tests/cups.scm \
|
||||
%D%/tests/databases.scm \
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
;;; Copyright © 2021 B. Wilson <elaexuotee@wilsonb.com>
|
||||
;;; Copyright © 2022 Josselin Poiret <dev@jpoiret.xyz>
|
||||
;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
|
||||
;;; Copyright © 2023 Felix Lechner <felix.lechner@lease-up.com>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
|
@ -67,6 +68,28 @@
|
|||
|
||||
kernel-module-loader-service-type
|
||||
|
||||
cachefilesd-configuration
|
||||
cachefilesd-configuration?
|
||||
cachefilesd-configuration-cachefilesd
|
||||
cachefilesd-configuration-debug-output?
|
||||
cachefilesd-configuration-use-syslog?
|
||||
cachefilesd-configuration-scan?
|
||||
cachefilesd-configuration-cache-directory
|
||||
cachefilesd-configuration-cache-name
|
||||
cachefilesd-configuration-security-context
|
||||
cachefilesd-configuration-pause-culling-for-block-percentage
|
||||
cachefilesd-configuration-pause-culling-for-file-percentage
|
||||
cachefilesd-configuration-resume-culling-for-block-percentage
|
||||
cachefilesd-configuration-resume-culling-for-file-percentage
|
||||
cachefilesd-configuration-pause-caching-for-block-percentage
|
||||
cachefilesd-configuration-pause-caching-for-file-percentage
|
||||
cachefilesd-configuration-log2-table-size
|
||||
cachefilesd-configuration-cull?
|
||||
cachefilesd-configuration-trace-function-entry-in-kernel-module
|
||||
cachefilesd-configuration-trace-function-exit-in-kernel-module
|
||||
cachefilesd-configuration-trace-internal-checkpoints-in-kernel-module
|
||||
cachefilesd-service-type
|
||||
|
||||
rasdaemon-configuration
|
||||
rasdaemon-configuration?
|
||||
rasdaemon-configuration-record?
|
||||
|
@ -306,6 +329,180 @@ more information)."
|
|||
(extend append)
|
||||
(default-value '())))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Cachefilesd, an FS-Cache daemon
|
||||
;;;
|
||||
|
||||
(define (serialize-string variable-symbol value)
|
||||
#~(format #f "~a ~a~%" #$(symbol->string variable-symbol) #$value))
|
||||
|
||||
(define-maybe string)
|
||||
|
||||
(define (non-negative-integer? val)
|
||||
(and (exact-integer? val) (not (negative? val))))
|
||||
|
||||
(define (serialize-non-negative-integer variable-symbol value)
|
||||
#~(format #f "~a ~d~%" #$(symbol->string variable-symbol) #$value))
|
||||
|
||||
(define-maybe non-negative-integer)
|
||||
|
||||
(define (make-option-serializer option-symbol)
|
||||
(lambda (variable-symbol text)
|
||||
(if (maybe-value-set? text)
|
||||
#~(format #f "~a ~a~%" #$(symbol->string option-symbol) #$text)
|
||||
"")))
|
||||
|
||||
(define (make-percentage-threshold-serializer threshold-symbol)
|
||||
(lambda (variable-symbol percentage)
|
||||
(if (maybe-value-set? percentage)
|
||||
#~(format #f "~a ~a%~%" #$(symbol->string threshold-symbol) #$percentage)
|
||||
"")))
|
||||
|
||||
(define-configuration cachefilesd-configuration
|
||||
(cachefilesd
|
||||
(file-like cachefilesd)
|
||||
"The cachefilesd package to use."
|
||||
(serializer empty-serializer))
|
||||
|
||||
;; command-line options
|
||||
(debug-output?
|
||||
(boolean #f)
|
||||
"Print debugging output to stderr."
|
||||
(serializer empty-serializer))
|
||||
|
||||
(use-syslog?
|
||||
(boolean #t)
|
||||
"Log to syslog facility instead of stdout."
|
||||
(serializer empty-serializer))
|
||||
|
||||
;; culling is part of the configuration file
|
||||
;; despite the name of the command-line option
|
||||
(scan?
|
||||
(boolean #t)
|
||||
"Scan for cachable objects."
|
||||
(serializer empty-serializer))
|
||||
|
||||
;; sole required field in the configuration file
|
||||
(cache-directory
|
||||
maybe-string
|
||||
"Location of the cache directory."
|
||||
(serializer (make-option-serializer 'dir)))
|
||||
|
||||
(cache-name
|
||||
(maybe-string "CacheFiles")
|
||||
"Name of cache (keep unique)."
|
||||
(serializer (make-option-serializer 'tag)))
|
||||
|
||||
(security-context
|
||||
maybe-string
|
||||
"SELinux security context."
|
||||
(serializer (make-option-serializer 'secctx)))
|
||||
|
||||
;; percentage thresholds in the configuration file
|
||||
(pause-culling-for-block-percentage
|
||||
(maybe-non-negative-integer 7)
|
||||
"Pause culling when available blocks exceed this percentage."
|
||||
(serializer (make-percentage-threshold-serializer 'brun)))
|
||||
|
||||
(pause-culling-for-file-percentage
|
||||
(maybe-non-negative-integer 7)
|
||||
"Pause culling when available files exceed this percentage."
|
||||
(serializer (make-percentage-threshold-serializer 'frun)))
|
||||
|
||||
(resume-culling-for-block-percentage
|
||||
(maybe-non-negative-integer 5)
|
||||
"Start culling when available blocks drop below this percentage."
|
||||
(serializer (make-percentage-threshold-serializer 'bcull)))
|
||||
|
||||
(resume-culling-for-file-percentage
|
||||
(maybe-non-negative-integer 5)
|
||||
"Start culling when available files drop below this percentage."
|
||||
(serializer (make-percentage-threshold-serializer 'fcull)))
|
||||
|
||||
(pause-caching-for-block-percentage
|
||||
(maybe-non-negative-integer 1)
|
||||
"Pause further allocations when available blocks drop below this percentage."
|
||||
(serializer (make-percentage-threshold-serializer 'bstop)))
|
||||
|
||||
(pause-caching-for-file-percentage
|
||||
(maybe-non-negative-integer 1)
|
||||
"Pause further allocations when available files drop below this percentage."
|
||||
(serializer (make-percentage-threshold-serializer 'fstop)))
|
||||
|
||||
;; run time optimizations in the configuration file
|
||||
(log2-table-size
|
||||
(maybe-non-negative-integer 12)
|
||||
"Size of tables holding cullable objects in logarithm of base 2."
|
||||
(serializer (make-option-serializer 'culltable)))
|
||||
|
||||
(cull?
|
||||
(boolean #t)
|
||||
"Create free space by culling (consumes system load)."
|
||||
(serializer
|
||||
(lambda (variable-symbol value)
|
||||
(if value "" "nocull\n"))))
|
||||
|
||||
;; kernel module debugging in the configuration file
|
||||
(trace-function-entry-in-kernel-module?
|
||||
(boolean #f)
|
||||
"Trace function entry in the kernel module (for debugging)."
|
||||
(serializer empty-serializer))
|
||||
|
||||
(trace-function-exit-in-kernel-module?
|
||||
(boolean #f)
|
||||
"Trace function exit in the kernel module (for debugging)."
|
||||
(serializer empty-serializer))
|
||||
|
||||
(trace-internal-checkpoints-in-kernel-module?
|
||||
(boolean #f)
|
||||
"Trace internal checkpoints in the kernel module (for debugging)."
|
||||
(serializer empty-serializer)))
|
||||
|
||||
(define (serialize-cachefilesd-configuration configuration)
|
||||
(mixed-text-file
|
||||
"cachefilesd.conf"
|
||||
(serialize-configuration configuration cachefilesd-configuration-fields)))
|
||||
|
||||
(define (cachefilesd-shepherd-service config)
|
||||
"Return a list of <shepherd-service> for cachefilesd for CONFIG."
|
||||
(match-record
|
||||
config <cachefilesd-configuration> (cachefilesd
|
||||
debug-output?
|
||||
use-syslog?
|
||||
scan?
|
||||
cache-directory)
|
||||
(let ((configuration-file (serialize-cachefilesd-configuration config)))
|
||||
(shepherd-service
|
||||
(documentation "Run the cachefilesd daemon for FS-Cache.")
|
||||
(provision '(cachefilesd))
|
||||
(requirement (append '(file-systems)
|
||||
(if use-syslog? '(syslogd) '())))
|
||||
(start #~(begin
|
||||
(and=> #$(maybe-value cache-directory) mkdir-p)
|
||||
(make-forkexec-constructor
|
||||
`(#$(file-append cachefilesd "/sbin/cachefilesd")
|
||||
;; do not detach
|
||||
"-n"
|
||||
#$@(if debug-output? '("-d") '())
|
||||
#$@(if use-syslog? '() '("-s"))
|
||||
#$@(if scan? '() '("-N"))
|
||||
"-f" #$configuration-file))))
|
||||
(stop #~(make-kill-destructor))))))
|
||||
|
||||
(define cachefilesd-service-type
|
||||
(service-type
|
||||
(name 'cachefilesd)
|
||||
(description
|
||||
"Run the file system cache daemon @command{cachefilesd}, which relies on
|
||||
the Linux @code{cachefiles} module.")
|
||||
(extensions
|
||||
(list (service-extension kernel-module-loader-service-type
|
||||
(const '("cachefiles")))
|
||||
(service-extension shepherd-root-service-type
|
||||
(compose list cachefilesd-shepherd-service))))
|
||||
(default-value (cachefilesd-configuration))))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Reliability, Availability, and Serviceability (RAS) daemon
|
||||
|
@ -351,7 +548,7 @@ more information)."
|
|||
|
||||
|
||||
;;;
|
||||
;;; Kernel module loader.
|
||||
;;; Zram device
|
||||
;;;
|
||||
|
||||
(define-record-type* <zram-device-configuration>
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2017 Peter Mikkelsen <petermikkelsen10@gmail.com>
|
||||
;;; Copyright © 2022 Bruno Victal <mirai@makinata.eu>
|
||||
;;; Copyright © 2023 Felix Lechner <felix.lechner@lease-up.com>
|
||||
;;;
|
||||
;;; 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 tests cachefilesd)
|
||||
#:use-module (gnu tests)
|
||||
#:use-module (gnu system)
|
||||
#:use-module (gnu system vm)
|
||||
#:use-module (gnu services)
|
||||
#:use-module (gnu services linux)
|
||||
#:use-module (guix gexp)
|
||||
#:export (%test-cachefilesd))
|
||||
|
||||
(define %cachefilesd-os
|
||||
(simple-operating-system
|
||||
(service cachefilesd-service-type
|
||||
(cachefilesd-configuration
|
||||
(cache-directory "/var/cache/fscache")))))
|
||||
|
||||
(define (run-cachefilesd-test)
|
||||
"Run tests in %cachefilesd-os, which has cachefilesd running."
|
||||
(define os
|
||||
(marionette-operating-system
|
||||
%cachefilesd-os
|
||||
#:imported-modules '((gnu services herd))))
|
||||
|
||||
(define vm
|
||||
(virtual-machine os))
|
||||
|
||||
(define test
|
||||
(with-imported-modules '((gnu build marionette))
|
||||
#~(begin
|
||||
(use-modules (srfi srfi-64)
|
||||
(gnu build marionette))
|
||||
(define marionette
|
||||
(make-marionette (list #$vm)))
|
||||
|
||||
(test-runner-current (system-test-runner #$output))
|
||||
(test-begin "cachefilesd")
|
||||
|
||||
(test-assert "service is running"
|
||||
(marionette-eval
|
||||
'(begin
|
||||
(use-modules (gnu services herd))
|
||||
(start-service 'cachefilesd))
|
||||
marionette))
|
||||
|
||||
(test-end))))
|
||||
(gexp->derivation "cachefilesd-test" test))
|
||||
|
||||
(define %test-cachefilesd
|
||||
(system-test
|
||||
(name "cachefilesd")
|
||||
(description "Test that the cachefilesd runs when started.")
|
||||
(value (run-cachefilesd-test))))
|
Reference in New Issue