Не работает wol linux

Обновлено: 01.07.2024

Я нашел лучший способ, который работал для меня. По крайней мере, чище. Я пишу об этом, потому что, гугляя Ubuntu 16 wol и другие подобные поиски, я сталкивался с этим постом несколько раз. Это может помочь кому-то еще.

Очевидно, Ubuntu изменил upstart для systemd, это в Ubuntu 15, Ubuntu 16 и, вероятно, в следующих версиях. Я новичок в обеих системах, но это сработало для меня.

Чтобы WOL работал, мне приходилось включать его каждый раз при загрузке системы. Чтобы избежать этого вручную, я использовал systemd для этой цели. Вот что я сделал:

Включите это для интерфейса при загрузке, выполните следующую команду (измените eth3 с вашим интерфейсом):

Вы должны увидеть что-то вроде этого:

Чтобы проверить, включен ли он, выполните следующую команду (измените eth3 с вашим интерфейсом), и он должен вернуть enabled :

Чтобы проверить это, перезагрузитесь и запустите (измените eth3 с вашим интерфейсом):

Вы должны увидеть строку со следующим:

Upstart - это основанная на событиях замена для демона /sbin/init, который обрабатывает запуск задач и служб во время загрузки, останавливает их при завершении работы и контролирует их во время работы системы.
- upstart - основанный на событиях демон init

systemd - это набор основных строительных блоков для системы Linux. Он предоставляет диспетчер системы и услуг, который запускается как PID 1 и запускает остальную часть системы. (. )
- systemd

В Ubuntu 16.04 установлены WOL_DISABLE=N в /etc/default/tlp чтобы избежать отключения WOL с помощью управления питанием TLP.

добавлять NETDOWN=no в /etc/default/halt для предотвращения отключения сетевой карты во время выключения

Включить Wake on LAN в /etc/network/interfaces когда используется статическая конфигурация сети.

Включите wake on lan в BIOS, войдите в настройки BIOS и найдите что-нибудь под названием "Wake up on PCI event", "Wake up on LAN" или подобное. Измените это так, чтобы это было включено. Сохраните настройки и перезагрузите компьютер.

Предупреждение. Некоторые материнские платы / сетевые контроллеры не поддерживают WOL при "холодной" загрузке (состояние S5, когда питание системы физически отключается и снова включается). В этом случае должен быть выполнен как минимум один цикл питания (включение, выключение). Чтобы решить эту проблему, BIOS можно настроить на включение при восстановлении переменного тока и запланировать выключение в Ubuntu после этого. Обратитесь к руководству по материнской плате для получения дополнительной информации.

Для того, чтобы WOL работал, убедитесь, что ваш интерфейс Ethernet правильно отключен вашей системой при отключении питания.

Создайте скрипт bash с именем wol_poweroff.sh в каталоге /etc/rc6.d/:

Поместите этот код в это:

Скопируйте его в каталог /etc/rc0.d (чтобы он также работал с halt):

Сделайте их обоих исполняемыми:

По словам автора, Робби Уильямсона, это работает из-за следующего:

Чтобы заставить WOL работать, интерфейс Ethernet должен быть надлежащим образом отключен как часть выключения системы. Это должно быть выполнено как часть уровней запуска rc0 и rc6, отмечая, что Linux обычно имеет 7 различных уровней запуска (или режимов работы):

rc0.d - система остановлена

rc1.d - однопользовательский режим

rc2.d - однопользовательский режим с поддержкой сети

rc3.d - многопользовательский режим - загрузка в текстовом режиме

rc4.d - еще не определено

rc5.d - многопользовательский режим - загрузка в X Windows

rc6.d - выключение и перезагрузка

Запустите следующее в терминале:

Вы должны увидеть g рядом с пробуждением по локальной сети после написания второй команды

Помимо параметров, предложенных @nkef, вы можете установить следующие параметры в /etc/network/interfaces, если вы используете DHCP вместо статических настроек IP для сетевого адаптера (здесь он называется eth0):

(проверено на Ubuntu 16.04 LTS).

Если вы используете NetworkManager, то вы можете включить WOL через nmcli :

Запомните НАИМЕНОВАНИЕ подключения ТИПА "802-3-ehternet" для УСТРОЙСТВА, представляющего интерес. Скажите, что это имя "Проводное соединение 1". Затем измените его правильно:

Чтобы получить его MAC-адрес:

Теперь вы можете выключить его и включить с другого компьютера в той же локальной сети с помощью wakeonlan 1a:2b:3c:4d:5e:6f команда, где 1a:2b:3c:4d:5e:6f MAC-адрес сетевой карты предыдущего шага

