[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [OSSTEST PATCH 09/38] Bodge systemd random seed arrangements
systemd does not regard the contents of the random seed file as useful for the purposes of placating the kernel's entropy tracker. As a result, the system hangs at boot waiting for entropy. Fix this by providing a small program which can be used to load a seed file into /dev/random and also call RNDADDTOENTCNT to add the appropriate amount to the kernel's counter. Arrange to run this program instead of /lib/systemd/systemd-random-seed load With systemd the random seed file is in /var/lib/systemd/random-seed rather than /var/lib/urandom/random-seed. Unfortunately we must hardcode the actual numerical value of RNDADDTOENTCNT because we don't have a suitable compiler anywhere nearby. It seems to have the same value on i386, amd64, armhf and arm64, our currently supported architectures. Thanks to Colin Watson for pointers to the systemd random unit and Matthew Vernon for instructions on overriding just ExecStart. I think this change should be a no-op on non-systemd systems. Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- .../override.conf | 3 ++ overlay/usr/local/bin/random-seed-add | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 overlay/etc/systemd/system/systemd-random-seed.service.d/override.conf create mode 100755 overlay/usr/local/bin/random-seed-add diff --git a/overlay/etc/systemd/system/systemd-random-seed.service.d/override.conf b/overlay/etc/systemd/system/systemd-random-seed.service.d/override.conf new file mode 100644 index 00000000..f6cc0f84 --- /dev/null +++ b/overlay/etc/systemd/system/systemd-random-seed.service.d/override.conf @@ -0,0 +1,3 @@ +[Service] +ExecStart= +ExecStart=/usr/local/bin/random-seed-add /var/lib/systemd/random-seed diff --git a/overlay/usr/local/bin/random-seed-add b/overlay/usr/local/bin/random-seed-add new file mode 100755 index 00000000..89e75c4d --- /dev/null +++ b/overlay/usr/local/bin/random-seed-add @@ -0,0 +1,33 @@ +#!/usr/bin/perl -w +use strict; + +open R, '>', '/dev/random' or die "open /dev/random: $!\n"; +R->autoflush(1); + +sub rndaddtoentcnt ($) { + my ($bits) = @_; + my $x = pack 'L', $bits; + my $r = ioctl R, 0x40045201, $x; + defined $r or die "RNDADDTOENTCNT: $!\n"; +} + +sub process_stdin ($) { + my ($f) = @_; + my $got = read STDIN, $_, 512; + defined $got or die "read $f: $!\n"; + last if !$got; + print R $_ or die "write /dev/random: $!\n"; + my $bits = length($_) * 8; + rndaddtoentcnt($bits); +} + +if (!@ARGV) { + process_stdin('stdin'); +} else { + die "no options supported\n" if $ARGV[0] =~ m/^\-/; + foreach my $f (@ARGV) { + open STDIN, '<', $f or die "open for reading $f: $!\n"; + process_stdin($f); + } +} + -- 2.20.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |