Manfred Antar wrote:
> 
> When setting entropy_file="/var/db/entropy" in rc.conf
> This error happens:
> No entropy file, trying other sources
> After a few minutes the machine continues booting
> /var is mounted on a separate partition from /

        Try the attached patch. It's been approved in concept by Mark Murray,
and is waiting for a committer to pick it up while Mark travels to
BSDcon. 

Doug
-- 
        "The dead cannot be seduced."
                - Kai, "Lexx"

        Do YOU Yahoo!?
Index: rc
===================================================================
RCS file: /usr/ncvs/src/etc/rc,v
retrieving revision 1.234
diff -u -r1.234 rc
--- rc  2000/10/14 12:56:08     1.234
+++ rc  2000/10/15 08:07:00
@@ -69,26 +69,19 @@
        . /etc/rc.conf
 fi
 
-# Recover some entropy so the rebooting /dev/random can reseed
+
+# First pass at entropy recovery so the rebooting /dev/random can reseed.
 #
 case ${entropy_file} in
 [Nn][Oo] | '')
        ;;
 *)
        if [ -w /dev/random ]; then
-               if [ -f ${entropy_file} -a -r ${entropy_file} ]; then
-                       echo "Reading entropy file"
+               if [ -f "${entropy_file}" -a -r "${entropy_file}" -a \
+                   -s "${entropy_file}" ]; then
+                       echo "Using ${entropy_file} as an entropy file"
                        cat ${entropy_file} > /dev/random 2> /dev/random
-                       rm -f ${entropy_file}
-               else
-                       echo "No entropy file, trying other sources"
-                       # XXX temporary until we can get the entropy
-                       # harvesting rate up
-                       # Entropy below is not great, but better than nothing.
-                       (ps -gauxwww; iostat; vmstat; dmesg) > /dev/random 2> 
/dev/random
-                       ( for i in /etc /var/run ; do
-                               cd $i ; ls -al ; cat *
-                       done ) > /dev/random 2> /dev/random
+                       entropy_reseeded=yes
                fi
        fi
        ;;
@@ -182,6 +175,45 @@
 if [ -n "${diskless_mount}" -a -r "${diskless_mount}" ]; then
                sh ${diskless_mount}
 fi
+
+# Second attempt at reseeding, if needed.
+#
+case ${entropy_reseeded} in
+yes)
+       ;;
+*)
+       case ${entropy_file} in
+       [Nn][Oo] | '')
+               ;;
+       *)
+               if [ -w /dev/random ]; then
+                       if [ -f "${entropy_file}" -a -r "${entropy_file}" -a \
+                           -s "${entropy_file}" ]; then
+                               echo "Using ${entropy_file} as an entropy file"
+                               cat ${entropy_file} > /dev/random 2> /dev/random
+                       elif [ "${entropy_file}" != /var/db/entropy -a \
+                           -f /var/db/entropy -a -r /var/db/entropy -a \
+                           -s /var/db/entropy ]; then
+                               echo "Using /var/db/entropy as an entropy file"
+                               cat /var/db/entropy > /dev/random 2> /dev/random
+                       else
+                               echo "Can't use ${entropy_file} as an entropy file, 
+trying other sources"
+                               # XXX temporary until we can get the entropy
+                               # harvesting rate up
+                               # Entropy below is not great, but better than nothing.
+                               (ps -gauxwww; iostat; vmstat; sysctl -a; dmesg) > 
+/dev/random 2> /dev/random
+                               ( for i in /etc /var/run ; do
+                                       cd $i ; ls -al ; cat *
+                               done ) > /dev/random 2> /dev/random
+                       fi
+               fi
+               ;;
+       esac
+       ;;
+esac
+
+# Remove these to prevent problems on future reboots
+rm -f "${entropy_file}" /var/db/entropy
 
 adjkerntz -i
 
Index: rc.shutdown
===================================================================
RCS file: /usr/ncvs/src/etc/rc.shutdown,v
retrieving revision 1.12
diff -u -r1.12 rc.shutdown
--- rc.shutdown 2000/10/08 19:18:24     1.12
+++ rc.shutdown 2000/10/15 07:05:14
@@ -62,9 +62,25 @@
        rm -f ${entropy_file}
        oumask=`umask`
        umask 077
-       touch ${entropy_file} && \
-               dd if=/dev/random of=${entropy_file} \
+       if touch ${entropy_file} ; then
+               entropy_file_confirmed="${entropy_file}"
+       else
+               # Try this as a reasonable alternative for read-only
+               # roots, diskless workstations, etc.
+               rm -f /var/db/entropy
+               if touch /var/db/entropy ; then
+                       entropy_file_confirmed=/var/db/entropy
+               fi
+       fi
+       case ${entropy_file_confirmed} in
+       '')
+               echo "ERROR: entropy file write failed"
+               ;;
+       *)
+               dd if=/dev/random of=${entropy_file_confirmed} \
                   bs=4096 count=1 2> /dev/null
+               ;;
+       esac
        umask ${oumask}
        ;;
 esac
Index: defaults/rc.conf
===================================================================
RCS file: /usr/ncvs/src/etc/defaults/rc.conf,v
retrieving revision 1.80
diff -u -r1.80 rc.conf
--- defaults/rc.conf    2000/10/06 12:24:45     1.80
+++ defaults/rc.conf    2000/10/15 04:08:07
@@ -313,8 +313,8 @@
 update_motd="YES"      # update version info in /etc/motd (or NO)
 start_vinum=""         # set to YES to start vinum
 unaligned_print="YES"  # print unaligned access warnings on the alpha (or NO).
-entropy_file="/var/db/entropy"
-                       # Set to NO to disable caching entropy through reboots
+entropy_file="/entropy" # Set to NO to disable caching entropy through reboots.
+                       # /var/db/entropy is preferred if / is not available.
 
 ##############################################################
 ### Define source_rc_confs, the mechanism used by /etc/rc.* ##

Reply via email to