diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2014-07-10 00:20:57 +0200 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2014-07-10 00:35:27 +0200 |
| commit | ed09bb11cdd3454c00caf10615fac3cdd1791d55 (patch) | |
| tree | 2e13d64e1c75c75b6da6e9ca71fbd57f129361f0 /gnu | |
| parent | 971436c6bdbeb68cbcc89437cb30b3be61ccae7a (diff) | |
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'.
Diffstat (limited to 'gnu')
| -rw-r--r-- | gnu/services/base.scm | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 030121625bd..c430586dbf7 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm | |||
| @@ -409,6 +409,20 @@ hydra.gnu.org are used by default." | |||
| 409 | (define udevd | 409 | (define udevd |
| 410 | (string-append #$udev "/libexec/udev/udevd")) | 410 | (string-append #$udev "/libexec/udev/udevd")) |
| 411 | 411 | ||
| 412 | (define (wait-for-udevd) | ||
| 413 | ;; Wait until someone's listening on udevd's control | ||
| 414 | ;; socket. | ||
| 415 | (let ((sock (socket AF_UNIX SOCK_SEQPACKET 0))) | ||
| 416 | (let try () | ||
| 417 | (catch 'system-error | ||
| 418 | (lambda () | ||
| 419 | (connect sock PF_UNIX "/run/udev/control") | ||
| 420 | (close-port sock)) | ||
| 421 | (lambda args | ||
| 422 | (format #t "waiting for udevd...~%") | ||
| 423 | (usleep 500000) | ||
| 424 | (try)))))) | ||
| 425 | |||
| 412 | ;; Allow udev to find the modules. | 426 | ;; Allow udev to find the modules. |
| 413 | (setenv "LINUX_MODULE_DIRECTORY" | 427 | (setenv "LINUX_MODULE_DIRECTORY" |
| 414 | "/run/booted-system/kernel/lib/modules") | 428 | "/run/booted-system/kernel/lib/modules") |
| @@ -418,12 +432,18 @@ hydra.gnu.org are used by default." | |||
| 418 | ((0) | 432 | ((0) |
| 419 | (exec-command (list udevd))) | 433 | (exec-command (list udevd))) |
| 420 | (else | 434 | (else |
| 435 | ;; Wait until udevd is up and running. This | ||
| 436 | ;; appears to be needed so that the events | ||
| 437 | ;; triggered below are actually handled. | ||
| 438 | (wait-for-udevd) | ||
| 439 | |||
| 440 | ;; Trigger device node creation. | ||
| 441 | (system* (string-append #$udev "/bin/udevadm") | ||
| 442 | "trigger" "--action=add") | ||
| 443 | |||
| 421 | ;; Wait for things to settle down. | 444 | ;; Wait for things to settle down. |
| 422 | (system* (string-append #$udev "/bin/udevadm") | 445 | (system* (string-append #$udev "/bin/udevadm") |
| 423 | "settle") | 446 | "settle") |
| 424 | ;; Create a bunch of devices. | ||
| 425 | (system* (string-append #$udev "/bin/udevadm") | ||
| 426 | "trigger") | ||
| 427 | pid))))) | 447 | pid))))) |
| 428 | (stop #~(make-kill-destructor)))))) | 448 | (stop #~(make-kill-destructor)))))) |
| 429 | 449 | ||
