Debian - WAKE ON LAN

Aus VDR Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Beschreibung

Für Debian gibt es die Pakete etherwake und wakeonlan. Etherwake kann nur vom root ausgeführt werden, wakeonlan von allen Benutzern.

Ich habe diese Zeile einfach in meine /etc/init.d/networking an entsprechender Stelle nach dem Aktivieren des Netzwerks gesetzt. Falls es noch Fragen gibt, könnt Ihr mich auch direkt anmailen: Thorsten at Gehrig.de


Bei Debian sieht das dann z. B. so aus: (einfach nach ethtool suchen, um die passenden Stellen zu finden):

#!/bin/sh
#
# manage network interfaces and configure some networking options

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

if ! [ -x /sbin/ifup ]; then
    exit 0
fi

spoofprotect_rp_filter () {
    # This is the best method: turn on Source Address Verification and get
    # spoof protection on all current and future interfaces.

    if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
        for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
            echo 1 > $f
        done
        return 0
    else
        return 1
    fi
}

spoofprotect () {
    echo -n "Setting up IP spoofing protection: "
    if spoofprotect_rp_filter; then
        echo "rp_filter."
    else
        echo "FAILED."
    fi
}

ip_forward () {
    if [ -e /proc/sys/net/ipv4/ip_forward ]; then
        echo -n "Enabling packet forwarding..."
        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo "done."
    fi
}

syncookies () {
    if [ -e /proc/sys/net/ipv4/tcp_syncookies ]; then
        echo -n "Enabling TCP/IP SYN cookies..."
        echo 1 > /proc/sys/net/ipv4/tcp_syncookies
        echo "done."
    fi
}

doopt () {
    optname=$1
    default=$2
    opt=`grep "^$optname=" /etc/network/options`
    if [ -z "$opt" ]; then
        opt="$optname=$default"
    fi
    optval=${opt#$optname=}
    if [ "$optval" = "yes" ]; then
        eval $optname
    fi
}

case "$1" in
    start)
	doopt spoofprotect yes
        doopt syncookies no
        doopt ip_forward no

        echo -n "Configuring network interfaces..."
        ifup -a
	ethtool -s eth0 wol g
	echo "done."
	;;
    stop)
        if sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\1 \2/p' /proc/mounts |
          grep -q "^/ nfs$"; then
            echo "NOT deconfiguring network interfaces: / is an NFS mount"
        elif sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\1 \2/p' /proc/mounts |
          grep -q "^/ smbfs$"; then
            echo "NOT deconfiguring network interfaces: / is an SMB mount"
	elif sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\2/p' /proc/mounts |
          grep -qE '^(nfs[1234]?|smbfs|ncp|ncpfs|coda|cifs)$'; then
            echo "NOT deconfiguring network interfaces: network shares still mounted."
        else
            echo -n "Deconfiguring network interfaces..."
            ifdown -a --exclude=lo
	    echo "done."
        fi
	;;
    force-reload|restart)
	doopt spoofprotect yes
        doopt syncookies no
        doopt ip_forward no
        echo -n "Reconfiguring network interfaces..."
        ifdown -a --exclude=lo
        ifup -a
	ethtool -s eth0 wol g
	echo "done."
	;;
    *)
	echo "Usage: /etc/init.d/networking {start|stop|restart|force-reload}"
	exit 1
	;;
esac

exit 0

Saubere Debian-Lösung

Besser als das Ändern von vorhandenen Dateien ist es, einen extra Mechanismus einzubauen. In Debian (Sarge) wird der runlevel 0 zum Abschalten des Systems benutzt. Daher wird ein link in /etc/rc0.d erzeugt der auf das Skript in /etc/init.d/wake_on_lan zeigt. (Erst das Skript erzeugen!)

cd /etc/rc0.d
ln -s /etc/init.d/wake_on_lan S80wake_on_lan

Info: Die Ausführung des Skripts bei mir mit Priorität S80, also kurz vor dem S90halt Befehl, führte dazu dass dieses nicht mehr korrekt ausgeführt werden konnte. In diesem Fall muss das Skript mit höherer Priorität ausgeführt(verlinkt) werden: z.B als S30wake_on_lan

Ergänzung 2010-09-29 Für das Debian squeeze muss an stelle z.B als S30wake_on_lan z.B. K09wake_on_lan eingetragen werden.


Und hier das Skript wake_on_lan. Er muß nach /etc/init.d gespeichert werden und ausführbar sein. Dies geht mit "chmod +x wake_on_lan", wenn man im Verzeichnis ist.

#! /bin/sh
#
# Ensures that Wake on Lan works
#

#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

set -e

case "$1" in
  stop|start|restart|force-reload|reload)
        echo -n "Turn on: Wake on Magic Packet"
        /usr/sbin/ethtool -s eth0 wol g
        echo
        ;;
  *)
#       N=/etc/init.d/hwtools
#       echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
        exit 1
        ;;
esac

exit 0

Falls ethtool noch nicht installiert ist, muß man dies jetzt nachholen:

apt-get install ethtool

Alternative /etc/network/interfaces

ethtool kann man auch einfach als pre-down oder post-up (post-down, pre-up haben in meinem Fall nicht funktoniert) in die interfaces-Konfiguration einbauen:

auto eth0
iface eth0 inet dhcp
        pre-down ethtool -s eth0 wol g

HALT / Reboot

Debian schaltet beim Halt und/oder Reboot die Netzwerkkarten ab. Im reboot bzw. Halt-Skript sollte man daher das "-i" entfernen, damit WOL klappt. Bei verschiedenen Debian-Versionen (neuste version z.b. Debian 5.0 lenny) ist dafür in der S90halt die Variable NETDOWN. Setzt man diese auf "no", so bleiben die Interfaces aktiv. Die sauber Methode ist, folgende Zeile in /etc/default/halt einzufügen:

NETDOWN=no


Bei Debian etch 4.0 / lenny 5.0


/etc/init.d/halt
Das Script einfach mit dem Nano oder vi Editor öffnen und in den ersten Zeilen ist der Befehl Netdown zu finden. Wenn das Script nicht in dem Verzeichnis /etc/init.d/halt zu finden ist einfach find befehl anwenden, um das Script zu finden!