1#! /bin/sh 2# 3# Preserve the random seed between reboots. See urandom(4). 4# 5 6# Quietly do nothing if /dev/urandom does not exist 7[ -c /dev/urandom ] || exit 0 8 9URANDOM_SEED="/var/lib/random-seed" 10 11# shellcheck source=/dev/null 12[ -r "/etc/default/urandom" ] && . "/etc/default/urandom" 13 14if pool_bits=$(cat /proc/sys/kernel/random/poolsize 2> /dev/null); then 15 pool_size=$((pool_bits/8)) 16else 17 pool_size=512 18fi 19 20check_file_size() { 21 [ -f "$URANDOM_SEED" ] || return 1 22 # Try to read two blocks but exactly one will be read if the file has 23 # the correct size. 24 size=$(dd if="$URANDOM_SEED" bs="$pool_size" count=2 2> /dev/null | wc -c) 25 test "$size" -eq "$pool_size" 26} 27 28init_rng() { 29 if check_file_size; then 30 printf 'Initializing random number generator: ' 31 dd if="$URANDOM_SEED" bs="$pool_size" of=/dev/urandom count=1 2> /dev/null 32 status=$? 33 if [ "$status" -eq 0 ]; then 34 echo "OK" 35 else 36 echo "FAIL" 37 fi 38 return "$status" 39 fi 40} 41 42save_random_seed() { 43 printf 'Saving random seed: ' 44 if touch "$URANDOM_SEED" 2> /dev/null; then 45 old_umask=$(umask) 46 umask 077 47 dd if=/dev/urandom of="$URANDOM_SEED" bs="$pool_size" count=1 2> /dev/null 48 status=$? 49 umask "$old_umask" 50 if [ "$status" -eq 0 ]; then 51 echo "OK" 52 else 53 echo "FAIL" 54 fi 55 else 56 status=$? 57 echo "SKIP (read-only file system detected)" 58 fi 59 return "$status" 60} 61 62case "$1" in 63 start|restart|reload) 64 # Carry a random seed from start-up to start-up 65 # Load and then save the whole entropy pool 66 init_rng && save_random_seed;; 67 stop) 68 # Carry a random seed from shut-down to start-up 69 # Save the whole entropy pool 70 save_random_seed;; 71 *) 72 echo "Usage: $0 {start|stop|restart|reload}" 73 exit 1 74esac 75