So,
die Zahl der Views auf den Thread spricht für mich dafür, dass es durchaus Interesse an dem Problem gibt, aber scheinbar keiner eine wirkliche Lösung parat hat
Ich habe es jetzt jedenfalls gelöst, und zwar folgendermaßen:
Den Clients übergebe ich beim Booten per PXE direkt eine IP-Adresse und einen Hostnamen. Die Fritzbox scheint keine Hostnamen zu verteilen, selbst wenn sie das Gerät kennt und ein individueller Name eingestellt ist.
Die /etc/hosts und /etc/hostname sind nun Symlinks auf /mnt/hostconf. Unter /mnt/hostconf wird per fstab ein 1MB großes tmpfs gemountet. Das stellt sicher, dass jeder PXE-Client seine eigenen hostname und hosts hat.
Ich den Code aus den von mir zitierten Quellen genommen und daraus ein init-Skript gebaut. So ist es möglich, das Skript möglichst früh schon beim Booten laufen zu lassen. Der Hostname ist dem Rechner ja bereits als Kernelparameter übergeben worden. Falls das nicht der Fall sein sollte oder irgendwas schief läuft, wird als Fallback-Hostname einfach localhost benutzt.
Jetzt melden sich die Clients schön mit ihrem Hostnamen bei der Fritzbox und werden automatisch in den DNS der Fritzbox aufgenommen. Ich muss nur noch schauen, warum der syslog den Hostnamen nicht übernimmt...
Code: Alles auswählen
#! /bin/sh
### BEGIN INIT INFO
# Provides: pxehostname
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Hostnamesestter
# Description: Setzt den Hostnamen aus DHCP
### END INIT INFO
# Author: <foobar@baz.org>
#
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Description of the service"
NAME=pxehostname
#DAEMON=/usr/sbin/$NAME
#DAEMON_ARGS="--options args"
#PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
log_action_begin_msg "Setze Hostname aus DHCP-Lease"
set_hostname
if [ -f /mnt/hostconf/hostname ]; then
#cat /mnt/hostconf/hostname
/etc/init.d/hostname.sh start
rm -f /mnt/hostconf/hosts
echo "127.0.0.1 localhost" >> /mnt/hostconf/hosts
echo "127.0.1.1 "${hname}"
" >> /mnt/hostconf/hosts
echo "" >> /mnt/hostconf/hosts
echo "# The following lines are desirable for IPv6 capable hosts
">> /mnt/hostconf/hosts
echo "::1 localhost ip6-localhost ip6-loopback" >> /mnt/hostconf/hosts
echo "ff02::1 ip6-allnodes" >> /mnt/hostconf/hosts
echo "ff02::2 ip6-allrouters" >> /mnt/hostconf/hosts
log_action_end_msg 0
else
log_action_msg "Hostname recovery failed."
log_action_end_msg -1
fi
return 0
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
return 0
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
#start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
set_hostname() {
hname=$(grep HOSTNAME /var/run/net-eth0.conf | sed -e "s/HOSTNAME=//" -e "s/'//g" | tail -1)
if [ -z $hname ]; then
hname="localhost"
fi
rm -f /mnt/hostconf/hostname
echo $hname > /mnt/hostconf/hostname
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
#restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
#log_daemon_msg "Restarting $DESC" "$NAME"
#do_stop
#case "$?" in
# 0|1)
# do_start
# case "$?" in
# 0) log_end_msg 0 ;;
# 1) log_end_msg 1 ;; # Old process is still running
# *) log_end_msg 1 ;; # Failed to start
# esac
# ;;
# *)
# # Failed to stop
# log_end_msg 1
# ;;
#esac
#;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop}" >&2
exit 3
;;
esac
: