初めに
Wakeup On LANという、有線LANにマジックパケットを送信することで外部から電源を投入できる仕組みがあります。
これを使うと、自宅サーバーを常時稼働させる必要がなくなり大変便利です。
しかし、筆者が利用しているHomeGateWayはAterm BL900HWであり、Wakeup On LANマジックパケット送信ができません。
そこで、Wifi運用のAndroid端末にSSHして、そこからLinuxの自宅サーバーを起動することを考えます。
準備(ルータ)
- AndroidのSSHポートへポートマッピング設定を行って下さい。自宅サーバーを開設している方なら大丈夫だと思いますので説明は省きます。
準備(Android)
- 家に置いておくAndroidが必要です。多分Froyoで大丈夫。Wifiはスリープ中でも常時ONにする設定が必要です。
- SSHサーバーアプリは別途導入して下さい。筆者は(当時DroidSSHDの不具合の多さに辟易したので)QuickSSHDを購入しました。
- なお、QuickSSHDはarmでしか動きません。AST21の動作確認はadbで行いましたが、どうしたもんでしょうね。
- wolコマンドを用意します。
- まず、Android NDKを用意し、build/tools/make-standalone-toolchain.shを使ってtoolchainを設定します(このスクリプトは、コンパイラとplatform/android-/arch-をsysrootとしてコピーする原理のようです)。
-
https://sourceforge.net/p/wake-on-lan/code/HEAD/tree/ をチェックアウトし、
sh autogen.sh
、続いて./configure --host=arm-linux-androideabi
とします。 - config.hの
rpl_malloc
、rpl_realloc
、HAVE_ETHER_HOSTTON
の各行をコメントアウト。HAVE_STRUCT_ETHER_ADDR
を1、HAVE_STRUCT_ETHER_ADDR_ETHER_ADDR_OCTET
を1に設定します。 - makeすると、src/wolが生成されるので、これをAndroidに転送します。転送方法はsshでもadbでも構いません。ただし、SDカード領域に転送したアプリは実行できないので、/data/local(/tmp)配下に転送することになるでしょう。
なお、x86マシンの場合は、--host=i686-linux-android
となります。
準備(Linuxマシン)
BIOS
- 例として、A78M-E35マザーボードの場合、Power Management Setupの
EuP 2013
をdisabled、Wakeup Event SetupのWake up Event by
をBIOS、Resume By PCI-E Device
をenabledに設定します。
Linux
-
sudo ethtool -s eth0 wol g
としてwolを有効化、sudo ethtool eth0
から確認します。 - MACアドレスを確認しておきます。
使い方
- 指定ポートにSSHします。
- SSH上からwolコマンドを実行すると、当該端末の電源を投入できます。
ログ
MacBookAir -> 大学 -> 自宅のAndroidとアクセスしています。
neige:~ *******$ ssh ***
[*******@***01 ~]$ ssh root@****.yi.org -p **22 -v -2
root@****.yi.org's password:
root@android:/data/data/com.teslacoilsw.quicksshd/home # /data/local/wol 44:8a:5b:**:**:**
Waking up 44:8a:5b:**:**:**...
root@android:/data/data/com.teslacoilsw.quicksshd/home #
[*******@***01 ~]$ logout
neige:~ *******$
追伸
最初はbusyboxのether-wakeで実験していたのだけど、導入手順がかなりややこしい(そしてx86向けにコンパイルできなかった)ので別アプリにしたところとても簡単に導入できるようになった。