Tento návod se týká desktopových pc, běžících na ubuntu-server 24.04 LTS, nad kterými následně může běžet např. KVM VM s Windows. Pokud plánujete stejné řešení pro servery, předpokládám, že tam budete mít mnohem komplexnější síťovou konfiguraci plnou bridgů, vlan, bondingů atd… O tom možná někdy příště, dnes je to desktopová záležitost.
Stroje mohou mít více síťových rozhraní, proto tímto příkazem zjistíme síťové karty, které jsou ve stavu UP a začínají buď na enp, nebo eth nebo eno:
ip addr sh|egrep "enp|eno|eth"|grep UP
Výstup v mém případě:
3: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
Jednorázové povolení Wake On Lan (pokud nechcete mít Wake on Lan zapnutý trvale)
Ověření aktuálního stavu, kde jde vidět, že je to zakázáno:
ethtool enp8s0
Z celého výstupu nás zajímají jen tyto řádky:
Supports Wake-on: pumbg
Wake-on: d
Link detected: yes
Wake-on: d znamená disabled, zakázané.
Povolíme to příkazem:
ethtool -s enp8s0 wol g
příkaz nevrátí nic, ale když dáme znovu ethtool enp8s0 uvidíme na konci tento výstup:
Supports Wake-on: pumbg
Wake-on: g
Link detected: yes
Pokud byste měli doma v síti počítač, který byste chtěli vzbudit při pingu, nebo zavolání SSH tak možnost „u“ při jakémkoliv unicast packetu vzbudí počítač. Tedy ping, ale i ssh nebo jakýkoliv unicast packet, mířící na tento stroj. Nejčastěji se ale pro vzbuzení počítače (Wake on Lan, dále jen WoL) používá právě Magic Packet k tomu určený.
Netplan
Na ubuntu-server 24.04 LTS je defaultní cesta pro síťovou konfiguraci v /etc/netplan/50-cloud-init.yaml
network:
version: 2
ethernets:
enp8s0:
dhcp4: true
wakeonlan: true
A to je vše. Pozor na správné odsazení wakeonlan: true je na stejné úrovni, jako dhcp4: true.
Tohle nastavení má jednu zásadní nevýhodu. Pokud máte síťovou kartu ve stroji v pci-express 1x pozici úplně někde na dně počítače a předtím vám nějaká karta umře (třeba USB řadič navíc, nebo grafická karta, přičemž třeba počítač stále nabootuje s integrovanou grafikou), tak už počítač nevzbudíte a dost možná si ani nechytne IP adresu, což je škoda.
Na druhou stranu např. v prostředí, kde máte všude port securitu na každém portu na switchi, který má nastavenou pouze jednu konkrétní MAC adresu, tak jste schopni v případě nutnosti vyměnit celý počítač za „náhradní“, nebo pokud vám umře základní deska, vyměníte základní desku, ale MAC adresa zůstává stejná díky síťové kartě v pci-express 1x. A když ponecháte síťovou kartu na portu, ke kterému patří, stroj se vždy bez ohledu na jeho konfiguraci dostane do internetu. Samozřejmě musíte počítat s tím, že když vložíte síťovou kartu do jakéhokoliv jiného počítače, nemusí to být vždy enp8s0, ale třeba enp5s0 atd… Ale důležité je, že je to snadno řešitelné.
Další možnost řešení je stanovit macadress a nastavit tak na pevno MAC adresu tomu rozhraní, nicméně to v některých prostředí nemusí být řešitelné u stovek stejných počítačů. To byste museli ansiblem získat mac adresu, zkontrolovat ji dle nějakého seznamu povolených mac adress (protože některé stroje mohou mít i několik síťových rozhranní a s tím se váže i několik mac adres) a následně ji vložit do souboru.
Úprava netplan yaml konfigurace ansiblem
Toto je ukázka z funkčního ansible-playbooku, který byl skutečně otestován a udělal přesně to, co vidíte ve vypsaném netplan konfiguráku výše:
---
- name: Ansible netplan network wakeonlan
hosts: stroje
gather_facts: true
become: true
vars:
wol_ignore_interfaces:
- lo
- virbr0
tasks:
- name: Get list of all network interfaces
ansible.builtin.shell: "ip -o link show | awk -F': ' '{print $2}'"
register: all_interfaces
changed_when: false
- name: Filter out ignored interfaces
ansible.builtin.set_fact:
target_interfaces: "{{ all_interfaces.stdout_lines | difference(wol_ignore_interfaces) }}"
- name: Find Netplan configuration file
ansible.builtin.find:
paths: /etc/netplan
patterns: "*.yaml"
register: netplan_files
- name: Add wakeonlan true to each ethernet interface
ansible.builtin.lineinfile:
path: "{{ item.path }}"
# Hledá, zda řádek 'wakeonlan: true' již existuje
regexp: '^\s*wakeonlan: true'
# Pokud ho najde, neudělá nic. Pokud ne, vloží ho za řádek s 'dhcp4: true'.
insertafter: '^\s*dhcp4: true'
line: ' wakeonlan: true'
loop: "{{ netplan_files.files }}"
loop_control:
label: "{{ item.path }}"
when: item.path is defined and item.path is not none
- name: Verify Wake-on-LAN setting using ethtool
ansible.builtin.command: "ethtool {{ item }}"
register: wol_status
loop: "{{ target_interfaces }}"
changed_when: false
- name: Show WOL status for all target interfaces
ansible.builtin.debug:
msg: "Interface {{ item.item }} - {{ item.stdout_lines | select('search', 'Wake-on') | first }}"
loop: "{{ wol_status.results }}"
loop_control:
label: "{{ item.item }}"
- name: get ethtool -s enp8s0 wol g
become: true
shell: |
ethtool -s enp8s0 wol g
Úžasnost ansiblu tkví v tom, že ho můžete do nekonečna ladit a vylepšovat. Mohl jsem tam na konci místo enp8s0 řešit aktivní rozhraní a vložit to tam v proměnné. Ale pokud máte unifikované stroje, tak si ušetříte trošku námahy, když víte, že všechny síťové karty budou mít vždy enp8s0.
Další cesty
Když dáte googlit po internetu nejrůznější řešení, tak se často budete setkávat s tím, že si někdo přes systemd vytvoří skript, kterým při každém spuštění systému zavolá jednorázový příkaz
ethtool -s enp8s0 wol g
a protože pokaždé takový stroj bude startovat se stejným skriptem, tak se takto jednorázově, ale cyklicky při každém spuštění stroj sám nastaví, aby Magic Packety přijímal. zdroj2 zdroj3
Další cesty vedou skrze nmcli a cesta /etc/systemd/network/ u mě na ubuntu-server 24.04 LTS naprosto nefungovala.
Jedno uvědomění na závěr
Pokud nastavíte jen ten netplan a hned vypnete stroj, už ho stejně nezapnete, pokud jste předtím nedali příkaz:
ethtool -s enp8s0 wol g
nebo nedali netplan apply, nicméně pokud jste na vzdálené konzoli přes ssh, můžete být odstřiženi od stroje.
Reboot je účinné řešení, pokud už máte nastavený netplan správně a vše správně odsazené, jak to být má tak po rebootu už stroj půjde vzbudit ok a nehrozí, že se stroj zasekne ve fázi, kdy se na něj nedá připojit.
zdroj zdroj2 zdroj3 zdroj4