Это меня немного поразило в Ubuntu 18.04 (безголовая / минимальная установка), к сожалению, уже перечисленные здесь ответы, хотя иногда они могут показаться работающими, не дают надежного решения, поскольку они создают условия гонки или сражаются с подобными systemd, Нетплан и Удев.

Я тоже сначала попробовал этот подход, и он, похоже, сработал, я планирую загрузку системы каждый вечер через WakeOnLan для запуска резервного копирования, поскольку системный BIOS не обеспечивает опцию запланированного включения переменного тока.

Он работал бы в течение нескольких дней, а затем отказывался просыпаться, включение его вручную и запуск ethtool показывали, что WoL был отключен:

Поэтому я решил, что нужно было еще кое-что отключить, и у меня было много таких проблем в последние несколько лет, когда systemd захватил части системы, и я решил начать здесь, о чудо:

WakeOnLan =. По умолчанию выключено.

Примеры онлайн показывают что-то вроде:

Как бы то ни было, это все еще не работает. Потом я наткнулся на это:

И что я могу найти в /run/systemd/network/10-netplan-eno1.link?

Решение Либо:

  1. удалить нетплан,
  2. настроить сеть через конфигурацию netplan,
  3. или установите файл systemd.link для более высокого приоритета.

Поскольку у меня уже был файл systemd.link, я просто переименовал его в 00-wired.link, перезагрузился, и теперь отчеты ethtool eno1:

Без каких-либо дополнительных услуг исключительно для того, чтобы попытаться включить WoL.

Немного заметок об особенностях работы Wake On LAN (WOL) в операционной системе Debian.

Аппаратная часть

Ваш первый шаг к загрузке компьютера через сеть - убедиться, что ваша Ethernet-карта и материнская плата поддерживают какой-либо тип функции Wake On LAN. В особенности карты 3Com's маркировки -NM (non managed) не поддерживают WOL, тогда как карты маркировки -M (managed) поддерживают.

Есть две основные системы. Старый способ заключается в использовании 3-пинового коннектора Wake On LAN между вашей Ethernet-картой и материнской платой. Оба гнезда(англ.версия - "headers") обычно именуются 'wol'. Более новая система использует Wake On LAN pin на PCI-шине, что устраняет необходимость в кабеле. Некоторые материнские платы поддерживают оба варианта и только предоставляют гнездо для обратной совместимости с Ethernet-картами, не поддерживающими PCI pin.

Более новые материнские платы с встроенными сетевыми картами поддерживают Wake On LAN без необходимости каких-либо выводов / кабелей.

Прошивка / BIOS

В хорошем BIOS в управлении питанием вы найдёте ясную, интуитивно понятную опцию "Wake On LAN". К сожалению, моя система не была столь ясной и имела несколько возможных вариантов. один казался работающим всегда, остальные - временами. Я строил по информации заимствованной у Mark Ivey, т.к. У меня тоже есть Shuttle XPC SK41G и я успешно использую опцию "PowerOn by PCI Card". 1

Настройка интерфейса

stretch

Добавьте этот файл:

перезагрузитесь. Проверьте работу:

Директива Wake-on: g означает, что всё работает.

Squeeze

Для Squeeze ethtool параметры могут быть установлены непосредственно из /etc/network/interfaces. Результат выше может быть достигнут так:

Скрипт /etc/network/if-up.d/ethtool будет заботиться о вызове ethtool по ifup. Читайте /usr/share/doc/ethtool/README.Debian для более полной информации.

Дальше можете выключить систему и приготовить остальные системы, чтобы разбудить её.

После squeeze

После аппаратной активации Wake On LAN также необходимо активировать его в программном обеспечении. Это делается с использованием программы ethtool, которая говорит интерфейсу отвечать на волшебный пакет (the magic packet). Замените eth0 на имя вашего сетевого интерфейса:

Это можно автоматизировать с помощью записи в /etc/network/interfaces:

Это запускает ethtool после каждого подъёма интерфейса eth0, а также после его отключения, таким образом WOL должен работать даже в случае, когда сеть отключена некорректно.

Я установил пакет etherwake в контролирующей системе для отправки "Magic Packet" к моему компьютеру для пробуждения. Программа должна быть запущена от имени root для отправки пакета (Я использую sudo для её запуска).

Также доступен wakeonlan - программа, использующая UDP-пакеты, а TCP, и не требующая прав root для запуска. Она также чуть более гибкая в настройке.

WOL чувствительность

WOL Persistence

Hardware looks up to spec, you think the BIOS is set right, but it still doesn't work without some tweaking using the software. According to the Wake On Lan client FAQ most Linux drivers disable the WOL feature on boot 2 , so we need to get it going.

Kernel 2.6

With a 2.6 kernel we're using /etc/modprobe.d. You may be using /etc/modprobe.conf, but if it's not including /etc/modprobe.d you're probably getting told about that each time you boot and some stuff may not be configured properly. I'm using /etc/modprobe.d and I added a file local.conf into the directory. It says:

Testing on another machine with a C3905B-TXNM and a 3C905C-TXM that uses the 3c59x module to drive them both I found that ethtool was unable to query them or set the WOL setting, but that the enable_wol=1 setting did work and was required.

While I was messing with these settings, I noticed that both 8139too and 8139cp were loading, but loading just 8139cp alone failed since my chipset isn't new enough so I blacklisted it.

Debugging state with ethtool

After an hour struggling with why my system still didn't work I started throwing in the ethtool query command all over the place to see what the deal was:

I found that (at least with my 8139too driver on Debian 3.1/Sarge) the install line was working when I'd modprobe 8139too, but ifup also resets the WOL setting, so I added an up line to /etc/network/interfaces under eth0:

I kept the ethtool command in /etc/modprobe.d/local.conf in case I boot and ifup isn't executed before shutting down.

Conclusion

Wake On LAN works on Debian and opens some new options up to me.

I can log into my gateway and boot my desktop, grab what I need and then power it back off remotely. I'm using DHCP with MAC-to-IP mappings so I can look in that file on my gateway system to know the MAC address of the system I wish to wake up. If I didn't have that I could keep a text file.

My next feat is to have non-essential systems power-off (not just halt) on a power outage to extend the battery runtime for the essential systems and then use WOL to power the other systems back on after power is restored and the battery has hit some specific charge level. I think some settings with halt or APM or ACPI are not right on those systems. See OffAndOnAgain.

И все бы хорошо, если бы не одно но. После сбоя питания ваш компьютер не включится.
Согласитесь, это будет «приятной» неожиданностью, особенно если вы находитесь за пару тысяч километров от него.
Одно из решений написано здесь, но оно аппаратно-программное, а ведь можно обойтись без дополнительного железа.

Про WOL на Хабре можно найти уже две станицы. Поэтому в этой статье не будет рассматриваться включение wol на карточке.

Введение

Для начала разберемся, почему компьютер не включится. Для понимания этого стоит обратится к ACPI.
ACPI — англ. Advanced Configuration and Power Interface — усовершенствованный интерфейс управления конфигурацией и питанием). В ACPI описаны состояния — как глобальные, так и конкретных устройств в частности. (wiki)

image

  • G2 (S5) (soft-off) — мягкое (программное) выключение; система полностью остановлена, но под напряжением, готова включиться в любой момент. Системный контекст утерян.
  • G3 (mechanical off) — механическое выключение системы; блок питания ATX отключен.
  • «Stay Off» – при потере питания в сети и его восстановлении для включения ПК необходимо нажать кнопку питания.
  • «Turn On» – восстановление питания вызывает автоматическое включение системы.
  • «Last State» – Восстановление системы в то состояние, в котором она находилась на момент пропадания питания. Если была выключены — остается выключена, иначе включается.

Выбрав «Turn On», останется вопрос лишь в том, как выключить компьютер, когда он включился после сбоя питания, а не от запроса по сети или штатного запуска кнопкой на корпусе. Делать эти проверки мы будем в initrd.

Initrd (сокращение от англ. Initial RAM Disk, диск в оперативной памяти для начальной инициализации) — временная файловая система, используемая ядром Linux при начальной загрузке. (wiki_ru) (wiki_en)

Расположение файлов для initrd в Ubuntu/Debian можно посмотреть в man на initramfs-tools (онлайн с сайта Ubuntu).
Для Centos все немного по другому — там dracut.

Для обеспечения проверки, как был включен компьютер, после посылки wol пакета мы будем пинговать его. Но так как пакет WOL у нас «магический», пусть пинги будут тоже «магическими». Пусть наши пинги будут размером в 48 байт, а не в 84.

image

Итого вся идея в виде блок-схемы:

Реализация

Модули

В /etc/initramfs-tools/modules добавим необходимые модули для работы iptables и сети.

Модуль для вашей сетевой карты
Модули iptables
Скрипт

В /etc/initramfs-tools/scripts/local-top/ добавим файл checkboot с содержимым:


