patch against casper-1.63+debian-1 This should get netbooting working again!
Alex Owen
diff -uNr casper-1.63+debian.ORIG/scripts/casper casper-1.63+debian/scripts/casper --- casper-1.63+debian.ORIG/scripts/casper 2006-08-05 16:23:06.000000000 +0100 +++ casper-1.63+debian/scripts/casper 2006-08-05 16:25:24.000000000 +0100 @@ -231,80 +231,110 @@ } do_netmount() { + #no debug messages as stdout is interface withh calling function # Will mount a remote share and return the mountpoint - modprobe -q nfs # For DHCP modprobe -q af_packet - ipconfig ${DEVICE} /tmp/net-${DEVICE}.conf + #REMEMBER: no debug messages as stdout is interface withh calling function + ipconfig ${DEVICE} /tmp/net-${DEVICE}.conf >/dev/null if [ "x${NFSROOT}" = "xauto" ]; then NFSROOT=${ROOTSERVER}:${ROOTPATH} fi - #choose NFS or CIFS mount - if [ ${netboot} = "NFS" ] ; then - echo $(do_nfsmount) - else - echo $(do_cifsmount) - fi + #choose NFS or CIFS mount + case ${netboot} in + NFS) + echo $(do_nfsmount) + ;; + CIFS) + echo $(do_cifsmount) + ;; + *) + panic "Unrecognized casper netboot method: ${netboot}" + ;; + esac } do_nfsmount() { + #no debug messages as stdout is interface withh calling function + modprobe -q nfs if [ "x${NFSOPTS}" = "x" ]; then NFSOPTS="" fi - [ "$quiet" != "y" ] && log_begin_msg "Mounting NFS with nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}" + #[ "$quiet" != "y" ] && log_begin_msg "Mounting NFS with nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}" + # FIXME: This while loop is an ugly HACK round an nfs bug while true ; do - nfsmount -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && break + nfsmount -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && break sleep 1 done echo "${mountpoint}" # FIXME: add error check - [ "$quiet" != "y" ] && log_end_msg + #[ "$quiet" != "y" ] && log_end_msg } do_cifsmount() { + #no debug messages as stdout is interface withh calling function + modprobe -q cifs NFSOPTS="-ouser=root,password=" - [ "$quiet" != "y" ] && log_begin_msg "Mounting using mount.cifs with ${NFSROOT} ${mountpoint} ${NFSOPTS}" + #[ "$quiet" != "y" ] && log_begin_msg "Mounting using mount.cifs with ${NFSROOT} ${mountpoint} ${NFSOPTS}" mount.cifs "${NFSROOT}" "${mountpoint}" "${NFSOPTS}" && echo "${mountpoint}" # FIXME: add error check - [ "$quiet" != "y" ] && log_end_msg + #[ "$quiet" != "y" ] && log_end_msg } setup_unionfs() { + #usage setup_unionfs image_dir(can be null) rootmnt rofsstring(optional) rofslist(optional) image_directory="$1" rootmnt="$2" - image_type="$3" + #OLD#image_type="$3" + rofsstring="" + rofslist="" + if [ "x" != "x$3" ] ; then + rofsstring="$3" + fi + if [ "x" != "x$4" ] ; then + rofslist="$4" + fi + + echo Just started setup_unionfs with args: + echo image_directory .$image_directory. + echo rootmnt .$rootmnt. + echo rofsstring .$rofsstring. + modprobe -qb unionfs croot="" # Should really be /casper, but run-init doesn't handle # mount-points in subdirectories at all # Let's just mount the read-only file systems first - rofsstring="" - rofslist="" - mkdir -p "${croot}" - for image_type in "ext2" "squashfs" "dir" ; do - for image in "${image_directory}"/*."${image_type}"; do - imagename=$(basename "${image}") - if [ -d "${image}" ]; then - # it is a plain directory: do nothing - rofslist="${image} ${rofslist}" - rofsstring="${image}=ro:${rofsstring}" - elif [ -f "${image}" ]; then - backdev=$(get_backing_device "$image") - fstype=$(get_fstype "${backdev}") - if [ "${fstype}" = "unknown" ]; then - panic "Unknown file system type on ${backdev} (${image})" + if [ "x" != "x$croot" ] ; then + mkdir -p "${croot}" + fi + if [ "x" != "x$image_directory" ] ; then + #this must not run if $image_directory is empty + for image_type in "ext2" "squashfs" "dir" ; do + for image in "${image_directory}"/*."${image_type}"; do + imagename=$(basename "${image}") + if [ -d "${image}" ]; then + # it is a plain directory: do nothing + rofslist="${image} ${rofslist}" + rofsstring="${image}=ro:${rofsstring}" + elif [ -f "${image}" ]; then + backdev=$(get_backing_device "$image") + fstype=$(get_fstype "${backdev}") + if [ "${fstype}" = "unknown" ]; then + panic "Unknown file system type on ${backdev} (${image})" + fi + mkdir -p "${croot}/${imagename}" + mount -t "${fstype}" -o ro "${backdev}" "${croot}/${imagename}" || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=ro:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}" fi - mkdir -p "${croot}/${imagename}" - mount -t "${fstype}" -o ro "${backdev}" "${croot}/${imagename}" || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=ro:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}" - fi + done done - done + fi rofsstring=${rofsstring%:} mkdir -p /cow @@ -324,9 +354,11 @@ mount ${cowdevice} -t ${cow_fstype} -o rw /cow || panic "Can not mount $cowdevice on /cow" - mount -t unionfs -o dirs=/cow=rw:$rofsstring unionfs "$rootmnt" + echo running mount -t unionfs -o dirs=/cow=rw:$rofsstring unionfs "$rootmnt" + mount -t unionfs -o dirs=/cow=rw:$rofsstring unionfs "$rootmnt" || panic "Unionfs mount failed" for d in ${rofslist}; do + #this must not run if $rofslist is empty mkdir -p "${rootmnt}/casper/${d}" mount -o bind "${d}" "${rootmnt}/${d}" case d in @@ -360,6 +392,7 @@ } find_livefs() { + #no debug messages as stdout is interface with calling script! mounted= for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do devname=$(sys2dev "${sysblock}") @@ -424,18 +457,31 @@ set_usplash_timeout - if grep -q netboot /proc/cmdline; then - netboot="CIFS" + if [ "${ROOT}" = "/dev/nfs" ] || grep -q netboot /proc/cmdline ; then + # netbooting + if [ "${ROOT}" = "/dev/nfs" ] ; then + netboot="NFS" + else + netboot="CIFS" + fi for x in $(cat /proc/cmdline); do case $x in netboot=*) - netboot=${x#netboot=} + if [ "${x#netboot=}" = "CIFS" -o "${x#netboot=}" = "cifs" ; then + netboot="CIFS" + elif [ "${x#netboot=}" = "NFS" -o "${x#netboot=}" = "nfs" ; then + netboot="NFS" + fi ;; esac done - livefs_root=$(do_netboot) + livefs_root=$(do_netmount) + sleep 1 + echo calling setup_unionfs "" "$rootmnt" "$livefs_root=nfsro" + setup_unionfs "" "$rootmnt" "$livefs_root=nfsro" + else - # Scan devices for the image + # Scan local devices for the image for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13; do livefs_root=$(find_livefs) if [ "${livefs_root}" ]; then @@ -443,17 +489,17 @@ fi sleep 1 done - fi - if [ "$?" -gt 0 ]; then - panic "Unable to find a medium containing a live file system" - fi - - if grep -q toram /proc/cmdline; then - copy_to_ram "${livefs_root}" - fi + if [ "$?" -gt 0 ]; then + panic "Unable to find a medium containing a live file system" + fi + + if grep -q toram /proc/cmdline; then + copy_to_ram "${livefs_root}" + fi - mount_images_in_directory "$livefs_root" "$rootmnt" + mount_images_in_directory "$livefs_root" "$rootmnt" + fi log_end_msg diff -uNr casper-1.63+debian.ORIG/scripts/casper-bottom/23networking casper-1.63+debian/scripts/casper-bottom/23networking --- casper-1.63+debian.ORIG/scripts/casper-bottom/23networking 2006-08-05 16:23:06.000000000 +0100 +++ casper-1.63+debian/scripts/casper-bottom/23networking 2006-08-05 16:27:51.000000000 +0100 @@ -33,6 +33,8 @@ udevtrigger fi +if ! grep -qs netboot /proc/cmdline ; then + for interface in /sys/class/net/eth* /sys/class/net/ath* /sys/class/net/wlan*; do [ -e $interface ] || continue i="$(basename $interface)" @@ -52,4 +54,6 @@ EOF done +fi + log_end_msg