【バックヤード】遠隔からパソコンを起動!Wake on Lanに対応しました

バックヤード

 デスクトップPCとノートPCの2台から同じプログラムを編集できるように、TortoiseSVN(トータス・エス・ヴイ・エヌ)を導入しました。TortoiseSVNは、バージョン管理ツールでプログラムのソースコードを1か所で管理しネットワークにつながっていればどこからでもソースコードを取得したり、登録したりできます。

 ひとつ手間があるとすれば、デスクトップPCがバージョン管理のサーバーになっているため、ノートPCから最新のプログラムを取得するには、デスクトップPCを起動しておく必要があるということです。

 という課題がありました。リビングから3mほどの先にデスクトップPCあり、電源スイッチを入れるなんて大したことないはずなのに邪魔くさいんだよね~。

Wake on Lanでパソコンを起動

ということで、ノートPCからデスクトップPCを起動できるようにします。遠隔からパソコンを起動する方法に「Wake on Lan(ウェイク・オン・ラン)」があります。

Wake on Lanとは

「Wake on Lan」は、コンピューターやネットワークデバイスを遠隔から起動するための技術です。これは、対象のデバイスが物理的に電源がオフの状態であっても、ネットワーク経由で特定のマジックパケット(特殊なネットワークパケット)を送信することで、そのデバイスを起動できる仕組みです。

 Wake on Lanは、米AMD社が開発した技術です。AMD社のホワイトペーパーがあります。この技術は規格化されたものではなく、遠隔から対象デバイスを起動する仕組みのデファクトスタンダードという位置づけです。

 Wake on Lanのホワイトペーパーには、マジックパケットの内容について記載があります。その部分を翻訳したので載せておきます。マジックパケットの中身は、簡単ですね。Ethernetフレームにおいて、任意にマジックパケットを配置することができて、そのパケットは、「FF FF FF FF FF FF」(FFhを6個)の後にMACアドレスを16回繰り返す「112233445566」×16(MACアドレス:11-22-33-44-55-66の場合)だけです。

 マジックパケットフレームの検出
 ローカルエリアネットワーク(LAN)コントローラーがマジックパケットモードに設定されると、そのモードでは、ノード宛に送信されたすべてのフレームをスキャンし、特定のデータシーケンスを検知します。このデータシーケンスは、コントローラーにこれがマジックパケットフレームであることを示します。
 マジックパケットフレームは、LAN技術が選択された場合の基本的な要件も満たす必要があります。これには、2つのマジックパケット技術のソースアドレス、宛先アドレス(受信ステーションのIEEEアドレスまたはBROADCASTアドレスを含むMULTICASTアドレスである可能性があります)、およびCRCが含まれます。
 具体的なシーケンスは、このノードのIEEEアドレス(=MACアドレス)を16回複製したもので、途切れることなくパケット内のどこにでも配置できます。ただし、同期ストリームに先立って配置される必要があります。同期ストリームにより、スキャン状態をはるかに単純にすることができます。同期ストリームは6バイトのFFhと定義されています。デバイスは、マシンを起動するためのアドレスと一致する限り、MULTICASTフレームも受け入れます。ネットワーク上の特定のノードのIEEEアドレスが11h 22h 33h 44h 55h 66hである場合、LANコントローラーはデータシーケンスをスキャンします(Ethernetフレームを仮定した場合):
宛先 送信元 その他 FF FF FF FF FF FF 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 その他 CRC

Wake on Lan(WoL)に必要な要件と手順

 Wake on Lan(WoL)に対応するには、以下の要件や手順などが必要です。

  1. ハードウェアのサポート確認: Wake on LANを利用するには、ネットワークカードやマザーボードがこの機能をサポートしている必要があります。
  2. BIOS/UEFI設定の確認と有効化: マザーボードのBIOSまたはUEFI設定画面で、Wake on LANを有効にします。
  3. ネットワーク設定の確認:Wake on LANはローカルネットワーク内での使用が前提となります。Windows OSのネットワーク設定でWake on Lanの設定を有効にします。
  4. 送信元パソコンでWoLツールを使用: 起動させたいパソコンを識別し、Wake on LANの信号を送信するためのツールを使用します。
  5. マジックパケットの送信: 対象パソコンを識別するためにMACアドレスを使用し、対象パソコンに向けて特別な形式のネットワークパケット(マジックパケット)を送信します。
  6. 対象パソコンの応答: ネットワーク上でマジックパケットが受信されると、対象パソコンがその情報を解釈し、電源をオンに切り替えて起動します。

