あっきぃ日誌

ラズピッピブログのようなオタクブログのようななにか

Raspberry Pi Advent Calendar 2025 1日目: Raspberry Pi OSにcloud-initとNetplan.ioがやってきた

今年もAdvent Calendarの時期が来ました。Raspberry Pi AC 2025の1日目です。

adventar.org

今年で11回目になりました。うっかり惰性で作りましたが、今回は多忙で無理そうなので、完走はたぶん無理ですな。

今年Raspberry Piでやったこと、Picoで作ったもの、来年やりたいことなど、お気軽にご参加ください。

Raspberry Pi OSにcloud-initとNetplan.ioがやってきた

いきなり時事ネタを拾うだけの記事なんですけど、いいネタなので。先週Raspberry Pi OS Trixieにアップデートがあり、cloud-initとNetplan.ioが含まれるようになりました。

www.raspberrypi.com

cloud-init

cloud-initは、初回起動時のOSに対して初期設定を行うためのツールです。YAMLフォーマットの設定ファイルを用意してOSに渡すことで、ユーザー設定やネットワーク設定やコマンド実行などを行うことができます。各種Linuxクラウド環境などで幅広く使用されています。個人的にはUbuntuクラウドイメージをESXiとかProxmoxとかKVMにデプロイしたときに使っています。便利。

Raspberry Pi OSでは、これまでは独自のシェルスクリプトを/boot/firstrun.shに配置して、これを実行して初回の設定を実行していましたが、これがcloud-initで置き換えらたという感じです。

cloud-initの各設定ファイルは、/boot以下に配置することで設定が可能になります。配置されるのはこの3つのファイル。設定があるのはuser-dataとnetwork-configの2つですね。

Raspberry Pi Imagerを使用しているユーザーの場合は、同じく最近リリースされたバージョン2.0.0を使用すると、カスタム設定がcloud-initの設定ファイルとして/bootに書き出されるようになります。ゼロから自分で設定を用意するよりは、Imagerで設定を作らせて、設定ファイルだけ取り出しておいたのを、別の機会に流用するのが楽ちんかもしれません。

なお、cc_raspberry_piモジュールによってcloud-initに拡張が加えられているらしく、I2CとかSPIとかの設定もできます。ウソ……めっちゃ便利ですやん!

以下は実際にImagerが出力したuser-dataファイル。パッケージの導入が必要ならpackagesに足せばいいですし、rpiのinterfacesにi2cとかspiを書けばいきなりこれらを有効にできます。強い。ただ、何故か昔からlocaleの設定は入れてくらないのが謎ではあります。notoなら最低限入ってるのになあ。なんなら言語設定に応じてフォントも入れられるようになりますし(ネットに繋がっていればなんですけど)。

#cloud-config
hostname: zuhosd
manage_etc_hosts: true
packages:
- avahi-daemon
apt:
  conf: |
    Acquire {
      Check-Date "false";
    };
timezone: Asia/Tokyo
keyboard:
  model: pc105
  layout: "jp"
enable_ssh: true
users:
- name: akkie
  groups: users,adm,dialout,audio,netdev,video,plugdev,cdrom,games,input,gpio,spi,i2c,render,sudo
  shell: /bin/bash
  lock_passwd: false
  passwd: (略)
  ssh_authorized_keys:
    - (略)
  sudo: ALL=(ALL) NOPASSWD:ALL
rpi:
  interfaces:
    serial: true

network-configはこんな感じ。宿からやってて東横インSSIDなんですが、それはさておき。

network:
  version: 2
  wifis:
    wlan0:
      dhcp4: true
      regulatory-domain: "JP"
      access-points:
        "toyoko-innXXXX":
          password: "略"
      optional: true

network-configの中身はnetplanに展開されますが、NetworkManagerに食わされるっぽいので、ファイル名もそんな感じになっていました。

$ ls /etc/netplan/
90-NM-3f029ea6-3e48-3383-8c9e-f18e2942a649.yaml

Netplan.io

Netplan.ioは、ネットワーク設定をYAMLで記述することで、OSのネットワークバックエンドに合わせて設定をレンダリングしてくれるツールです。Ubuntuユーザーであればすでに馴染み深いかと思います。

NetworkManagerに投入された設定とNetplanのYAMLが衝突しないように、いくつかパッチを作成して考慮しているようです。network-configの中身が90-NMナニナニになっていたのもそういう都合っぽいですが、詳細は追えておらず。

つまりどういうこと

独自のスクリプトから業界標準的なツールに移行したことで、豊富な設定例を探して記述することができるようになりました。カスタムも、シェルスクリプトからYAMLに変わることで、メンテナンスがしやすくなるかと思います。

ネットワーク設定も、nmcliのちょっと難しい設定がnetplan のYAMLで記述できるようになるので、結構ラクをできるようになると思っています。既存設定との衝突の部分だけ気をつけたら多分結構ラクをできるようになるはず。ただまあ、RPiで複雑なネットワークを構成することはあまりなくて、せいぜいIPの固定くらいだもんなあ、という気はしなくもないですが。