家にデスクトップPCがあって、外出先から家のPCにアクセスしたり、自宅のマシンパワーのあるPCで機械学習を走らせたりしたい。
そんなときに便利なのが、Raspberry Pi(ラズベリーパイ)とWake On LAN(WOL)を使ったリモートデスクトップ環境です。
この記事は、主に以下の記事を参考に作成されており、ラズパイを初めて触った私がいつでもParsecを呼び出せることを目的として作成したものの備忘録です。初心者でもなんとかなる具体的な構築手順とつまずきやすいポイントを記録しています。
システム概要
ラズパイを常時起動させて、Discordのチャットからコマンドを送ると、WOL機能を使って家のデスクトップPCを起動。その後、Parsecのようなリモートデスクトップツールでデスクトップにアクセスするという仕組みです。
必要なもの
- Raspberry Pi Zero 2 WH(Wの表記がある Wi-Fi機能付きが必要です https://www.switch-science.com/ )
- MicroSDカード(16GB以上)
- Micro USB Type-B
- デスクトップPC(Wake On LANに対応している必要があります)
- 外出用PC
Step 1: Raspberry Pi OSのセットアップ
まずは、Raspberry Pi Imagerを使ってOSをMicroSDカードに書き込みます。
Imagerのダウンロードとインストール
Raspberry Piの公式ウェブサイトから、お使いのPCのOSに合ったRaspberry Pi Imagerをダウンロードしてインストールしてください。
必要な設定
Raspberry Pi Imagerを起動し、以下の設定を行います。
- OS選択: 「Raspberry Pi OS(64-bit)」など、お使いのPiに合わせたOSを選択します。
-
歯車アイコンの設定: 設定画面を開き、以下の項目を入力・チェックします。
-
ホスト名:
pi.local
など、任意の名前を設定します。 - ユーザー名とパスワード: 任意のユーザー名とパスワードを設定します。
- Wi-Fiを設定: デスクトップPCと同じネットワークのWi-Fiを設定します。
-
ロケール設定:
ja
に設定します。 - SSHを有効化: 「パスワード認証を使用する」にチェックを入れます。
-
ホスト名:
- SDカード選択: MicroSDカードリーダーをPCに挿し、ImagerでMicroSDカードを選択します。
設定後、「書き込む」をクリックすると、OSの書き込みが始まります。完了したらMicroSDカードをラズパイに挿入します。
参考記事
Step 2: SSH接続の確認
ラズパイにMicroSDカードを挿入し、Micro USB Type-BケーブルをRaspberry Piに接続し、反対側を電源に接続します。PCのコマンドプロンプトやターミナルから、ラズパイにSSHで接続できるか確認しましょう。
ssh [設定したユーザー名]@[設定したホスト名].local
例:ssh [email protected]
初めて接続する場合は「フィンガープリントを保存しますか?」と聞かれるので、yes
と入力します。パスワード認証が成功すれば接続完了です。
つまずきやすい点:
-
pi.local
で接続できない場合は、ラズパイのIPアドレスを直接指定してみましょう。IPアドレスはルーターの管理画面や、OSのネットワーク設定から確認できます。ssh [ユーザー名]@[ラズパイのIPアドレス]
参考記事
Step 3: ラズパイのIPアドレス固定化
ラズパイのIPアドレスが変わると、Discordボットがうまく動かない場合があります。これを避けるため、IPアドレスを固定化しましょう。
設定手順
- SSHでラズパイに接続後、以下のコマンドで設定ファイルを編集します。
sudo nano /etc/dhcpcd.conf
- ファイルの一番下に、以下のテンプレートをコピー&ペーストします。
-
Wi-Fi接続の場合:
interface wlan0 static ip_address=【任意の固定IP】/24 static routers=【ルーターのIP】 static domain_name_servers=8.8.8.8 8.8.4.4
-
有線接続(Ethernet)の場合:
interface eth0 static ip_address=【任意の固定IP】/24 static routers=【ルーターのIP】 static domain_name_servers=8.8.8.8 8.8.4.4
-
Wi-Fi接続の場合:
-
【任意の固定IP】
と【ルーターのIP】
を、あなたの環境に合わせて変更します。-
static ip_address
の決め方:
現在のIPアドレスを確認し(hostname -I
)、ルーターのDHCP割り当て範囲外のIPを選びましょう。例えば、DHCP範囲が192.168.0.100
〜192.168.0.199
なら、192.168.0.210
のように、範囲外のIPを指定します。 -
static routers
の決め方:
これはルーターのIPアドレスです。ip route | grep default
コマンドで確認できます。
-
- 編集が完了したら、
Ctrl + O
で保存し、Enter
で確定、Ctrl + X
で終了します。 - 設定を反映させるため、ラズパイを再起動します。
- 再起動後、
hostname -I
を実行し、設定した固定IPアドレスになっていることを確認します。
つまずきやすい点:
- IPアドレスの重複: 既に他の機器が使用しているIPアドレスを指定してしまうと、ネットワーク全体に問題が発生する可能性があります。DHCP範囲外のIPアドレスを慎重に選びましょう。
参考記事
Step 4: Discord Botの作成
Discordの開発者ポータルで、PCを起動させるためのDiscord Botを作成します。
- Discord Developers Portalにアクセスし、ログインします。
- 「New Application」をクリックし、任意の名前を付けてアプリケーションを作成します。
- 左のメニューから「Bot」を選択し、「Add Bot」をクリックします。
- Botのページで「TOKEN」をコピーして保存しておきます。これは後でPythonスクリプトに記述します。
- Botの権限設定として、「Privileged Gateway Intents」を全てオンにします。
- 左のメニューの「OAuth2」から「URL Generator」を選択し、「scopes」で
bot
を、「bot permissions」でSend Messages
にチェックを入れます。 - 生成されたURLをコピーし、ブラウザでアクセスすると、Botをサーバーに追加できます。
参考記事
Step 5: WindowsでWake on LAN (WOL) を有効にするための設定と確認
WOLが機能するためには、Windows側でもしっかりと設定されている必要があります。
以下の手順で設定を行い、ネットワークアダプターや電源管理が正しく構成されているか確認します。
① BIOS/UEFIの設定
- Windowsを再起動してBIOS/UEFIに入ります(通常は
DEL
キーやF2
キー連打)。 - 以下のような項目を探し、有効化(Enable)します:
Wake on LAN
Power on by PCI-E
-
Resume by LAN
など
- 設定を保存して再起動します。
② デバイスマネージャーでの設定
- Windowsキーを押して「デバイスマネージャー」と検索して開きます。
- 「ネットワークアダプター」を展開し、使用中のLANアダプター(例:Intel Ethernet)を右クリック → 「プロパティ」を選択。
- 「詳細設定」タブで以下の項目を確認・設定します:
プロパティ | 値 |
---|---|
Wake on Magic Packet | 有効 |
Shutdown Wake-On-LAN | 有効 |
Wake on Pattern Match | 有効 |
- 「電源の管理」タブで以下にチェックが入っていることを確認:
- ✅ このデバイスで、コンピューターのスタンバイ状態を解除できるようにする
- ✅ Magic Packet でのみ、コンピューターのスタンバイ状態を解除できるようにする
③ Windowsの電源オプション設定(省電力の制御)
- 「コントロールパネル」 → 「ハードウェアとサウンド」 → 「電源オプション」
- 現在選択中のプランの「プラン設定の変更」 → 「詳細な電源設定の変更」
- 「スリープ」カテゴリ内の以下を確認:
- 「Wake on LAN」が使えるよう、省電力モードがPCのNICを完全に停止しないように調整。
④ IPアドレスの固定
Wake on LAN を安定して使用するには、WindowsのPCに固定IPアドレスを設定するのが望ましいです。
手順(IPv4の固定)
- 「設定」→「ネットワークとインターネット」→「アダプターのオプションを変更する」
- 使用中のアダプター(有線接続なら「イーサネット」)を右クリック →「プロパティ」
- 「インターネット プロトコル バージョン 4 (TCP/IPv4)」を選択して「プロパティ」
- 以下のように「次のIPアドレスを使う」を選び、固定IPを設定:
項目 | 入力例 |
---|---|
IP アドレス | 192.168.0.100 |
サブネット マスク | 255.255.255.0 |
デフォルト ゲートウェイ | 192.168.0.1 |
優先DNSサーバー | 8.8.8.8 |
代替DNSサーバー | 8.8.4.4 |
💡 補足:ルーターの設定に応じて、IPアドレス(例:192.168.1.xなど)は変更してください。ラズパイのIPアドレスと重複させないでください。
⑤ Windowsファイアウォールの設定
WOLの通信を妨げないよう、以下のようにファイアウォール設定を確認・有効化します。
手順:ファイアウォールでICMPを許可する
- スタートメニューで「セキュリティが強化された Windows Defender ファイアウォール」を検索して起動
- 左メニュー「受信の規則」をクリック
- リストの中から「ファイルとプリンターの共有(エコー要求 – ICMPv4 受信)」を探す
- 該当項目を右クリック →「有効にする」を選択
✅ これにより、他のデバイスからの Ping(ICMP) を受け付けるようになり、ネットワーク内での確認や WOL の通信が通りやすくなります。
⑥ MACアドレスの確認方法
WOLパケットを送信するためには、対象PCのMACアドレスが必要です。
以下の手順で確認:
「イーサネット アダプター」セクション内の 物理アドレス がMACアドレスです。
例:
物理アドレス: XX-XX-XX-XX-XX-XX
-ではなく、:で区切る形式にして XX:XX:XX:XX:XX:XX のように使います。
参考記事
Step 6: ラズパイにPythonスクリプトを記述
SSHでラズパイに接続し、WOLパケットを送信するPythonスクリプトを作成します。
作業ディレクトリの作成と移動
仮想環境の作成と有効化
python3 -m venv venv
source venv/bin/activate
必要なライブラリのインストール
pip install discord.py wakeonlan
Pythonスクリプトの作成
nano bot.py
コマンドでファイルを作成し、以下のコードを記述します。
import discord
from wakeonlan import send_magic_packet
import subprocess
import platform
TOKEN = "あなたのDiscordボットのトークン"
TARGET_IP = "192.168.X.X"
TARGET_MAC = "XX:XX:XX:XX:XX:XX"
def is_pc_online(ip_address):
param = "-n" if platform.system().lower() == "windows" else "-c"
command = ["ping", param, "1", ip_address]
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return result.returncode == 0
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'ログイン成功: {client.user}')
@client.event
async def on_message(message):
if message.author == client.user:
return
try:
if message.content.startswith("!wol"):
await message.channel.send("🔍 対象PCの状態を確認中…")
if is_pc_online(TARGET_IP):
await message.channel.send(f"⚡ 対象PC({TARGET_IP})はすでに起動しています。")
else:
await message.channel.send("💤 PCはオフラインのようです。WOLパケットを送信します…")
send_magic_packet(TARGET_MAC)
await message.channel.send("✅ WOLパケットを送信しました!")
except Exception as e:
error_msg = f"❌ エラーが発生しました: {e}"
print(error_msg)
await message.channel.send(error_msg)
client.run(TOKEN)
コード内のTOKEN
、TARGET_IP
、TARGET_MAC
をあなたの環境に合わせて修正します。
Discordに命令する!wolの設定は以下の部分
if message.content.startswith("!wol"):
Step 7: systemdでPythonスクリプトを自動起動
ラズパイを再起動しても自動でボットが動くように、systemdサービスとして登録します。
- サービスファイルを作成・編集します。
sudo nano /etc/systemd/system/discordbot.service
- 以下の内容を記述し、パスをあなたの環境に合わせて修正します。
[Unit] Description=Discord Bot Service After=network.target [Service] Type=simple User=pi WorkingDirectory=/home/pi/Program ExecStart=/home/pi/Program/venv/bin/python /home/pi/Program/bot.py Restart=on-failure [Install] WantedBy=multi-user.target
-
User=pi
: ラズパイのユーザー名 -
WorkingDirectory=/home/pi/Program
: Pythonスクリプトがあるディレクトリ -
ExecStart
: 仮想環境のPython実行ファイルのパスとスクリプトのパス
-
- systemdにサービスを認識させます。
sudo systemctl daemon-reload
- サービスを有効化し、起動します。
sudo systemctl enable discordbot.service sudo systemctl start discordbot.service
- サービスの起動状態を確認します。
sudo systemctl status discordbot.service
- 最後に
sudo reboot
でラズパイを再起動し、Discordボットが自動で動くか確認しましょう。
Step 8: Discordの利用方法(Wake on LAN 実行)
Windowsをシャットダウンした後、Discordのチャットに !wol
と送信すると、Windows PCが起動します。
✅ 起動しない場合の確認事項
- 🔎 Discord Bot のログやWiresharkを使って、Wake on LAN パケットが正しく送信されているか確認する
- ⚙️ Windows側のWake on LAN設定を再確認
(※ 筆者はここで 2時間つまずいたので要注意!)
Step 9: Parsecのダウンロードとリモート利用
Parsec を使えば、遠隔地から自宅のWindows PCを高速・低遅延で操作できます。
✅ 手順
-
以下のURLからダウンロード:
https://parsec.app/downloads -
リモート接続元と接続先、両方のPCにインストール
-
インストール時の注意点:
- インストール時に「このユーザーのみにインストール」を選んだ場合、Windowsに一度ログインしていないと Parsec が起動しない
- Wake on LAN後すぐにリモート接続するには、「すべてのユーザーにインストール」を選択することを推奨
-
セキュリティ対策:
- Parsecアカウントには 2要素認証(2FA) を強く推奨
🔚 まとめ
初心者が取り組むにはややハードルが高い部分もありましたが、Raspberry Pi(ラズパイ)を初めて触るきっかけとしては非常に良い経験になりました。
また、今回の取り組みを通じて、以下のようなメリットを感じました:
- 💻 自宅のハイスペックPCを遠隔地から操作できる便利さ
- 🧠 Raspberry Piを通じてLinuxの基本操作やハードウェアとの連携を学べた
- 🌐 インターネットやネットワーク、Wake on LAN などの仕組みを実践的に理解できた
- 🔒 WOL(Wake on LAN)をDiscord経由で実行することで、ポート開放の必要がなく、セキュリティリスクを低減できた点も非常に大きい
特に、自宅に高性能PCを持っている方にとっては、ラズパイを使ったリモート起動+操作の構成は非常におすすめです。
単なる趣味にとどまらず、ネットワークやセキュリティ、プログラミングの学習にもつながるので、ぜひチャレンジしてみてください!
最後にこの方法を開拓してくださったSP1CAさんに感謝
Views: 0