上記の通り、ちょっと簡単ではないですね。マザーボードの設定も必要であり、なかなか簡単にはさせないようになっています。これには理由があって、セキュリティ上のリスクを伴うからです。つまり、ローカルネットワーク上からなら誰でもWake on Lanの信号を発行ができて、どのパソコンでも起動させることができてしまいます。そのパソコンがセキュリティ的に脆弱であれば、悪意のあるハッカーから攻撃され乗っ取られる危険性があります。パソコンの電源を切ったはずなのに知らないうちに乗っ取られることになります。

Wake on Lanの設定

 Wake on Lanのことが分かったので、実際に上述の要件、手順に沿ってWake on Lanの設定をしていきます。

1.ハードウェアのサポート確認ですが、最近のデスクトップPCではたいてい対応しているので、対応している前提で具体的な設定をしていきます。万が一対応していなかったら、設定ができないという落ちになるので、設定を進めていきたいと思います。

2.BIOS/UEFI設定の確認と有効化を行います。
私のデスクトップPCはUEFI設定です。UEFIの設定画面を立ち上げるには、パソコンの電源を入れて、マザーボードのロゴ(ASROCK)が表示されたら、[DEL]キーまたは[F2]キーを連打します。「ピッ!」と音がすると入力受け付けたことがわかります。(音の本当の意味は、わかった。お前、連打しすぎや!ということですw)

 UEFI画面が表示されます。メニューの「アドバンスド」をクリックして、「ACPI設定」をクリックします。ACPIとは、Advanced Configuration and Power Interfaceの略で、電源や電力管理をOS側から高度な電源制御を可能するインターフェース規格です。ACPIではシステム全体の稼働状態を「S0」から「S5」までの6段階で定義しています。「S0」から「S5」の定義は以下の通りです。
Wake on Lanに対応しているというのは、「S5」状態からパソコンを起動できることが要件になります。

状態内容
S0通常の稼働状態
S1通電したまま動作を一時停止するスタンバイ
S2スタンバイとスリープの中間
S3メインメモリ(RAM)以外の電源を落とすスリープ
S4メモリの内容をストレージに退避して電源を切るハイバネーション
S5完全な電源断

 「PCIEデバイス電源オン」を有効にします。有効にすることでマザーボードとして、Wake on Lanが有効になります。PCIEとは、PCI Expressの略で、パソコンのパーツ類を接続する、高速でデータ転送可能なシリアルインタフェースで、グラフィックボードなどの接続に使われます。このオプションは、PCI Expressスロットへ装着したデバイスからの起動することを有効にする意味です。事実上、起動する手段として普及しているのがEthernetカードということになります。

 これでUEFIの設定は完了です。メニュー「出口」をクリックして、「設定変更内容を保存して再起動」をクリックします。
注意:この設定はマザーボードによって異なります。UEFI画面、メニュー名、設定名などが異なりますので各マザーボードの説明書を確認してください。

3.ネットワーク設定の確認です。次にWindows OS上でネットワークの設定を確認していきます。必要に応じて設定を行います。
(1)ネットワークドライバーの設定
Windowsスタートの右クリックメニュー「デバイスマネージャー」をクリックします。デバイスマネージャー画面を開きます。

 「デバイスマネージャー」画面の「ネットワークアダプター」の「Realtek PCIe GbE Family Controller」の右クリックメニューの「プロパティ」をクリックします。
注意:デバイスドライバーの種類によって異なることがあります。

 「Realtek PCIe GbE Family Controllerのプロパティ」画面が開き、プロパティ欄から「Wake on Magic Packet」をクリックして、値の欄の「Enabled」を選択して「OK」ボタンをクリックします。
注意:デバイスドライバーの種類によってプロパティの名称が変わることがあります。

(2)電源オプションの設定
 もうひとつWindowsの設定が必要です。

「コントロールパネル」の「システムとセキュリティ」をクリックします。

「システムとセキュリティ」画面の「電源オプション」内にある「電源ボタンの動作の変更」をクリックします。

「電源ボタンの定義とパスワード保護の有効化」画面において、②のシャットダウン設定を変更します。変更できるように「現在利用可能ではない設定を変更します」をクリックします。

 そうすると、シャットダウン設定が変更できるようになります。

「高速スタートアップを有効にする(推奨)」のチェックを外し、「変更の保存」ボタンをクリックします。以上でWindowsの設定は終わりです。

おまけ

 Wake on Lanの設定とは関係ありませんが、運用上の設定です。

上述の3.(1)で行った設定に加えて、「Realtek PCIe GbE Family Controllerのプロパティ」画面の「電源の管理」タブをクリックします。

