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 ethool 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

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

Bei Verwendung von ACPI

Sollte der PC trotz der oben beschriebenen Äderungen nicht aufwachen ist ein Blick in /proc/acpi/wakeup hilfreich. Ein cat /proc/acpi/wakeup zeigte folgendes:

Device Sleep state    Status
PCI0      4           disabled
COM1      4           disabled
...

Wake on PCI0 ist hier abgeschalten (die NIC die bei mir am PCI Bus hängt kann den PC also trotz des MagicPaket nicht einschalten)

ein einfaches

echo -n PCI0 > /proc/acpi/wakeup

war nötig um WoL zu ermöglichen.

Daher: die paar Zeilen

/usr/sbin/ethtool -s eth0 wol g
if (grep PCI0 /proc/acpi/wakeup | grep disabled 2>&1 >> /dev/null) ; then
    echo -n PCI0 > /proc/acpi/wakeup
fi

in einem suspend2ram, shutdown etc. script stellen sicher, dass der PC mittels WoL auch wieder aufwacht.

Getestet mit Debian Kernel 2.6.18. Nach Suspend2RAM und Shutdown konnte der PC mittels WoL wieder aufgeweckt werden.

Links