Raspberry Pi 5をモニターなしでセットアップする。Windows PCだけでOS書き込みからSSH接続まで

モニターもmicro HDMIケーブルもなしで、Windows PCだけでRaspberry Pi 5を初期設定します。Raspberry Pi ImagerのCLIとfirstrun.shでWi-FiとSSHを仕込み、SDカード挿入から約3分でSSH接続できるまでの全手順を実測値つきで解説します。

Raspberry Pi 5をモニターなしでセットアップする。Windows PCだけでOS書き込みからSSH接続まで

こんにちは!

Qualitegプロダクト開発部です!

本稿はRaspberry Pi(ラズベリーパイ、通称ラズパイ)をインターネット越しにコントロール方法についてシリーズでお伝えいたします。

第1回の今回は、ラズパイの入手から初期セットアップ手順に関する内容です。

Windows 11のPCだけでOSの書き込みからSSH接続までを完了させた手順を、実測値つきでご紹介します。SDカードを挿して電源を入れてから、SSHでログインできるまでは約3分でした。

用意するもの

  • Raspberry Pi 5本体・・・本稿では4GBモデルを使います。
  • microSDカード・・・今回は64GB。初回起動時に全容量まで自動拡張されます
  • Rasberry Pi5用のヒートシンク・・・熱対策用
  • USBカードリーダー・・・SDカードにラズパイイメージを書き込みます
  • Windows 11のPC
  • USB-C電源(Raspberry Pi 5は5V/5A給電が推奨で、公式のRaspberry Pi 27W USB-C Power Supplyなどが該当します。5V/3A級の充電器でも構成によっては起動できますが、電力不足による制限や不安定動作が起きる可能性があります)

実機のセットアップ

組み立て

では、さっそくラズパイを組み立てていきましょう!

これがラズパイです。

Raspberry Pi 5本体(4GBモデル)

まず、熱対策としてヒートシンクをつけていきます。

ヒートシンクをつけるまえに、CPUチップなど発熱するパーツに付属のシリコンゴムっぽい素材を貼り付けていきます。これはサーマルパッド(熱伝導パッド)というやつですね。

サーマルパッドを発熱パーツにはっていきます

はい、すっかりサーマルパッドをはりつけましたので、次にヒートシンク本体を取り付けましょう。

絶縁プラスチックでできたネジでこんなふうに裏側からヒートシンクをとめてできあがり。

ヒートシンク本体がとりつけられました。

ファン用電源コネクタがラズパイ基盤上部にあるので、そこにヒートシンク側から出た電源ケーブル差し込みます。

ちなみに、SDカードはまだ挿しません。何もはいっていないので挿しても何もできません。

さて、ここまで数分で終わると思います。

次に、ソフトウェアをやっていきましょう。

モニターなしでラズパイをセットアップしていく

さっそくソフトウェアをセットアップしていきましょう。
今回はCLIのみでセットアップしていきます。つまりヘッドレスセットアップですね。

動作確認した環境は、

・書き込みソフト:Raspberry Pi Imager 2.0.8
・書き込んだOS:Raspberry Pi OS 64-bit(Debian 13 trixieベース、カーネル6.18)
・作業PC:Windows 11 Proです。

手順1: 書き込み先の物理ディスク番号を確認する

まずラズパイに差し込むSDカードを作る作業からです。

そのためには、専用の書き込みソフト「Raspberry Pi Imager 2.0.8」をつかいます。

SDカードへの書き込みは物理ディスク単位で行うため、最初にディスク番号を確認します。

Raspberry Pi Imager 2.0.8には、内蔵ドライブなど書き込み対象外のデバイスへの書き込みを拒否する安全機構がありますが、それでも、別のUSBストレージを取り違えればデータを消してしまうため、ディスク番号・容量・BusTypeの確認は必ず行ってください。

SDカードをカードリーダーでPCにつなぎ、PowerShellで次を実行します。