「Magic Packetでのみ、コンピューターのスタンバイ状態を解除できるようにする」のチェックを付けて、「OK」ボタンをクリックします。
この設定をしないと、意図せずスタンバイ状態のPCが復帰することがあります。一人暮らしで突然PCが復帰すると気味悪いですよね。ww

4.送信元パソコンでWoLツールを使用です。「Wake on Lanとは」のところで述べたマジックパケットをノートPCからデスクトップPCに送信すれば、デスクトップPCを起動させることができます。

フリーソフトのWoLツールは多数あります。例えば、Microsoft Storeのページで「Wake on Lan」で検索すると多数のソフトが見つかりますので、お気に入りのGUI(グラフィック・ユーザー・インターフェース)があれば使ってみてください。

本ブログはDIYをモットーにしていますので、WoLツールも自作したいと思いますが、とりあえずWake on LanでデスクトップPCが起動できることを確認するだけのWoLツールを作ってみます。

Visual Studio 2022 Community版を使ってプログラムを作成します。Visual Studio 2022 Communityについては、以下の投稿を参考にしてください。

 VS2022のソリューションは、言語:C#、アプリケーション:コンソールアプリケーションで作成しました。ソリューション名:ConsoleWoLとしました。プログラムは以下です。たったの45行です。朱書きのMACアドレスを書き換えれば使えます。

using System;
using System.Net;
using System.Net.Sockets;

class Program
{
    static void Main()
    {
        string targetMacAddress = "11-22-33-44-55-66"; // 対象PCのMACアドレスを指定
        WakeOnLan(targetMacAddress);
    }

    static void WakeOnLan(string macAddress)
    {
        // MACアドレスをバイト配列に変換
        byte[] macBytes = new byte[6];
        string[] macAddressParts = macAddress.Split('-');
        for (int i = 0; i < 6; i++)
        {
            macBytes[i] = Convert.ToByte(macAddressParts[i], 16);
        }

        // マジックパケットを作成
        byte[] magicPacket = new byte[102];
        for (int i = 0; i < 6; i++)
        {
            magicPacket[i] = 0xFF; //FFhを配列に6個を追加
        }
        for (int i = 6; i < 102; i += 6)
        {
            Array.Copy(macBytes, 0, magicPacket, i, 6);//その後ろに16個のMACアドレスを追加
        }

        // Wake on Lanパケットを送信
        using (UdpClient client = new UdpClient())
        {
            client.Connect(IPAddress.Broadcast, 9); // UDPポート9にブロードキャストで接続
            client.Send(magicPacket, magicPacket.Length);
            Console.WriteLine("Wake on Lanパケットを送信しました。");
        }
    }
}

5.マジックパケットの送信6.対象パソコンの応答を確認したいと思います。プログラムをビルドして実行モジュールConsoleWoL.exeをノートPCに持っていき実行します。流石に実行できたかどうかを写真では示せないので動画にしました。

 Wake on Lanを試したときの動画をアップしましたのでご覧ください。

 どうですか、ノートPCからデスクトップPCを起動することができました。

デスクトップPCを遠隔からシャットダウンする

 Wake on LanでデスクトップPCを起動させることができましたが、使い終わったらデスクトップPCをシャットダウンして電源を切る必要があります。できなければ、結局、3m歩いてシャットダウンする手間が発生して、何も解決しません。

 遠隔からパソコンをシャットダウンするのは、Wake on Lanに比べたら簡単です。

リモートデスクトップ

 デスクトップPCに対して、リモートデスクトップのアクセスを可能にします。

「設定」の「システム」をクリックして、「リモートデスクトップ」をクリックします。

「リモートデスクトップ」を「オン」にします。これで、ノートPCからリモートデスクトップでデスクトップPCに接続することができます。

リモートデスクトップ接続

 ノートPCからデスクトップPCに対してリモートデスクトップ接続して、シャットダウンします。

  1. リモートデスクトップ接続を使用して、遠隔のコンピューターに接続します。
  2. 接続が確立されたら、タスクバーまたはスタートメニューから「スタート」をクリックし、コマンドプロンプトを検索します。
  3. コマンドプロンプトを開き、以下のコマンドを入力してリモートのコンピューターをシャットダウンします。
    shutdown /s /f /t 0
    コマンドでなくても通常のシャットダウンを実行しても電源OFFにすることができます。

まとめ

 今回は、Wake on Lanという遠隔からパソコンを起動する技術を使って、ノートPCからデスクトップPCを起動できるようにしました。これにより、ノートPCでデスクトップPCにあるデータが必要になっても、その場でデスクトップPCの電源を入れられるようになりました。
 また、遠隔からデスクトップPCをシャットダウンして電源を切ることもできました。これで離れたパソコンに対してリモートで操作できるようになりました。

タイトルとURLをコピーしました