Linux WOL 기능. Realtek 랜카드와는…

New TLDR; (2020-08-31 현재)

우분투 20.04-1 기준으로, 역시 이 문제는 해결되지 않았다.
그러나, 아주 간단하게 해결할 수 있었다.

Ubuntu Server 20.04 (netplan 사용)

  • /etc/netplan/*.yaml 파일을 수정함으로써 Wake On Lan 은 작동한다. 물론 드라이버는 기본 설정값인 r8169 이다.
  • 만약 위로 해결되지 않는다면, r8169 를 지우고 r8168 을 설치해볼 필요가 있다.

Ubuntu Desktop 20.04 (NetworkManager 사용)

ArchLinux 문서에 따르면, nmcli 를 사용하여 WOL 을 사용하도록 설정할 수 있다.

먼저, sudo ethtool <네트웍 카드> 를 실행하여 WOL 을 사용할 수 있는지 확인한다.

D 로 나온다면 가능하도록 바꿔준다. 모두 관리자 권한으로 실행한다.

# nmcli con show
NAME    UUID                                  TYPE            DEVICE
wired1  612e300a-c047-4adb-91e2-12ea7bfe214e  802-3-ethernet  enp0s25

위 명령 결과 NAME 항목은 ‘wired’ 이고, 이 값이 필요하다.

# nmcli c show "wired1" | grep 802-3-ethernet.wake-on-lan
802-3-ethernet.wake-on-lan:             default
802-3-ethernet.wake-on-lan-password:    --

default 가 나오면 WOL 이 실행되지 않는다는 의미이므로, 이 값을 magic 으로 바꿔줘야한다.

# nmcli c modify "wired1" 802-3-ethernet.wake-on-lan magic

이 결과, /etc/NetworkManager/system-connections/wired1.nmconnection 이란 파일이 생기고, 여기에 wake-on-lan=64 란 항목이 생기면서, 이후 WOL 이 가능해진다. (r8169 로 가능했다.)

** 아래 글은 굳이 읽을 필요는 없으나..


  • (Old.. )TLDR;
    Realtek 랜카드에선, 적어도 리눅스를 사용하는 동안에는 WOL 이 제대로 작동하지 않을 가능성이 높다.
    이를 위해선, 기본으로 설치되는 r8169 드라이버 대신, r8168 을 사용하면 되기도 한다.
    그러나, LattePanda 에선 뭔 짓을 해도 WOL 을 사용할 수 없었다.

    이 기능을 별 문제없이 쓰고 싶다면 Intel 칩셋 랜카드를 추가로 달거나, 그게 어렵다면 스마트 플러그(글 끝에 설명)를 다는 방법도 생각해볼 순 있겠다.
    (Intel 칩셋에 WOL 문제가 있는지 없는지는 알 수가 없다. 허나, 검색 결과에 걸린 내용은 거의 전부 Realtek 이었기에 Intel 은 괜찮지 않을까 짐작할 뿐.)

이걸 해보느라 또 긴 시간을 허비했다. 그 결과는 LattePanda 에선 불가능, 일반 메인보드에선 가능.
구글을 뒤졌을 때, 제대로된 답을 짧은 시간 안에 구하지 못하면 그 문제는 해결되지 않았을 공산이 높다.
그래도.. (전 세계인이 했던) 이런 저런 시행착오를 그대로 따라해봤다.

문제는 이렇다.
내 보드에서(거의 대부분의 ‘요즘’ 메인보드에서) WOL 기능은 별 문제없이 잘 작동한다. 문제는 하드웨어가 아니라 소프트웨어에 있고, 그 중에서도 리눅스가 문제다.

MS 윈도우나, 심지어 해킨토시를 실행하다가 끈 후(Shutdown)에는 WOL 이 뜻한 대로(?) 작동한다. 그러나, 리눅스 계열(우분투/아치/수저에서 시험)에선 내 의지를 박살내버렸다.

이건 Realtek 의 문제라고 한다. 리눅스에선 전원을 끈 이후, 랜카드 쪽에 불이 들어오지 않았다. MS 윈도우/해킨토시에선 불이 들어온다.
따라서, 아무리 WOL 시그날을 보내도(시그날 보내 시그날 보내~), 전혀 반응이 없을 수 밖에.

아예 전원을 차단했다가(플러그를 뽑았다거나, 파워 서플라이 스위치를 껐다거나) 다시 연결하면, 랜카드 쪽 불이 들어옴을 볼 수 있었다.
그러나 리눅스에선 전원을 끌 때 랜카드 쪽 전원까지 완전히 차단하기에, WOL 이 파고들 여지가 없어진다.
이게 더 확실한 게, 부트 관리자인 rEFInd 에서도 전원을 끌 수가 있는데, 여기서 셧다운을 하면 랜카드에 불이 들어와있는 상태가 되고, WOL 이 작동한다.
따라서, 리눅스 쪽에 문제가 있다는게 확실하다.

Realtek 에서만 이런 문제가 있다고 보고 되고 있으니, WOL 을 꼭 쓰겠다면 Intel 이나 기타 다른 칩셋을 쓰는게 현명한 판단이 되겠다.
소프트웨어로만 해결하려면, 기본 드라이버인 r8169 대신, r8168 을 쓰면 된다. (물론 안될 가능성도 있다. LattePanda 는 결국 안됐다.)

애초에, LattePanda 는 맨 처음 전원을 연결한 후에는 WOL 이 되지 않는다. MS 윈도우에서 종료한 뒤에는 WOL 이 되지만, 초기 연결 시나, 리눅스로 전원을 끈 뒤에는 안된다.

상황보고는 여기서 끝. 각종 시도에 대해서는 아래에서 정리한다.

그에 앞서, 과연 내 랜카드가 WOL 을 지원하는지는 어떻게 확인해볼 수 있을까?
먼저 다음 조건들이 충족되어야 한다.

  • 펌웨어에 WOL(또는 PCIE) 관련 항목이 있고, 켜져 있어야 한다.
  • 전원을 끈 뒤, 네트웍포트를 봤을 때 LED 가 하나 들어와 있어야 한다.

이러면 하드웨어 필요조건은 충족됐다고 볼 수 있다.
그런데, LED 점등은 큰 상관은 없어 보인다. 현재, 내가 가지고 있는 보드 중 하나는 점등 여부와는 관계없이 WOL 이 작동한다. (불이 안들어와서 꽝이라 생각하고 짜증이 확 밀려오려던 순간.. 전원이 켜져서 속으로 살짝 만세를!)

WOL 지원 확인

보다 자세하게 제원(諸元)에 대해(정말 칩셋에서 지원이 되는지 여부) 알고 싶다면, 명령 하나면 간단히 알아볼 수는 있다.

ethtool <랜카드 명>
.....
	Supports Wake-on: pumbg
	Wake-on: g
......

위와 같은 결과가 나왔다면, 보다 정확하게는, ‘Supports Wake-on’ 에 g 가 포함되어 있고, ‘Wake-on’ 에 g 가 있으면 하드웨어 선에서는 이 기능을 지원한다고 할 수 있다. (그러나 그렇다해도 실제론 안(못?) 되기에, 이 글을 쓰고 있다.)

** 만약 Wake-on: D 라면?

Wake-on 값들의 종류의 의미는 다음과 같다.

  • d (disabled)
  • p (PHY activity)
  • u (unicast activity)
  • m (multicast activity)
  • b (broadcast activity)
  • a (ARP activity
  • g (magic packet activity)

나머지 값들의 정확한 의미는 모르겠고, D 일 경우 작동 안함, G 일 경우 작동. 이 사항만 기억하면 되겠다.

만약, 이 값이 d 라면, 이번 부팅(또는 이번 生?)에 한해서 g 값으로 바꿔줄 수도 있고, 영속하여 g 값을 갖게끔 해줄 수도 있다.

한번만!

$ sudo ethtool -s eth0 wol g

netplan 설정 파일 수정

값이 지속되도록 해주려면, Ubuntu Server 18.04 에서는, /etc/netplan/50-cloud-init.yaml 을 다음과 같이 편집함으로써 g 값으로 변경할 수 있다. (이 방법이 배포판마다 다르고, 여러 방식이 있다. 아치에서는 systemd 를 이용하기도 한다.)

# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        card name:
            dhcp4: true
            mtu: 9000
            match:
                macaddress: aa:bb:cc:dd:ee:ff
            wakeonlan: true
    version: 2

하는 김에 mtu 값(Jumbo Frame 을 위해)까지. g 를 위해선 wakeonlan : true 만 설정하면 된다.


내 두 대의 컴퓨터 모두 Realtek 칩을 사용하고 있었고, 모두 r8169 드라이버를 쓰고 있었다.

일단, 몇가지 시도에 대해 정리한다.

r8168 드라이버로 바꾸는 방법.

혹자는 r8168 로 드라이버를 바꾸고, 커널 옵션을 주면 성공했다고도 한다.
이 방법대로 수정하고 나서 일반 메인보드에선 WOL 을 사용할 수 있게 됐지만, LattePanda 에선 변함없이 WOL 은 불가였다. (설치법은 이 글 맨 끝)

net plan 편집

/etc/netplan/50-cloud-init.yaml (또는 여기에 위치한 다른 yaml 파일)에 몇몇 설정을 추가하는 방법도 있다고 하지만, 효과없음.

acpi-support 편집

또는, /etc/default/acpi-support편집하여(White List 에 r8169 삽입) 성공했다고도 하지만, 역시나 난 마찬가지.

/etc/default/halt 편집

이 방법은 우분투 16.04 까지 쓰였던 듯 한데, 18.04 부턴 이 파일이 아예 없다.

Ethernet Down 신호 먼저 주기.

두가지 방법 모두 작동하지 않음.

이 정도면, 현재 나와있는 방법은 다 해봤다고 할 수 있겠다.


* r8168 모듈 설치 정리.

위 여러 가지 방법 중, r8168 로 8169 를 대체하는 법에 대해서 정리해본다. (정리란 표현이 무색할만큼, 글이 너저분하고 길다. 쓰고 나서 몇번을 덧대고 기웠기 때문이다..)

먼저 여기로 가서, 최신 r8168 드라이버를 다운 받는다. 이 글을 쓰는 시점에선 r8168-dkms_8.047.05-1_all.deb 이 최신이다.
받은 파일을 dkpg -i 등으로 설치한다.

설치가 끝나면 재부팅을 하고, r8168 이 제대로 등록되었는지 확인한다.

$ sudo ethtool -i <랜카드명>
driver: r8168
version: 8.047.05-NAPI
firmware-version: 
expansion-rom-version: 
bus-info: 0000:03:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

driver 에 r8169 가 그대로 나온다면, 설치에 문제가 있었다고 볼 수 있다. 관련 파일을 모두 삭제하고 재설치할 필요가 있다.

또는, r8169 를 블랙리스트에 넣어줘야 할 수도 있다. 그럴 땐, /etc/modprobe.d/r8168-dkms.conf 에서 다음 행을 주석해제 한다.

# settings for r8168-dkms

# map the specific PCI IDs instead of blacklisting the whole r8169 module
alias	pci:v00001186d00004300sv00001186sd00004B10bc*sc*i*	r8168
alias	pci:v000010ECd00008168sv*sd*bc*sc*i*			r8168

# if the aliases above do not work, uncomment the following line
# to blacklist the whole r8169 module
blacklist r8169

…….

** 커널 모듈.. 확실한 확인을 위해서는??

커널 모듈이 떴는지 아닌지, 확실하게 확인을 하는 방법이 있나? 찾아봤지만, 그 모듈이 떠 있는지는 확인할 수 있어도, 어떤 선택사항까지 포함하고 있는지는 확인하기가 어려웠다. (modinfo 가 이런 기능을 하긴 하지만, 거기에 나오는 내용이 ‘현재 적용된 선택사항’이라기 보다는, 지원 가능한 모든 선택사항이라는 글도 있었기에, 확신이 서질 않는다.)

아무튼, 그 중, lsinitramfs 로도 현재 커널 모듈 상황을 알아볼 수가 있다.
사용법은 다음과 같다.

sudo lsinitramfs /boot/initrd.img-5.0.0-37-generic

명령 뒤에는 원하는 커널 이미지를 넣어준다.

그런데.. r8168 드라이버를 설치하고, 심지어 r8169 를 blacklist 에 올린 뒤에도 이런 결과가 나온다.

sudo lsinitramfs /boot/initrd.img-5.0.0-37-generic | grep -i r81
etc/modprobe.d/r8168-dkms.conf
lib/modules/5.0.0-37-generic/kernel/drivers/net/ethernet/realtek/r8169.ko
lib/modules/5.0.0-37-generic/updates/dkms/r8168.ko

/lib/modules/5.0.0-37-generic/kernel/drivers/net/ethernet/realtek/r8169.ko 이게 여전히, 현재 커널의 모듈로서 작동을 하고 있다고??

그렇다면 rmmod 로 지울 수 있을까?

$ sudo rmmod /lib/modules/5.0.0-37-generic/kernel/drivers/net/ethernet/realtek/r8169.ko
$ sudo rmmod r8169

## 위 두 명령, 결과는 같다.
rmmod: ERROR: rmmod: ERROR: Module r8169 is not currently loaded

보는 바와 같이 r8169 를 내릴 수가 없다. 왜냐하면, r8168 모듈을 설치하면서 이미 r8169 는 내려가 있는 상태가 됐기 때문이다. (또는 blacklist 에 의해 막혀버렸을 수도 있다.)
그럼에도 불구하고, 커널 이미지에는 r8169 가 포함된 상태로 남아있다.

확실하진 않지만, lsinitramfs 는, 커널이 불러와질 때 어떤 모듈들로 시작할지를 보여주는 명령인 듯 하다.
이와 비교해서, lsmod 는, 현재 적재된 모듈만을 보여준다.
따라서 lsinitramfs 에는 있으나, lsmod 에선 없는 모듈이 있다면, 이건 blacklist 등에 의해 사후에 거부된 모듈이라 보면 되겠다.

따라서, 그냥 이대로 놔둬도 큰 문제는 없을 듯 하다.
그래도, 나름대로 깔끔을 떨어본다면..

먼저 r8169 커널 모듈을 지우거나, 이름을 바꿔줘야 한다. 나중에라도 필요할 수 있으므로 지우지는 말고 이름만 바꾸는게 좋겠다.

sudo mv /lib/modules/5.0.0-37-generic/kernel/drivers/net/ethernet/realtek/r8169.ko /lib/modules/5.0.0-37-generic/kernel/drivers/net/ethernet/realtek/r8169.ko.org

이름만 바꾼다고 되는 게 아니고, 이 상황으로 커널 이미지를 다시 만들어야 한다. 그걸 해주는게 바로 update-initramfs 이다.

sudo update-initramfs -u

이제 끝. r8169 는 더 이상 찾아볼 수 없게 됐다.
(혹시라도 다시 r8169 로 돌아가려면, 8168 꾸러미를 먼저 지우고, 저 파일 확장자를 다시 되돌려 놓아야 한다.)

…..

다시 돌아와서, 내가 사용 중인 일반 메인보드에서는, 그냥 r8168 꾸러미만 설치하고 별다른 설정(blacklist)을 하지 않았음에도 WOL 이 아무 무리없이 잘 작동했다.

만약, 잘 안된다면 몇가지 더 건드려볼 여지는 있다.

s5wol=1커널 옵션에 추가하면 WOL 이 작동할 수도 있다는 얘기가 있다. (추가로 aspm, eee_enable 등등까지도.)

echo options r8168 aspm=1 s5wol=1 eee_enable=1 | sudo tee /etc/modprobe.d/r8168-dkms.conf

이렇게 해서 성공한 사람도 있는 모양인데.. (물론 이 사람의 보드가 LattePanda 는 아녔을 거다.)
LattePanda 엔 그런 행운이 없었네.

다음엔 꼭 Intel 칩 들어간 보드로 사야지..

** 스마트 플러그?
보드에 따라 다르겠지만, 적어도 내 보드는, 완전히 전원을 해제(플러그 뽑음)했다가 다시 연결하면, 랜카드에 불이 들어온 상태가 된다.
따라서, 리눅스를 사용했다 하더라도, 스마트 플러그를 사용하여 전원을 완전히 차단했다가 다시 연결하면 랜카드에 전원이 들어가므로, 그 후 WOL 을 사용할 수도 있겠다.

또는, 아예 전원이 들어오면 무조건 켜지는 기능을 펌웨어에서 켜놓으면, WOL 기능을 빌리지 않고도 스마트 플러그만으 켜는 작업을 할 수도 있을 듯???
(정말 이렇게까지 해서 필요하다면 말이지..)

2 Comments
  1. Avatar
    • 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.