Get-Disk
Number FriendlyName           BusType SizeGB
------ ------------           ------- ------
     0 CT4000P3PSSD8          NVMe      3726
     1 Generic- SD/MMC/MS PRO USB       59.5

今回の環境では、内蔵SSDがディスク0、USBカードリーダー経由のSDカードがディスク1と表示されました。容量(59.5GB)とBusTypeがUSBであることからSDカードだと判断できますね。

以降の手順では書き込み先を \\.\PhysicalDrive1 と指定します。ディスク番号はお使いの環境で必ず読み替えてください。

手順2: Raspberry Pi ImagerとOSイメージを用意する

Raspberry Pi Imagerはwingetで入ります。

winget install --id RaspberryPiFoundation.RaspberryPiImager --silent --accept-package-agreements --accept-source-agreements

インストール先は C:\Program Files\Raspberry Pi Ltd\Imager\ です。GUIで使うのと同じ実行ファイルがCLIモードを持っていて、スクリプト用のラッパー rpi-imager-cli.cmd も同梱されています。

OSイメージは公式のダウンロードサイトから取得します。
raspios_arm64_latest というURLは常に最新の64-bit版(デスクトップあり)へリダイレクトされるので、覚えておくと便利です。

curl.exe -L --fail -o C:\qualiteg_examples\raspi\raspios.img.xz https://downloads.raspberrypi.com/raspios_arm64_latest

サイズは約1.3GBでした。xz圧縮のまま書き込みに使えるので、自分で展開する必要はありません。

手順3: 初回起動スクリプトfirstrun.shを作る

ここがヘッドレスセットアップの心臓部です。

Raspberry Pi OSに標準で入っているヘルパー imager_custom と userconf を呼び出して、ホスト名、SSH、ユーザー、Wi-Fi、キーボード配列、タイムゾーンをまとめて設定します。ファイル名は firstrun.sh とし、置き場所はどこでも構いません(次の手順で書き込み時にパスを渡します)。

#!/bin/bash
# set +e は途中のコマンドが失敗しても最後の後始末まで進めるための指定。
# 設定が反映されないときは、各コマンドの成否を個別に確認すること
set +e

/usr/lib/raspberrypi-sys-mods/imager_custom set_hostname raspberrypi
/usr/lib/raspberrypi-sys-mods/imager_custom enable_ssh
/usr/lib/userconf-pi/userconf 'pi' '$6$…(openssl passwd -6 で生成したハッシュ)'
/usr/lib/raspberrypi-sys-mods/imager_custom set_wlan 'your-ssid' 'your-wifi-password' 'JP'
/usr/lib/raspberrypi-sys-mods/imager_custom set_keymap 'jp'
/usr/lib/raspberrypi-sys-mods/imager_custom set_timezone 'Asia/Tokyo'

rm -f /boot/firstrun.sh /boot/firmware/firstrun.sh
sed -i 's| systemd.run.*||g' /boot/cmdline.txt /boot/firmware/cmdline.txt 2>/dev/null
exit 0

SSIDとWi-Fiパスワード(上記スクリプトの'your-ssid' 'your-wifi-password'の部分)はご自身のものに置き換えてください。

ーザーのパスワードは平文ではなくSHA-512ハッシュで渡します。ハッシュはGit Bashなどで次のように作れます。

openssl passwd -6 '設定したいパスワード'

末尾の2行は、スクリプトが自分自身を削除して通常起動に戻すための後始末です。Imagerが起動設定(cmdline.txt)に仕込むエントリを外しています。

ひとつだけ重要な注意があります。

このファイルの改行コードは必ずLFにしてください。

Windowsのエディタで作るとCRLFになりがちで、CRLFのままだと初回起動時にスクリプトが失敗します。SSHは有効にならず、Wi-Fiにもつながらず、モニターがないので失敗の様子も見えないという、なかなかつらい状態になります。

