From ed09bb11cdd3454c00caf10615fac3cdd1791d55 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Thu, 10 Jul 2014 00:20:57 +0200 Subject: services: udev: Improve synchronization when starting. * gnu/services/base.scm (udev-service)[start]: Add 'wait-for-udevd', and call it before running 'udevadm trigger'. Pass --action=add to 'udevadm trigger'. Call 'udevadm settle' after 'udevadm trigger'. --- gnu/services/base.scm | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'gnu') diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 030121625b..c430586dbf 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -409,6 +409,20 @@ hydra.gnu.org are used by default." (define udevd (string-append #$udev "/libexec/udev/udevd")) + (define (wait-for-udevd) + ;; Wait until someone's listening on udevd's control + ;; socket. + (let ((sock (socket AF_UNIX SOCK_SEQPACKET 0))) + (let try () + (catch 'system-error + (lambda () + (connect sock PF_UNIX "/run/udev/control") + (close-port sock)) + (lambda args + (format #t "waiting for udevd...~%") + (usleep 500000) + (try)))))) + ;; Allow udev to find the modules. (setenv "LINUX_MODULE_DIRECTORY" "/run/booted-system/kernel/lib/modules") @@ -418,12 +432,18 @@ hydra.gnu.org are used by default." ((0) (exec-command (list udevd))) (else + ;; Wait until udevd is up and running. This + ;; appears to be needed so that the events + ;; triggered below are actually handled. + (wait-for-udevd) + + ;; Trigger device node creation. + (system* (string-append #$udev "/bin/udevadm") + "trigger" "--action=add") + ;; Wait for things to settle down. (system* (string-append #$udev "/bin/udevadm") "settle") - ;; Create a bunch of devices. - (system* (string-append #$udev "/bin/udevadm") - "trigger") pid))))) (stop #~(make-kill-destructor)))))) -- cgit v1.2.3