| #! /bin/sh |
| # |
| # Preserve the random seed between reboots. See urandom(4). |
| # |
| |
| # Quietly do nothing if /dev/urandom does not exist |
| [ -c /dev/urandom ] || exit 0 |
| |
| URANDOM_SEED="/var/lib/random-seed" |
| |
| # shellcheck source=/dev/null |
| [ -r "/etc/default/urandom" ] && . "/etc/default/urandom" |
| |
| if pool_bits=$(cat /proc/sys/kernel/random/poolsize 2> /dev/null); then |
| pool_size=$((pool_bits/8)) |
| else |
| pool_size=512 |
| fi |
| |
| check_file_size() { |
| [ -f "$URANDOM_SEED" ] || return 1 |
| # Try to read two blocks but exactly one will be read if the file has |
| # the correct size. |
| size=$(dd if="$URANDOM_SEED" bs="$pool_size" count=2 2> /dev/null | wc -c) |
| test "$size" -eq "$pool_size" |
| } |
| |
| init_rng() { |
| if check_file_size; then |
| printf 'Initializing random number generator: ' |
| dd if="$URANDOM_SEED" bs="$pool_size" of=/dev/urandom count=1 2> /dev/null |
| status=$? |
| if [ "$status" -eq 0 ]; then |
| echo "OK" |
| else |
| echo "FAIL" |
| fi |
| return "$status" |
| fi |
| } |
| |
| save_random_seed() { |
| printf 'Saving random seed: ' |
| if touch "$URANDOM_SEED" 2> /dev/null; then |
| old_umask=$(umask) |
| umask 077 |
| dd if=/dev/urandom of="$URANDOM_SEED" bs="$pool_size" count=1 2> /dev/null |
| status=$? |
| umask "$old_umask" |
| if [ "$status" -eq 0 ]; then |
| echo "OK" |
| else |
| echo "FAIL" |
| fi |
| else |
| status=$? |
| echo "SKIP (read-only file system detected)" |
| fi |
| return "$status" |
| } |
| |
| case "$1" in |
| start|restart|reload) |
| # Carry a random seed from start-up to start-up |
| # Load and then save the whole entropy pool |
| init_rng && save_random_seed;; |
| stop) |
| # Carry a random seed from shut-down to start-up |
| # Save the whole entropy pool |
| save_random_seed;; |
| *) |
| echo "Usage: $0 {start|stop|restart|reload}" |
| exit 1 |
| esac |