И делаем его исполняемым:


Скрипт реализует блок-схему, приведенную выше.

В /etc/initramfs-tools/hooks/ добавим файл checkboot с содержимым:


И делаем его исполняемым:


Этот файл указывает, что необходимо добавить в initrd для корректной работы нашего скрипта.
В нем после копирования утилит iptables и ifconfig необходимо так же скопировать библиотеки для iptables.
Слинкованные библиотеки можно получить, выполнив ldd /sbin/iptables.
Но в процессе работы также будут использоваться динамически подгружаемые модули. Их список можно увидеть, выполнив команду:


Что позволит получить остальные подгружаемые библиотеки:

Update initrd

Перед обновлением initrd хорошей идеей является скопировать стабильный вариант в /boot с другим именем, чтобы в случае каких-либо ошибок в скрипте/хуке загрузка системы не представляла сложности.
Обновляем initrd командой:

Добавляем новые строчки в grub с nocheckboot.
Делаем это либо непосредственным редактированием /boot/grub/grub.cfg с созданием нового пункта с добавлением nocheckboot в строке параметров к ядру, либо изменяя /etc/grub.d/10_linux, что лучше, так как после update-grub2 наши изменения не исчезнут, как случится, если мы будем редактировать grub.cfg.

Для этого в /etc/grub.d/10_linux добавляем:

Запуск

Осталось только написать скрипт запуска.
И вот он:


Здесь "-c 50" — это 50 пакетов, 1 пакет в секунду, а значит 50 секунд — время, за которое должны пройти все этапы до «Проверка счетчика правила iptables». А "-s 20" делает размер пакета равным 48 байтам. 48 — 20 = 28 байт — заголовки IP и ETHERNET.

Как настроить Wake On Lan в Linux-01

Как настроить Wake On Lan в Linux-01

Всем привет сегодня расскажу как настроить Wake On Lan в Linux.

WakeOnLan (WOL) — это технология позволяющая включить компьютер, методом отправки на него специального пакета данных, называемыми Magic Packet. Принцип работы этой технологии таков, что при выключении компьютера он переходит в дежурный режим и переводит сетевую карту в режим пониженного потребления, просматривая все поступающие пакеты из сети. Если сетевой адаптер обнаружит Magic Packet, он выдаст сигнал на включение компьютера. Примечание: для использования данной технологии необходима поддержка данной функции (технологии) сетевым адаптером, почти все современные сетевые адаптеры поддерживают данную технологию.

В данном посте мы рассмотрим настройку данной функции на примере ОС Linux.

1. В первую очередь мы просмотрим список наших сетевых интерфейсов используя утилиту ethtool:
ifconfig

В ответ получим список наших используемых сетевых интерфейсов (в моём случае он 1):

eth0 Link encap:Ethernet HWaddr 6c:62:6d:f0:ce:b4
inet6 addr: fe80::6e62:6dff:fef0:ceb4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4528 errors:0 dropped:0 overruns:0 frame:0
TX packets:491 errors:0 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:1000
RX bytes:686281 (670.1 KiB) TX bytes:61590 (60.1 KiB)

Нам необходим интерфейс который имеет доступ к внешней сети (в моём случае eth0). Теперь проверим поддерживает ли сетевой адаптер данную технологию и настроим её используя утилиту ethtool. Устанавливаем её:
apt-get install ethtool — для Debian
yum install ethtool — для CentOS

и запустим её, для просмотра информации о сетевом интерфейсе:
ethtool eth0

В ответ мы получим всю информацию о нашем сетевом интерфейсе:

Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: Unknown
Supports Wake-on: pg
Wake-on: d
Current message level: 0x0000003f (63)
drv probe link timer ifdown ifup
Link detected: yes

Где Supports Wake-on: pg — означает что наш сетевой интерфейс поддерживает технологию Wake On Lan, Wake-on: d — но она отключена.

Wake On Lan можно включить вручную 1 командой, но при каждой перезагрузке нашей машины он будет деактивироватся, для этого мы создадим и будем использовать специальный скрипт.
Для этого выполняем следующее:
cd /etc/init.d/
nano wakeonlanconfig

Даём права скрипту:
chmod a+x wakeonlanconfig

Создаём символическую ссылку и делаем наш скрипт исполняемым:
update-rc.d -f wakeonlanconfig defaults

Проверяем что всё нормально вводим команду:
/etc/init.d/wakeonlanconfig

Если ничего в ответ не получили, значит всё хорошо и можно проверить на практике.

Читайте также: