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'.master
parent
971436c6bd
commit
ed09bb11cd
|
@ -409,6 +409,20 @@ hydra.gnu.org are used by default."
|
||||||
(define udevd
|
(define udevd
|
||||||
(string-append #$udev "/libexec/udev/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.
|
;; Allow udev to find the modules.
|
||||||
(setenv "LINUX_MODULE_DIRECTORY"
|
(setenv "LINUX_MODULE_DIRECTORY"
|
||||||
"/run/booted-system/kernel/lib/modules")
|
"/run/booted-system/kernel/lib/modules")
|
||||||
|
@ -418,12 +432,18 @@ hydra.gnu.org are used by default."
|
||||||
((0)
|
((0)
|
||||||
(exec-command (list udevd)))
|
(exec-command (list udevd)))
|
||||||
(else
|
(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.
|
;; Wait for things to settle down.
|
||||||
(system* (string-append #$udev "/bin/udevadm")
|
(system* (string-append #$udev "/bin/udevadm")
|
||||||
"settle")
|
"settle")
|
||||||
;; Create a bunch of devices.
|
|
||||||
(system* (string-append #$udev "/bin/udevadm")
|
|
||||||
"trigger")
|
|
||||||
pid)))))
|
pid)))))
|
||||||
(stop #~(make-kill-destructor))))))
|
(stop #~(make-kill-destructor))))))
|
||||||
|
|
||||||
|
|
Reference in New Issue