【ROS 2】microSDカード上の設定ファイルを変更する(固定IPアドレスの設定)

microSDカード上の設定ファイル[network-config]を変更して、固定IPアドレスを設定する手順を解説します。
本手順は、初回の起動より前に行い、固定IPアドレスを設定するものです。起動後にDHCPから固定IPアドレスに変更する場合は、本手順は必要ありません。
(1) 設定ファイル「network-config」とcloud-init
【ROS 2】Raspberry Pi Imagerを使ってmicroSDカードにOSを書き込む[Ubuntu Server 24.04.3 LTS(64-bit)]では、Raspberry Pi 5のブートデバイスであるmicroSDカードにOSを書き込む手順を解説しました。その過程で、Wi-Fiを有効にして、アクセスポイントのSSIDとパスワードを入力しました。この設定はどこに保存されているのでしょうか。
Raspberry Pi Imagerを使ってmicroSDカードにOSを書き込んだとき、microSDカード上には[system-boot]という起動用のブートパーティション(第1パーティション/FAT32/512MB)と、OS本体が格納されるルートパーティション(第2パーティション/Ext4/初回起動時に最大サイズに拡張)の二つが作成されます。
前述のWi-Fiに関する設定は、ブートパーティションの最上位ディレクトにあるネットワーク関連の設定ファイル[network-config]に保存されています。ブートパーティションは、ファイルシステムがFAT32なので、そのままWindowsにマウントしてファイルへアクセスできます。図1-2は、エクスプローラーで表示したようすです。
表1-1は、network-configの内容です。Wi-Fiを有効にしたので、無線LANのインターフェース[wlan0]に対して、入力したアクセスポイントのSSIDとパスワード(ハッシュ化されている)が保存されています。また[dhcp4: true]となっていることから、IPv4でDHCPが有効であることがわかります。ちなみに、この設定ファイルは、人に読みやすくコンピューターに解析しやすく設計されたデーター構造であるYAMLという形式で記述されています。
では、この設定ファイルに記述された内容は、どのように反映されるのでしょうか。その役割を担っているのがcloud-initです。cloud-initは、クラウドコンピューティング環境において仮想マシン(Linux VM)の初期化と設定の自動化を行うオープンソースアプリケーションです。初回起動時に、ホスト名の設定・ネットワークの設定・ユーザーの作成・SSHの設定など、さまざまなプロセスを自動化できます。
Raspberry Pi 5(+ubuntu 24.04.3)でもこのしくみが採用されており、microSDカードからの初回起動時に、ネットワーク関連の設定ファイル[network-config]が読み込まれ[/etc/netplan/50-cloud-init.yaml]というファイルが自動生成されます。表1-2は、生成されたファイルの内容です。YAML形式で記述されています。
ubuntuでは、バージョン17.10以降、ネットワークの管理にnetplanが採用されており、ネットワーク関連の設定ファイルを[/etc/netplan]ディレクトリーで管理しています。2回目以降の起動では、netplanによって「/etc/netplan/50-cloud-init.yaml」が使用されます。
(2) 固定IPアドレスの設定
前述の通り、初期状態ではDHCPが有効になっているため、IPアドレスはDHCPサーバーからリースされた時点で決定します。DHCPサーバーには、できる限り同じIPアドレスを付与する仕組みがあるものの、リース期間の満了後に異なるIPアドレスが付与されることがあります。
ディスプレイやキーボードを持たないヘッドレスで運用したり、ほかの機器と通信を行う場合、ほとんどのケースで固定IPアドレスを割り当てます。本記事では、設定ファイル[network-config]に固定IPアドレスを指定して、初回起動時に反映する手順を紹介します。
固定IPアドレスの割り当て
Raspberry Pi Imagerを使ってmicroSDカードにOSを書き込んだ直後、設定ファイル[network-config]を表2-1のように編集します。インデントに気をつけて入力してください。
[dhcp4: false]でDHCPを無効化します。11行目以下を次のように追加します。キー[addresses]が割り当てる固定IPアドレス(本記事では[192.168.1.36/24])です。[IPアドレス/サブネットマスクのビット数]で表します。キー[routes]でデフォルトゲートウェイ(本記事では[192.168.1.1])を指定します。キー[nameservers]で参照するDNSのIPアドレス(本記事では[192.168.1.1])を指定します。複数のDNSを指定する場合は、複数行([- 8.8.8.8]など)記述します。
編集し終えたら、microSDカードを使って、Raspberry Pi 5を起動します。文法ミスなどがなければ、cloud-initによって正しく読み込まれて、固定IPアドレスが割り当てられます。cloud-initのログは[/var/log/cloud-init-output.log]に出力されます。固定IPアドレスが割り当てられなかった場合は、このログを確認しましょう。
表2-2は、自動生成された[/etc/netplan/50-cloud-init.yaml]です。
cloud-initの再実行
初回起動時に実行されるcloud-initですが、再実行するにはどうすればいいでしょうか。再実行は、コマンド[cloud-init clean]でcloud-initの状態を初期化した後、コマンド[reboot(または shutdown -r now)]で再起動します。いずれも管理者権限が必要です。
おすすめ
【改訂第2版】ROS 2とPythonで作って学ぶAIロボット入門
- 出版社
- 講談社
- 著者
- 出村公成・萩原良信・升谷保博・タンジェフリートゥチュアン
- 発売日
- 2025/2/14
Raspberry Pi 5プログラミング教育ロボット
Raspberry Pi 5ベースのROS 2(Humble)に対応したロボットカーです。4つの独立した駆動輪(エンコーダー付き金属製モーター)による走行、LiDARによるマッピング(SLAM)・2軸のカメラによるAI画像認識(OpenCV)などが行えます。