セキュリティ上の注意もひとつ。firstrun.sh にはWi-Fiパスワードが平文で入ります。Gitへのコミットや共有フォルダへの配置は避け、Windows側に残った作業用ファイルも不要になったら削除してください。

手順4: CLIでSDカードに書き込む

物理ディスクへの書き込みには管理者権限が必要なので、PowerShellから昇格つきで実行します。UACのダイアログが出たら許可してください。

$imgr = 'C:\Program Files\Raspberry Pi Ltd\Imager\rpi-imager.exe'
$opts = @('--cli', '--debug', '--disable-eject',
          '--first-run-script', 'C:\qualiteg_examples\raspi\firstrun.sh',
          '--log-file',         'C:\qualiteg_examples\raspi\flash-log.txt',
          'C:\qualiteg_examples\raspi\raspios.img.xz',
          '\\.\PhysicalDrive1')
Start-Process -FilePath $imgr -ArgumentList $opts -Verb RunAs -Wait

使っているオプションの意味です。

オプション役割
--cliGUIを起動せずコマンドラインモードで動かす
--first-run-script初回起動スクリプト(firstrun.sh)をSDカードに組み込む
--log-file進捗と結果をログファイルに書き出す
--debugログを詳細にする。書き込み速度の自動調整の様子も記録される
--disable-eject書き込み完了後にSDカードを自動排出しない。書き込み結果を確認したい場合に付ける

書き込み後の読み戻し検証(ベリファイ)はデフォルトで有効です。実測では、1.3GBのxzイメージの展開に53秒、書き込みと検証を合わせて5分ほどで完了しました。書き込みの遅いSDカードだとログに書き込みレイテンシの警告が出ますが、Imagerが自動でバッファ量を調整して続行するので、そのまま待てば大丈夫です。

進捗表示について補足します。今回のように Start-Process -Verb RunAs で昇格して起動した構成では、元のPowerShell側では進捗を確認できませんでした。そのため --log-file を指定し、ログファイルで進捗と結果を確認しています。ログの最後に succeeded と出ていれば成功です。

手順5: 電源を入れて3分待ち、SSHで接続する

書き込みが終わったSDカードをラズパイ5に挿しましょう。

SDスロットにさっきイメージを書き込んだmicro SDカードを挿す

そして、USB-C電源をつなぐだけで起動します。

USB Cの電源端子に電源アダプタをつなぎ、電源供給すればラズパイに電源がはいる。

Raspberry Pi 5には電源ボタンもありますが、通常の初回起動ではボタン操作は不要です。初回はファイルシステムの自動拡張、firstrun.sh の実行、再起動が順に走るので、2〜3分待ちます。基板の緑のLEDが点滅していれば起動処理中です。

待ったら、WindowsのターミナルからSSHで接続します。

ssh pi@raspberrypi.local

raspberrypi.local という名前はmDNSという仕組みで解決されます。Windows 11は標準で対応しているので、追加のソフトは要りません。今回の実測では、SDカードを挿して電源を入れてから約3分でSSHポートが開き、初期設定したユーザーでログインできました。

ログイン後の状態も確認しました。uname -a、vcgencmd measure_temp、df -h の出力の抜粋です。

Linux raspberrypi 6.18.34+rpt-rpi-2712 #1 SMP PREEMPT Debian 1:6.18.34-1+rpt1 (2026-06-09) aarch64 GNU/Linux
temp=34.0'C
/dev/mmcblk0p2   58G  6.6G   49G  12% /

64GBカードの全域がルートファイルシステムに拡張済みで、CPU温度は34.0度、Wi-Fi経由でIPv4アドレスも取得できていました。

ここまでくれば、あとは普通のLinuxマシンとして使えます。

ハマりどころと回避策

今回の作業で実際に踏んだ罠を表にまとめます。

症状原因回避策
昇格して実行すると、元のPowerShellに進捗が表示されないことがある今回の Start-Process -Verb RunAs での昇格起動では、元のPowerShell側に進捗が表示されなかった(実測)--log-file でログファイルに書かせて、そちらで進捗と結果を確認する
書き込みがアクセス拒否で失敗する物理ディスクへの書き込みには管理者権限が必要Start-Process -Verb RunAs で昇格して実行する
初回起動してもWi-Fiにつながらず、SSHもできないfirstrun.sh の改行コードがCRLFになっていてスクリプトが実行に失敗しているLFで保存し直し、書き込みからやり直す
raspberrypi.local が見つからない、またはIPv6アドレスが返ってくるmDNSの名前解決がIPv6を優先することがある通常はそのまま接続できる。接続できない場合はルーターの管理画面でIPv4アドレスを確認して直接指定する
plinkでスクリプトから自動接続すると初回に固まるホストキー確認のプロンプトが標準入力のパイプからの応答を受け付けない-batch と -hostkey "SHA256:..." でフィンガープリントを明示指定してプロンプト自体を出させない

最後のplinkの罠は、SSH接続までスクリプトで自動化したい人向けの補足です。手でsshコマンドを打つ分には遭遇しません。

まとめ

モニターなしのRaspberry Pi 5セットアップは、次の5点を押さえれば安全に完走できます。

  • 書き込み前に Get-Disk で物理ディスク番号を確認する(最重要)
  • OSイメージは raspios_arm64_latest から取得し、xzのまま書き込む
  • firstrun.sh にWi-Fi、SSH、ユーザー設定を仕込む。改行コードはLF
  • 書き込みは管理者権限で実行し、結果は --log-file のログで確認する
  • 初回起動は3分待ってから ssh pi@raspberrypi.local

ログインできたら、次の一手として最初にパスワードの変更とパッケージ更新をおすすめします。

passwd
sudo apt update && sudo apt full-upgrade -y

デスクトップ画面を使いたくなったら、sudo raspi-config でVNCを有効にすると、Windowsからリモートデスクトップのように操作できます。

このあたりは別の記事で紹介する予定です。

それでは、また次回お楽しみに!

参考リンク

Read more

LINE Botをローカルで開発する。WebhookのURLが毎回変わる問題を固定URLで解決する

LINE Botをローカルで開発する。WebhookのURLが毎回変わる問題を固定URLで解決する

こんにちは! LINE Botを作ろうとして最初にぶつかる壁は、コードではなくWebhookです。 LINEのMessaging APIは、ユーザーがBotに送ったメッセージを、LINEのサーバーからこちらのサーバーへHTTPSのPOSTで通知してきます。 この受け口(Webhook URL)にはインターネットから届くHTTPSのURLしか指定できず、開発中の http://localhost:5000 をそのまま書くことはできません。 トンネルツールで一時URLを発行して回避する方法が定番ですが、今度は別の問題が待っています。トンネルの方式によっては、起動のたびにランダムなURLが発行されます。その場合、開発を再開するたびにLINE Developersコンソールを開いてWebhook URLを書き換えることになります。コードを直すたび、翌日再開するたび、まずURLの貼り直しから。これが地味に堪えます。 結論から言うと、 ローカルPCの開発サーバーに「変わらない公開URL」を1本付けてしまえば、Webhook URLの設定は最初の1回だけで終わります。 この記事では、L

By Qualiteg プロダクト開発部
MCPサーバーの作り方 — 自作MCPサーバーをWeb版のChatGPT・Claudeから使えるようにする(後編)

MCPサーバーの作り方 — 自作MCPサーバーをWeb版のChatGPT・Claudeから使えるようにする(後編)

自作MCPサーバーをWeb版のChatGPT・Claudeから使えるようにする手順を、実際に接続した画面つきで解説します。localhostのサーバーに公開URLとOAuth認証を付け、コードを1行も変えずにブラウザのAIから売上データベースへ日本語で聞けるようにします。

By Qualiteg プロダクト開発部