2015年10月24日 星期六

[NETWORK] 用 QNAP TS-109 NAS 網路喚醒開機 GIGABYTE BRIX

通常不是很機車我不會寫 blog, 一定是很花時間才需要紀錄下來.

狀況是這樣, 我買了 GIGABYTE BRIX 4770R 作為家中的開發機器. 它體積小攜帶方便, 可以定點在辦公室, 實驗室或家中進行開發使用. 但是如果有時候忘了帶, 或者是臨時用用. 抑或是出國的時候不想帶. 臨時要開機就很麻煩, 若一直開著會有耗電問題. 所以今天想設定看看能不能讓 BRIX 網路開機. 想不到過程比我想的還麻煩.

BRIX 4770R 端的設定:

完全不需要設定, 預設 BIOS 就會把 wake on lan 的功能打開, 事實上 BIOS menu 中也沒有任何選項可以調整. 讓我找了一陣子. 我的 BIOS 是 2014 年底的 F6 版

不過後來發現, 這次造成卡關的真正元兇還是 BIOS, 4770R BIOS 的 Erp support 要關掉才能讓 wake-on-lan 功能在 shutdown 的狀態下能開機. 否則網路發動開機成功率很低. 可能是 Erp support 打開後 standby 在 LAN 的電力不足. 造成無法 100% 成功.

所以請看官同好若要設定 BRIX 網路開機, 一定要把 Erp support 先關掉.


另外就是確認你的 NIC 已經將wake on lan 功能打開, 在 Linux 下可以用 ethtool:

# ethtool enp3s0
Settings for enp3s0:
[...snip]
        Supports Wake-on: pumbg
        Wake-on: g
[...snip]

只要看到 Wake-on 設定為 g, 代表已經打開了. 若沒有打開請下:

ethtool -s enp3s0 wol g

或者 google 一下看你的 Linux 版本怎麼開比較好.


QNAP TS-109 NAS 端的設定:

為什麼會扯到 QNAP NAS 的原因主要是因為這是家中除了 router 以外會24小時開機的機器。 我的 router 很舊沒有支援 wake-on-lan 的界面, 也就是沒有發出 magic packet 的功能。 所以只能從 QNAP NAS 下手. 這台 TS-109 也很舊了. 有幾種方法可以讓它發出 magic packet.

第一種方法, 請安裝 wakelan 工具:

首先安裝  ipkg, 到 QNAP TS-109 的 Administration 介面中的 Applications >> QPKG Plugins 下安裝 Optware ipkg 的管理程式.

安裝好後記得將將它 Enable, Optware圖示會從灰色變成彩色.



接下來 ssh 進入 QNAP NAS, ssh 不會開請 google 一下. 用 admin 身份 ssh 進去之後, 下指令安裝 waklan tool:
    # ipkg install wakelan

安裝好之後打 wakelan command 應該可以看到 wakelan 能用了.  然後下:
    # wakelan -m MACADDRESS -b 192.168.1.255

MACADDRESS 是 BRIX 上的網卡的 Mac Address, Linux 下用 ifconfig, 可以看到很像: AA:BB:CC:DD:EE:FF 這樣的字串, 把冒號去掉打在 wakelan 後面就可以用.

下達如上的 wakelan 指令後應該就可以把 BRIX 從關機狀態下喚醒了.

第二種方法是用 python script 發出 magic packet, 程式的話如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 # wol.py
 #
 # This module is from ActiveState Code Recipes:
 # http://code.activestate.com/recipes/358449-wake-on-lan/
 # and patched for Python 3 with:
 # http://code.activestate.com/recipes/577609-wake-on-lan-for-python-3/
 #
 # Example:
 # import wol
 # wol.wake_on_lan('70:F3:95:15:00:B5')
 #
import socket
import struct

def wake_on_lan(macaddress):
    """ Switches on remote computers using WOL. """

    # Check macaddress format and try to compensate
    if len(macaddress) == 12:
        pass
    elif len(macaddress) == 12 + 5:
        sep = macaddress[2]
        macaddress = macaddress.replace(sep,'')
    else:
        raise ValueError('Incorrect MAC address format')


    # Pad the synchronization stream
    data = b'FFFFFFFFFFFF' + (macaddress * 20).encode()
    send_data = b''

    # Split up the hex values in pack
    for i in range(0, len(data), 2):
        send_data += struct.pack('B', int(data[i: i + 2], 16))

    # Broadcast it to the LAN
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    sock.sendto(send_data, ('255.255.255.255',40000))

import wol

wol.wake_on_lan('AABBCCDDEEFF')

以上範例來自國外網站, 我測過是可以跑的. 當然 AABBCCDDEEFF 請換成你自己的 Mac Address. 還有 QNAP 預設沒有裝 Python, 請一樣用 TS-109 NAS 的 Applications >> QPKG Plugins 介面把 Python 裝起來.

所以兩個方法來說, 都需要安裝 QNAP 的包, 不過第一種方法不用寫程式, 所以我推荐.

搞定 NAS 的 wakelan command 之後, 接下來就見仁見智了, 我一樣 google 了一下, 做了簡單的 php page, 來作為前端 UI, 方便自己按一下就下 wakelan 指令, 就不需要 ssh 進 NAS 了:

[/share/Qweb] # cat index.php

<?php
if ($_GET['wol-brix']) {
  exec("/opt/bin/wakelan -m AABBCCDDEEFF -b 192.168.1.255");
}
?>

<br><p>
<input type="button" value="Power On GigaByte BRIX" onclick="location.href='?wol-brix=true'">

要使用這個網頁請將 QNAP TS-109 的 web server 功能打開, 然後把 index.php 放到 /share/Qweb 目錄下這樣打入 NAS 的 ip 就可以看到網頁了, 按一下按鍵就可以把 BRIX 網路開機. 如何將 index.php 放到 /share/Qweb 目錄可以用 scp 或者 NAS 的介面 copy 到 Qweb 目錄下就可以了.
記得 index.php 中的 AABBCCDDEEFF 一樣改為您的 BRIX 的 NIC mac address.

開這個網頁要注意的是 QNAP TS-109 的 web server 沒有 SSL 功能, 所以安全性要有警覺. 儘量不要有太複雜的東西在網頁上, 以避免 hacking, 而且要承擔 QNAP TS-109 web server 和 php 可能的漏洞. 畢竟機器舊了已經沒有 update 了.

如果要遠端透過網際網路 access 這個網頁來達到開機, 我是在 router 上作 port forward, 把某個 port mapping 到 NAS 上的 80 port. 這樣記住自己家裡固網對外的 ip 和 port 號碼這樣就可以遠端用這個網頁把家裡的 BRIX 開機了. 然後 ssh 去遙控 BRIX 就可以開工了.

這些動作大約搞了半天時間, 主要時間花在 python 的撰寫和 debug, 但後來發現 BRIX BIOS 中的 Erp support 應該關掉才是 key point. 希望同好們不用再像我一樣卡關了.

目前快樂使用中, 人在外面的話只要有帶 Notebook 或者平板這些能夠 ssh 的工具, 用網頁把家裡的 BRIX 開機後就可以工作了, 很方便.