svn commit: r198317 - head/usr.sbin/sysinstall

John Baldwin jhb at freebsd.org
Wed Oct 21 13:25:25 UTC 2009


On Wednesday 21 October 2009 7:10:34 am Rink Springer wrote:
> Author: rink
> Date: Wed Oct 21 11:10:34 2009
> New Revision: 198317
> URL: http://svn.freebsd.org/changeset/base/198317
> 
> Log:
>   Introduce 'netDev=ANY' support for scripted (install.cfg) installs, which 
results in the first ethernet interface with physical link being selected.
>   
>   While here, fix a minor typo causing an 'if' to be missed.
>   
>   Submitted by:	randi

Note that in the case of PXE you can use a shell script to automatically use 
the PXE interface.  I do this in my scripts here at work.  install.cfg 
contains:

# Figure out our installation media and configure it.
command=/bin/sh /stand/domedia.sh
system
configFile=/stand/media.cfg
loadConfig

And domedia.sh contains this code to figure out which network interface to use 
if a kernel environment variable is set to indicate an NFS install (vs a CD 
install, the scripts support both) (Note that I have added kenv and dialog to 
my mfsroot):

#!/bin/sh
#
# Figure out which install media we want to use.

netif=`kenv -q install.netif`
nfspath=`kenv -q install.nfspath`

# Determine if a given network interface has link
# XXX: some drivers only report link if the interface is UP
netif_up()
{
	local status

	status=`ifconfig $1 | sed -ne '/status:/p'`
	case $status in
		*active*)
			return 0
			;;
	esac
	return 1
}

# Returns true if a given network interface has the specified MAC address.
macmatch()
{
	local addr

	addr=`ifconfig $1 | sed -ne '/	ether /{s///;p;}'`
	[ "$addr" = "$2" ]
	return $?
}

# If 'nfspath' is set, assume we are using NFS, otherwise, assume we
# are installing from a CD.
if [ -n "${nfspath}" ]; then
	# If netif isn't set, try to guess at a sane value.
	if [ -z "${netif}" ]; then
		# This is set by the loader when booting via PXE
		macaddr=`kenv -q boot.netif.hwaddr`
		macif=""
		count=0
		upcount=0
		ifaces=""
		upifaces=""
		for ifn in `ifconfig -l`; do
			case $ifn in
				lo0)
					# Ignore loopback
					;;
				*)
					count=$((count + 1))
					ifaces="${ifaces} ${ifn}"
					if netif_up $ifn; then
						upcount=$((upcount + 1))
						upifaces="${upifaces} ${ifn}"
					fi
					if [ -n "$macaddr" ] && \
					    macmatch $ifn $macaddr; then
						macif="$ifn"
					fi
					;;
			esac
		done

		# If there is only a single interface, use that.  If
		# we booted via PXE and the MAC address for PXE
		# matches the MAC address of an interface, use that.
		# Finally, if only one interface has link, use that.
		# If all of those tests fail, pop up a menu.
		if [ $count -eq 1 ]; then
			# The echo trims extra spaces
			netif=`echo $ifaces`
		elif [ -n "$macif" ]; then
			netif="$macif"
		elif [ $upcount -eq 1 ]; then
			# The echo trims extra spaces
			netif=`echo $upifaces`
		else
			# Build the menu
			ifmenu=""
			for ifn in $ifaces; do
				ifmenu="${ifmenu} ${ifn} Network"
			done

			# Run the menu
			while [ -z "${netif}" ]; do
				rm -f /stand/netif
				dialog --menu "Select the network interface to use for NFS." \
				    $((count + 7)) 50 $((count)) ${ifmenu} 2> \
				    /stand/netif
				if [ $? -eq 0 ]; then
					netif=`cat /stand/netif`
				fi
			done
		fi
	fi

	cat > /stand/media.cfg <<EOF
nfs=${nfspath}
netDev=${netif}
tryDHCP=YES
mediaSetNFS
EOF
else
	cat > /stand/media.cfg <<EOF
mediaSetCDROM
EOF
fi

But this does show how you can do all sorts of creative things for scripted 
installs w/o having to hack up sysinstall directly.

-- 
John Baldwin


More information about the svn-src-all mailing list