diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 96bf8da..4a85ed0 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -32,7 +32,7 @@ #:use-module ((gnu packages linux) #:select (eudev kbd e2fsprogs lvm2 fuse alsa-utils crda gpm)) #:use-module ((gnu packages base) - #:select (canonical-package glibc)) + #:select (canonical-package glibc coreutils)) ; coreutils for `dd`, `cat`. #:use-module (gnu packages package-management) #:use-module (gnu packages lsh) #:use-module (gnu packages lsof) @@ -93,6 +93,8 @@ gpm-service-type gpm-service + urandom-seed-service + %base-services)) ;;; Commentary: @@ -1200,6 +1202,47 @@ extra rules from the packages listed in @var{rules}." "Return a service that uses @var{device} as a swap device." (service swap-service-type device)) +(define %urandom-seed-activation + ;; Activation gexp for the urandom seed + #~(begin + (use-modules (guix build utils)) + + (mkdir-p "/var/run") + (close-port (open-file "/var/run/urandom-seed" "a0b")) + (chmod "/var/run/urandom-seed" #o600))) + +(define (urandom-seed-shepherd-service) + "Return a shepherd service for the /dev/urandom seed." + (list (shepherd-service + (documentation "Preserve entropy across reboots for /dev/urandom.") + (provision '(urandom-seed)) + (requirement '(user-processes)) ; whatever provides file-system /var + (start #~(lambda _ + (exec-command + (zero? + (system (string-append "cat " + "/var/run/urandom-seed" + " > /dev/urandom")))))) + (stop #~(lambda _ + (exec-command + (zero? + (system* "dd" "if=/dev/urandom" + (string-append "of=" "/var/run/urandom-seed") + "count=1" "bs=512")))))))) + +(define urandom-seed-service-type + (service-type (name 'urandom-seed) + (extensions + (list (service-extension shepherd-root-service-type + urandom-seed-shepherd-service) + (service-extension activation-service-type + (const %urandom-seed-activation)) + ;; Add urandom-seed to the system profile + ;; Where is profile-service-type defined? + (service-extension profile-service-type list))))) + +(define (urandom-seed-service) + (service urandom-seed-service-type '())) (define-record-type* gpm-configuration make-gpm-configuration gpm-configuration? @@ -1281,6 +1324,7 @@ This is the GNU operating system, welcome!\n\n"))) (static-networking-service "lo" "127.0.0.1" #:provision '(loopback)) (syslog-service) + (urandom-seed-service) (guix-service) (nscd-service)