summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/services/base.scm32
-rw-r--r--gnu/system.scm2
2 files changed, 32 insertions, 2 deletions
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 595cac254b..35e5d42fa8 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -23,6 +23,8 @@
#:use-module (gnu system shadow) ; 'user-account', etc.
#:use-module (gnu system linux) ; 'pam-service', etc.
#:use-module (gnu packages admin)
+ #:use-module ((gnu packages linux)
+ #:select (udev))
#:use-module ((gnu packages base)
#:select (glibc-final))
#:use-module (gnu packages package-management)
@@ -35,6 +37,7 @@
file-system-service
user-processes-service
host-name-service
+ udev-service
mingetty-service
nscd-service
syslog-service
@@ -397,6 +400,32 @@ hydra.gnu.org are used by default."
(id 30000))))
(activate activate)))))
+(define* (udev-service #:key (udev udev))
+ "Run @var{udev}, which populates the @file{/dev} directory dynamically."
+ (with-monad %store-monad
+ (return (service
+ (provision '(udev))
+ (requirement '(root-file-system))
+ (documentation "Populate the /dev directory.")
+ (start #~(lambda ()
+ (let ((pid (primitive-fork)))
+ (case pid
+ ((0)
+ ;; In dmd 0.1, file descriptor 0 is closed, thus
+ ;; is gets reused when open(2) is called, and it
+ ;; turns out that EPOLL_CTL_ADD of 0 returns
+ ;; EPERM for some reason. So make sure 0 is
+ ;; open.
+ ;; FIXME: Close the other descriptors.
+ (execl (string-append #$udev "/libexec/udev/udevd")
+ "udevd"))
+ (else
+ ;; Create a bunch of devices.
+ (system* (string-append #$udev "/bin/udevadm")
+ "trigger")
+ pid)))))
+ (stop #~(make-kill-destructor))))))
+
(define %base-services
;; Convenience variable holding the basic services.
(let ((motd (text-file "motd" "
@@ -409,6 +438,7 @@ This is the GNU operating system, welcome!\n\n")))
(mingetty-service "tty6" #:motd motd)
(syslog-service)
(guix-service)
- (nscd-service))))
+ (nscd-service)
+ (udev-service))))
;;; base.scm ends here
diff --git a/gnu/system.scm b/gnu/system.scm
index 41ea59b69b..c2d31de15d 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -218,7 +218,7 @@ explicitly appear in OS."
guile-final (@ (gnu packages admin) dmd) guix
util-linux inetutils isc-dhcp
net-tools ; XXX: remove when Inetutils suffices
- module-init-tools kbd
+ module-init-tools udev kbd
;; The packages below are also in %FINAL-INPUTS, so take them from
;; there to avoid duplication.