services: udev: Allow for additional udev rules.

* gnu/services/base.scm (udev-rules-union): New procedure.
  (udev-service): Add #:rules parameter.  Call 'udev-rules-union' and
  create udev.conf.  Set $UDEV_CONFIG_FILE before spawning udevd.
This commit is contained in:
Ludovic Courtès 2014-09-11 22:13:37 +02:00
parent c65e183403
commit ecd06ca9fa
1 changed files with 42 additions and 5 deletions

View File

@ -25,7 +25,7 @@
#:use-module (gnu system linux) ; 'pam-service', etc. #:use-module (gnu system linux) ; 'pam-service', etc.
#:use-module (gnu packages admin) #:use-module (gnu packages admin)
#:use-module ((gnu packages linux) #:use-module ((gnu packages linux)
#:select (udev kbd e2fsprogs)) #:select (udev kbd e2fsprogs lvm2))
#:use-module ((gnu packages base) #:use-module ((gnu packages base)
#:select (canonical-package glibc)) #:select (canonical-package glibc))
#:use-module (gnu packages package-management) #:use-module (gnu packages package-management)
@ -479,9 +479,41 @@ passed to @command{guix-daemon}."
(id 30000)))) (id 30000))))
(activate activate))))) (activate activate)))))
(define* (udev-service #:key (udev udev)) (define (udev-rules-union packages)
"Run @var{udev}, which populates the @file{/dev} directory dynamically." "Return the union of the @code{lib/udev/rules.d} directories found in each
(with-monad %store-monad item of @var{packages}."
(define build
#~(begin
(use-modules (guix build union)
(guix build utils)
(srfi srfi-1)
(srfi srfi-26))
(define %standard-locations
'("/lib/udev/rules.d" "/libexec/udev/rules.d"))
(define (rules-sub-directory directory)
;; Return the sub-directory of DIRECTORY containing udev rules, or
;; #f if none was found.
(find directory-exists?
(map (cut string-append directory <>) %standard-locations)))
(mkdir-p (string-append #$output "/lib/udev"))
(union-build (string-append #$output "/lib/udev/rules.d")
(filter-map rules-sub-directory '#$packages))))
(gexp->derivation "udev-rules" build
#:modules '((guix build union)
(guix build utils))
#:local-build? #t))
(define* (udev-service #:key (udev udev) (rules '()))
"Run @var{udev}, which populates the @file{/dev} directory dynamically. Get
extra rules from the packages listed in @var{rules}."
(mlet* %store-monad ((rules (udev-rules-union (cons udev rules)))
(udev.conf (text-file* "udev.conf"
"udev_rules=\"" rules
"/lib/udev/rules.d\"\n")))
(return (service (return (service
(provision '(udev)) (provision '(udev))
@ -513,6 +545,8 @@ passed to @command{guix-daemon}."
(setenv "LINUX_MODULE_DIRECTORY" (setenv "LINUX_MODULE_DIRECTORY"
"/run/booted-system/kernel/lib/modules") "/run/booted-system/kernel/lib/modules")
(setenv "UDEV_CONFIG_FILE" #$udev.conf)
(let ((pid (primitive-fork))) (let ((pid (primitive-fork)))
(case pid (case pid
((0) ((0)
@ -555,6 +589,9 @@ This is the GNU operating system, welcome!\n\n")))
(syslog-service) (syslog-service)
(guix-service) (guix-service)
(nscd-service) (nscd-service)
(udev-service))))
;; By default, enable the udev rules of LVM2. They are needed as
;; soon as LVM2 or the device-mapper is used.
(udev-service #:rules (list lvm2)))))
;;; base.scm ends here ;;; base.scm ends here