mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-25 05:48:07 -05:00
gnu: Allow services to install kernel-loadable modules.
* gnu/system.scm (operating-system-directory-base-entries): Remove code to handle generation of "kernel" for linux-libre kernels. (operating-system-default-essential-services): Instantiate linux-builder-service-type. (package-for-kernel): Move ... * gnu/services.scm: ... to here. (linux-builder-service-type): New variable. (linux-builder-configuration): New type. (linux-loadable-module-service-type): New variable. * gnu/tests/linux-modules.scm (run-loadable-kernel-modules-test): Move code to ... (run-loadable-kernel-modules-test-base): ... new procedure here. (run-loadable-kernel-modules-service-test): New procedure. (%test-loadable-kernel-modules-service-0): New variable. (%test-loadable-kernel-modules-service-1): New variable. (%test-loadable-kernel-modules-service-2): New variable. * doc/guix.texi: Document linux-loadable-module-service-type. Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org>
This commit is contained in:
parent
bddad00bff
commit
a3df382525
4 changed files with 191 additions and 35 deletions
|
@ -34280,6 +34280,28 @@ configuration when you use @command{guix system reconfigure},
|
||||||
@command{guix system init}, or @command{guix deploy}.
|
@command{guix system init}, or @command{guix deploy}.
|
||||||
@end defvr
|
@end defvr
|
||||||
|
|
||||||
|
@defvr {Scheme Variable} linux-loadable-module-service-type
|
||||||
|
Type of the service that collects lists of packages containing
|
||||||
|
kernel-loadable modules, and adds them to the set of kernel-loadable
|
||||||
|
modules.
|
||||||
|
|
||||||
|
This service type is intended to be extended by other service types,
|
||||||
|
such as below:
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
(define module-installing-service-type
|
||||||
|
(service-type
|
||||||
|
(name 'module-installing-service)
|
||||||
|
(extensions (list (service-extension linux-loadable-module-service-type
|
||||||
|
(const (list module-to-install-1
|
||||||
|
module-to-install-2)))))
|
||||||
|
(default-value #f)))
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
This does not actually load modules at bootup, only adds it to the
|
||||||
|
kernel profile so that it @emph{can} be loaded by other means.
|
||||||
|
@end defvr
|
||||||
|
|
||||||
@node Shepherd Services
|
@node Shepherd Services
|
||||||
@subsection Shepherd Services
|
@subsection Shepherd Services
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
|
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
|
||||||
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
;;; Copyright © 2020, 2021 Ricardo Wurmus <rekado@elephly.net>
|
;;; Copyright © 2020, 2021 Ricardo Wurmus <rekado@elephly.net>
|
||||||
|
;;; Copyright © 2021 raid5atemyhomework <raid5atemyhomework@protonmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -34,6 +35,8 @@ (define-module (gnu services)
|
||||||
#:use-module (guix diagnostics)
|
#:use-module (guix diagnostics)
|
||||||
#:autoload (guix openpgp) (openpgp-format-fingerprint)
|
#:autoload (guix openpgp) (openpgp-format-fingerprint)
|
||||||
#:use-module (guix modules)
|
#:use-module (guix modules)
|
||||||
|
#:use-module (guix packages)
|
||||||
|
#:use-module (guix utils)
|
||||||
#:use-module (gnu packages base)
|
#:use-module (gnu packages base)
|
||||||
#:use-module (gnu packages bash)
|
#:use-module (gnu packages bash)
|
||||||
#:use-module (gnu packages hurd)
|
#:use-module (gnu packages hurd)
|
||||||
|
@ -107,6 +110,12 @@ (define-module (gnu services)
|
||||||
profile-service-type
|
profile-service-type
|
||||||
firmware-service-type
|
firmware-service-type
|
||||||
gc-root-service-type
|
gc-root-service-type
|
||||||
|
linux-builder-service-type
|
||||||
|
linux-builder-configuration
|
||||||
|
linux-builder-configuration?
|
||||||
|
linux-builder-configuration-kernel
|
||||||
|
linux-builder-configuration-modules
|
||||||
|
linux-loadable-module-service-type
|
||||||
|
|
||||||
%boot-service
|
%boot-service
|
||||||
%activation-service
|
%activation-service
|
||||||
|
@ -883,6 +892,87 @@ (define gc-root-service-type
|
||||||
will not be reclaimed by the garbage collector.")
|
will not be reclaimed by the garbage collector.")
|
||||||
(default-value '())))
|
(default-value '())))
|
||||||
|
|
||||||
|
;; Configuration for the Linux kernel builder.
|
||||||
|
(define-record-type* <linux-builder-configuration>
|
||||||
|
linux-builder-configuration
|
||||||
|
make-linux-builder-configuration
|
||||||
|
linux-builder-configuration?
|
||||||
|
this-linux-builder-configuration
|
||||||
|
|
||||||
|
(kernel linux-builder-configuration-kernel) ; package
|
||||||
|
(modules linux-builder-configuration-modules (default '()))) ; list of packages
|
||||||
|
|
||||||
|
(define (package-for-kernel target-kernel module-package)
|
||||||
|
"Return a package like MODULE-PACKAGE, adapted for TARGET-KERNEL, if
|
||||||
|
possible (that is if there's a LINUX keyword argument in the build system)."
|
||||||
|
(package
|
||||||
|
(inherit module-package)
|
||||||
|
(arguments
|
||||||
|
(substitute-keyword-arguments (package-arguments module-package)
|
||||||
|
((#:linux kernel #f)
|
||||||
|
target-kernel)))))
|
||||||
|
|
||||||
|
(define (linux-builder-configuration->system-entry config)
|
||||||
|
"Return the kernel entry of the 'system' directory."
|
||||||
|
(let* ((kernel (linux-builder-configuration-kernel config))
|
||||||
|
(modules (linux-builder-configuration-modules config))
|
||||||
|
(kernel (profile
|
||||||
|
(content (packages->manifest
|
||||||
|
(cons kernel
|
||||||
|
(map (lambda (module)
|
||||||
|
(cond
|
||||||
|
((package? module)
|
||||||
|
(package-for-kernel kernel module))
|
||||||
|
;; support (,package "kernel-module-output")
|
||||||
|
((and (list? module) (package? (car module)))
|
||||||
|
(cons (package-for-kernel kernel
|
||||||
|
(car module))
|
||||||
|
(cdr module)))
|
||||||
|
(else
|
||||||
|
module)))
|
||||||
|
modules))))
|
||||||
|
(hooks (list linux-module-database)))))
|
||||||
|
(with-monad %store-monad
|
||||||
|
(return `(("kernel" ,kernel))))))
|
||||||
|
|
||||||
|
(define linux-builder-service-type
|
||||||
|
(service-type (name 'linux-builder)
|
||||||
|
(extensions
|
||||||
|
(list (service-extension system-service-type
|
||||||
|
linux-builder-configuration->system-entry)))
|
||||||
|
(default-value '())
|
||||||
|
(compose identity)
|
||||||
|
(extend (lambda (config modifiers)
|
||||||
|
(if (null? modifiers)
|
||||||
|
config
|
||||||
|
((apply compose modifiers) config))))
|
||||||
|
(description "Builds the linux-libre kernel profile, containing
|
||||||
|
the kernel itself and any linux-loadable kernel modules. This can be extended
|
||||||
|
with a function that accepts the current configuration and returns a new
|
||||||
|
configuration.")))
|
||||||
|
|
||||||
|
(define (linux-loadable-module-builder-modifier modules)
|
||||||
|
"Extends linux-builder-service-type by appending the given MODULES to the
|
||||||
|
configuration of linux-builder-service-type."
|
||||||
|
(lambda (config)
|
||||||
|
(linux-builder-configuration
|
||||||
|
(inherit config)
|
||||||
|
(modules (append (linux-builder-configuration-modules config)
|
||||||
|
modules)))))
|
||||||
|
|
||||||
|
(define linux-loadable-module-service-type
|
||||||
|
(service-type (name 'linux-loadable-modules)
|
||||||
|
(extensions
|
||||||
|
(list (service-extension linux-builder-service-type
|
||||||
|
linux-loadable-module-builder-modifier)))
|
||||||
|
(default-value '())
|
||||||
|
(compose concatenate)
|
||||||
|
(extend append)
|
||||||
|
(description "Adds packages and package outputs as modules
|
||||||
|
included in the booted linux-libre profile. Other services can extend this
|
||||||
|
service type to add particular modules to the set of linux-loadable modules.")))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
;;; Service folding.
|
;;; Service folding.
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <jannek@gnu.org>
|
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <jannek@gnu.org>
|
||||||
;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il>
|
;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il>
|
||||||
;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
|
;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
|
||||||
|
;;; Copyright © 2021 raid5atemyhomework <raid5atemyhomework@protonmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -601,16 +602,6 @@ (define (operating-system-kernel-file os)
|
||||||
(file-append (operating-system-kernel os)
|
(file-append (operating-system-kernel os)
|
||||||
"/" (system-linux-image-file-name))))
|
"/" (system-linux-image-file-name))))
|
||||||
|
|
||||||
(define (package-for-kernel target-kernel module-package)
|
|
||||||
"Return a package like MODULE-PACKAGE, adapted for TARGET-KERNEL, if
|
|
||||||
possible (that is if there's a LINUX keyword argument in the build system)."
|
|
||||||
(package
|
|
||||||
(inherit module-package)
|
|
||||||
(arguments
|
|
||||||
(substitute-keyword-arguments (package-arguments module-package)
|
|
||||||
((#:linux kernel #f)
|
|
||||||
target-kernel)))))
|
|
||||||
|
|
||||||
(define %default-modprobe-blacklist
|
(define %default-modprobe-blacklist
|
||||||
;; List of kernel modules to blacklist by default.
|
;; List of kernel modules to blacklist by default.
|
||||||
'("usbmouse" ;races with bcm5974, see <https://bugs.gnu.org/35574>
|
'("usbmouse" ;races with bcm5974, see <https://bugs.gnu.org/35574>
|
||||||
|
@ -628,23 +619,12 @@ (define* (operating-system-directory-base-entries os)
|
||||||
(let* ((locale (operating-system-locale-directory os))
|
(let* ((locale (operating-system-locale-directory os))
|
||||||
(kernel (operating-system-kernel os))
|
(kernel (operating-system-kernel os))
|
||||||
(hurd (operating-system-hurd os))
|
(hurd (operating-system-hurd os))
|
||||||
(modules (operating-system-kernel-loadable-modules os))
|
|
||||||
(kernel (if hurd
|
|
||||||
kernel
|
|
||||||
(profile
|
|
||||||
(content (packages->manifest
|
|
||||||
(cons kernel
|
|
||||||
(map (lambda (module)
|
|
||||||
(if (package? module)
|
|
||||||
(package-for-kernel kernel
|
|
||||||
module)
|
|
||||||
module))
|
|
||||||
modules))))
|
|
||||||
(hooks (list linux-module-database)))))
|
|
||||||
(initrd (and (not hurd) (operating-system-initrd-file os)))
|
(initrd (and (not hurd) (operating-system-initrd-file os)))
|
||||||
(params (operating-system-boot-parameters-file os)))
|
(params (operating-system-boot-parameters-file os)))
|
||||||
`(("kernel" ,kernel)
|
`(,@(if hurd
|
||||||
,@(if hurd `(("hurd" ,hurd)) '())
|
`(("hurd" ,hurd)
|
||||||
|
("kernel" ,kernel))
|
||||||
|
'())
|
||||||
("parameters" ,params)
|
("parameters" ,params)
|
||||||
,@(if initrd `(("initrd" ,initrd)) '())
|
,@(if initrd `(("initrd" ,initrd)) '())
|
||||||
("locale" ,locale)))) ;used by libc
|
("locale" ,locale)))) ;used by libc
|
||||||
|
@ -664,6 +644,10 @@ (define known-fs
|
||||||
(host-name (host-name-service (operating-system-host-name os)))
|
(host-name (host-name-service (operating-system-host-name os)))
|
||||||
(entries (operating-system-directory-base-entries os)))
|
(entries (operating-system-directory-base-entries os)))
|
||||||
(cons* (service system-service-type entries)
|
(cons* (service system-service-type entries)
|
||||||
|
(service linux-builder-service-type
|
||||||
|
(linux-builder-configuration
|
||||||
|
(kernel (operating-system-kernel os))
|
||||||
|
(modules (operating-system-kernel-loadable-modules os))))
|
||||||
%boot-service
|
%boot-service
|
||||||
|
|
||||||
;; %SHEPHERD-ROOT-SERVICE must come last so that the gexp that
|
;; %SHEPHERD-ROOT-SERVICE must come last so that the gexp that
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
;;; Copyright © 2019 Jakob L. Kreuze <zerodaysfordays@sdf.org>
|
;;; Copyright © 2019 Jakob L. Kreuze <zerodaysfordays@sdf.org>
|
||||||
;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org>
|
;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org>
|
||||||
;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
|
;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
|
||||||
|
;;; Copyright © 2021 raid5atemyhomework <raid5atemyhomework@protonmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -34,7 +35,10 @@ (define-module (gnu tests linux-modules)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
#:export (%test-loadable-kernel-modules-0
|
#:export (%test-loadable-kernel-modules-0
|
||||||
%test-loadable-kernel-modules-1
|
%test-loadable-kernel-modules-1
|
||||||
%test-loadable-kernel-modules-2))
|
%test-loadable-kernel-modules-2
|
||||||
|
%test-loadable-kernel-modules-service-0
|
||||||
|
%test-loadable-kernel-modules-service-1
|
||||||
|
%test-loadable-kernel-modules-service-2))
|
||||||
|
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
;;;
|
;;;
|
||||||
|
@ -66,17 +70,11 @@ (define* (modules-loaded?-program os modules)
|
||||||
(member module modules string=?))
|
(member module modules string=?))
|
||||||
'#$modules))))))
|
'#$modules))))))
|
||||||
|
|
||||||
(define* (run-loadable-kernel-modules-test module-packages module-names)
|
(define* (run-loadable-kernel-modules-test-base base-os module-names)
|
||||||
"Run a test of an OS having MODULE-PACKAGES, and verify that MODULE-NAMES
|
"Run a test of BASE-OS, verifying that MODULE-NAMES are loaded in memory."
|
||||||
are loaded in memory."
|
|
||||||
(define os
|
(define os
|
||||||
(marionette-operating-system
|
(marionette-operating-system
|
||||||
(operating-system
|
base-os
|
||||||
(inherit (simple-operating-system))
|
|
||||||
(services (cons (service kernel-module-loader-service-type module-names)
|
|
||||||
(operating-system-user-services
|
|
||||||
(simple-operating-system))))
|
|
||||||
(kernel-loadable-modules module-packages))
|
|
||||||
#:imported-modules '((guix combinators))))
|
#:imported-modules '((guix combinators))))
|
||||||
(define vm (virtual-machine os))
|
(define vm (virtual-machine os))
|
||||||
(define (test script)
|
(define (test script)
|
||||||
|
@ -98,6 +96,36 @@ (define marionette
|
||||||
(gexp->derivation "loadable-kernel-modules"
|
(gexp->derivation "loadable-kernel-modules"
|
||||||
(test (modules-loaded?-program os module-names))))
|
(test (modules-loaded?-program os module-names))))
|
||||||
|
|
||||||
|
(define* (run-loadable-kernel-modules-test module-packages module-names)
|
||||||
|
"Run a test of an OS having MODULE-PACKAGES, and verify that MODULE-NAMES
|
||||||
|
are loaded in memory."
|
||||||
|
(run-loadable-kernel-modules-test-base
|
||||||
|
(operating-system
|
||||||
|
(inherit (simple-operating-system))
|
||||||
|
(services (cons (service kernel-module-loader-service-type module-names)
|
||||||
|
(operating-system-user-services
|
||||||
|
(simple-operating-system))))
|
||||||
|
(kernel-loadable-modules module-packages))
|
||||||
|
module-names))
|
||||||
|
|
||||||
|
(define* (run-loadable-kernel-modules-service-test module-packages module-names)
|
||||||
|
"Run a test of an OS having MODULE-PACKAGES, which are loaded by creating a
|
||||||
|
service that extends LINUXL-LOADABLE-MODULE-SERVICE-TYPE. Then verify that
|
||||||
|
MODULE-NAMES are loaded in memory."
|
||||||
|
(define module-installing-service-type
|
||||||
|
(service-type
|
||||||
|
(name 'module-installing-service)
|
||||||
|
(extensions (list (service-extension linux-loadable-module-service-type
|
||||||
|
(const module-packages))))
|
||||||
|
(default-value #f)))
|
||||||
|
(run-loadable-kernel-modules-test-base
|
||||||
|
(operating-system
|
||||||
|
(inherit (simple-operating-system))
|
||||||
|
(services (cons* (service module-installing-service-type)
|
||||||
|
(operating-system-user-services
|
||||||
|
(simple-operating-system)))))
|
||||||
|
module-names))
|
||||||
|
|
||||||
(define %test-loadable-kernel-modules-0
|
(define %test-loadable-kernel-modules-0
|
||||||
(system-test
|
(system-test
|
||||||
(name "loadable-kernel-modules-0")
|
(name "loadable-kernel-modules-0")
|
||||||
|
@ -129,3 +157,35 @@ (define %test-loadable-kernel-modules-2
|
||||||
(package-arguments
|
(package-arguments
|
||||||
ddcci-driver-linux))))))
|
ddcci-driver-linux))))))
|
||||||
'("acpi_call" "ddcci")))))
|
'("acpi_call" "ddcci")))))
|
||||||
|
|
||||||
|
(define %test-loadable-kernel-modules-service-0
|
||||||
|
(system-test
|
||||||
|
(name "loadable-kernel-modules-service-0")
|
||||||
|
(description "Tests loadable kernel modules extensible service with no
|
||||||
|
extra modules.")
|
||||||
|
(value (run-loadable-kernel-modules-service-test '() '()))))
|
||||||
|
|
||||||
|
(define %test-loadable-kernel-modules-service-1
|
||||||
|
(system-test
|
||||||
|
(name "loadable-kernel-modules-service-1")
|
||||||
|
(description "Tests loadable kernel modules extensible service with one
|
||||||
|
extra module.")
|
||||||
|
(value (run-loadable-kernel-modules-service-test
|
||||||
|
(list ddcci-driver-linux)
|
||||||
|
'("ddcci")))))
|
||||||
|
|
||||||
|
(define %test-loadable-kernel-modules-service-2
|
||||||
|
(system-test
|
||||||
|
(name "loadable-kernel-modules-service-2")
|
||||||
|
(description "Tests loadable kernel modules extensible service with two
|
||||||
|
extra modules.")
|
||||||
|
(value (run-loadable-kernel-modules-service-test
|
||||||
|
(list acpi-call-linux-module
|
||||||
|
(package
|
||||||
|
(inherit ddcci-driver-linux)
|
||||||
|
(arguments
|
||||||
|
`(#:linux #f
|
||||||
|
,@(strip-keyword-arguments '(#:linux)
|
||||||
|
(package-arguments
|
||||||
|
ddcci-driver-linux))))))
|
||||||
|
'("acpi_call" "ddcci")))))
|
||||||
|
|
Loading…
Reference in a new issue