🍓

Raspberry PiにUbuntu Server 24.04 LTSをヘッドレスインストール

2024/05/19に公開

Ubuntu Server 24.04 LTSがリリースされたので、Ubuntu Serverで運用している手元のRaspberry Pi 3Raspberry Pi 4に新規にインストールした。この記事は、作業時に調べたことをまとめたものである。

インストールの際のターゲットと手段は下記のとおり。

  • Ubuntuのターゲットアーキテクチャはarm64。対象となる主なRaspberry Piは下記
  • プリインストールイメージを用いてインストールする。初回起動時にcloud-initによる初期設定が行われるので、その設定内容を必要に応じて事前に変更する
    • インストール時には、ディスプレイとキーボードは不要で(ヘッドレス)、ネットワーク接続があればよい
    • 手順はコマンド実行とファイル編集のみからなる

最初はRaspberry Pi Imager(Raspberry Pi公式のイメージ書き込みツール)でのインストールを試していたが、調べているうちにコマンド実行とファイル編集で済ませられることを知ったので、記事では後者を主とした。Raspberry Pi Imagerを用いたインストールについては補足にまとめた。

用意するもの

  • Raspberry Pi本体
  • Raspberry Pi本体に対応する電源とケーブル
  • microSDカード 1枚
    • インストール完了までなら、4GB以上の容量があればよい
    • 以後そのまま運用に使うなら、運用に応じた容量のもの
  • ネットワーク接続手段 (イーサネット接続またはWi-Fi接続)
  • プリインストールイメージ書き込み用のPC

手順

大まかな作業順序は下記のとおり。

  1. プリインストールイメージをダウンロードし、microSDカードへと書き込む
  2. Raspberry Pi初回起動時の初期設定内容がmicroSDカード内に書かれているので、それを必要に応じて変更する
  3. そのmicroSDカードをRaspberry Piのスロットに挿入し、ネットワークに接続した状態で初回起動を行い、初期設定を行わせる

以降、ネットワーク越しにRaspberry Piを使用できる。SSHを使ってログインし、必要に応じて追加のセットアップなどを行えばよい。

初回起動時の初期設定は、cloud-initによって実施される。cloud-initは初期設定のためのツールなので、ネットワーク設定などの必須のもののみをcloud-initに行わせ、それ以外のものは以後に別途行うほうが扱いやすい。

プリインストールイメージのmicroSDカードへの書き込み

Ubuntu Releases24.04 (Noble Numbat)のページ内のPreinstalled server imageのRaspberry Pi Generic (64-bit ARM) preinstalled server imageをダウンロードして、任意の手段でmicroSDカードへと書き込む。

Unix環境で行うなら、例えば下記のとおり。

$ xzcat < ubuntu-24.04-preinstalled-server-arm64+raspi.img.xz | sudo dd of=/dev/sdb bs=8k status=progress
...
439759+0 records in
439759+0 records out
3602505728 bytes (3.6 GB, 3.4 GiB) copied, 1059.77 s, 3.4 MB/s

書き込み完了後のmicroSDカードは、MBR(Master Boot Record)形式で下記のパーティションが作成された状態になる。

Partition No. Size Partition ID: Type Bootable? Filesystem Label
Primary 1 512.0 MiB 0x0c: W95 FAT32 (LBA) yes FAT32 system-boot
Primary 2 2.9 GiB 0x83: Linux no Ext4 writable

第1パーティションのファイルシステムの最上位ディレクトリの下記のファイルに、初回起動時にcloud-initによって行われる初期設定内容が書かれている。

  • network-config: ネットワーク設定
  • user-data: ネットワーク以外の設定

ネットワーク設定の変更

前述の network-config というファイルは、初回起動時にNetplan(Ubuntu標準のネットワーク設定ツール)に渡されるYAML形式の設定ファイルである。このファイルの内容は、初回起動時に cloud-init によって解釈され、/etc/netplan/50-cloud-init.yaml に保存される。

何も編集していない場合は、下記のような内容になっている(コメントは省略している)。

network-config
network:
  version: 2

  ethernets:
    eth0:
      dhcp4: true
      optional: true
  • イーサネットインターフェイス eth0 を設定する
    • IPv4 DHCPにてIPアドレスなどを取得する (dhcp4: true による)
    • 起動時に設定を試みるが、失敗したらスキップする (optional: true による)

このファイルを編集すれば、ネットワーク設定を変更できる。以降、いくつか変更例を示す。記述方法の詳細は、YAML configuration - Netplan Documentationを参照のこと。

イーサネットインターフェイスに固定IPアドレスを設定

network-config
network:
  version: 2

  ethernets:
    eth0:
      addresses: [192.168.0.10/24]
      routes:
      - to: default
        via: 192.168.0.1
      nameservers:
        addresses: [192.168.0.1]
      optional: true

イーサネットインターフェイス eth0 を下記のように設定する。

  • IPアドレスは 192.168.0.10/24
  • デフォルトルートは 192.168.0.1
  • DNSサーバは 192.168.0.1
  • 起動時に設定を試みるが、失敗したらスキップする

参照:

Wi-Fiインターフェイスを設定

network-config
network:
  version: 2

#  ethernets:
#    eth0:
#      dhcp4: true
#      optional: true

  wifis:
    wlan0:
      dhcp4: true
      optional: true
      access-points:
        "SSID1":
          password: "PASSWORD1"
        "SSID2":
          password: "PASSWORD2"
          hidden: true
  • イーサネットインターフェイスは設定しない (行頭に # でコメントアウトになる)
  • Wi-Fiインターフェイス wlan0 を設定する
    • IPv4 DHCPにてIPアドレスなどを取得する
    • SSIDその1は SSID1、パスワードは PASSWORD1
    • SSIDその2は SSID2、パスワードは PASSWORD2。ステルスSSIDである (hidden: true による)
    • 起動時に設定を試みるが、失敗したらスキップする

参照:

ネットワーク以外の設定の変更

第1パーティションのFAT32ファイルシステムの最上位ディレクトリの user-data というファイルは、初回起動時にcloud-initが行う各種の初期化操作を制御するYAML形式のファイルである。何も編集していない場合は、下記のような内容になっている(関連しないコメントは省略している)。

user-data
#cloud-config

# On first boot, set the (default) ubuntu user's password to "ubuntu" and
# expire user passwords
chpasswd:
  expire: true
  users:
  - name: ubuntu
    password: ubuntu
    type: text

# Controls password authentication with the SSH daemon; the default here
# prevents logging into SSH with a password. Changing this is a security risk
# and you should at the very least ensure a different default password is
# specified above
ssh_pwauth: false
  • chpasswd
    • ユーザー名 ubuntu、パスワード ubuntu というユーザーを作成する
    • 全ユーザーに対して初回ログイン時にパスワード変更を強制する (expire: true による)
  • ssh_pwauth
    • SSHサーバーのパスワード認証を無効化する (この設定は初回起動時に /etc/ssh/sshd_config.d/50-cloud-init.conf に保存される)

user-data には、ネットワークインターフェイスに対する設定以外の様々な初期設定内容を記述できる。以降、いくつか例を示す。必要なものを選び、内容を適宜調整し、このファイルに追記すればよい。記述方法の詳細はModule reference - cloud-init documentationを参照のこと。

なお、編集後の user-data が文法として問題ないかチェックするには、cloud-initコマンドを用いて下記のようにするとよい。

$ cloud-init schema --config-file ./user-data
Valid schema ./user-data

ホスト名を設定

ホスト名を ubuntu にする。

hostname: ubuntu

参照: Set Hostname

任意のユーザーを作成

ユーザー ubuntu ではなく、任意の名称のユーザーを作成し、所属グループなどを設定する。あらかじめ書かれていた chpasswd: ... を無効にし、代わりに users: ... を使用する。

#chpasswd:
#  expire: true
#  ...

users:
- name: myuser
  primary_group: mygroup
  groups: users, adm
  sudo: ["ALL=(ALL) NOPASSWD:ALL"]
  shell: /bin/bash
  ssh_import_id:
    - gh:my_github_username
  ssh_authorized_keys:
    - ssh-ed25519 AAA...Dvz myuser@example.com
  • ユーザー myuser を作成
    • プライマリグループは mygroup (primary_group を省略すると、ユーザー名と同一のグループ名が使用される)
    • 所属グループは users と adm
    • パスワード無しでの sudo (ユーザーrootへの昇格を含む) を許可する
    • ログインシェルは /bin/bash
    • GitHubの my_github_username というユーザーのSSH公開鍵を ~/.ssh/authorized_keys に追加
    • ssh-ed25519 AAA...Dvz myuser@example.com というSSH公開鍵を ~/.ssh/authorized_keys に追加
    • パスワード認証は不許可 (lock_passwd がデフォルトで true であることによる)

補足は下記のとおり。

  • users: ... を書かなかった場合、users: [default] が適用される。この場合、/etc/cloud/cloud.cfg で定義されているデフォルトユーザーである ubuntu が作成される
  • パスワード認証を許可するには、lock_passwd: false を書き、hashed_passed: $6$...plain_text_passwd: ... などを書いてパスワードを設定すればよい。これにより、例えばコンソールからログインできるようになる。加えてSSHサーバーのパスワード認証も許可したいなら、前述の ssh_pwauth: false を削除すればよい

参照:

ロケールとタイムゾーンを設定

ロケールを ja_JP.UTF-8 に、タイムゾーンを Asia/Tokyo にする。

locale: ja_JP.UTF-8
timezone: Asia/Tokyo

参照:

ファイアウォールを有効化

ufwコマンドを使ってファイアウォールを設定し有効化する。外部からの接続はSSHポートのみ許可する。

runcmd:
  - [ufw, default, deny]
  - [ufw, allow, OpenSSH]
  - [ufw, enable]
  • ufw default deny を実行し、外部からの接続をデフォルトで禁止する
  • ufw allow OpenSSH を実行し、外部からSSHポートへの接続を許可する
  • ufw enable を実行し、ファイアウォールを有効にする

参照:

パッケージを更新・追加

インストール済みのパッケージ群を更新して、指定したパッケージを追加する。

package_update: true
package_upgrade: true
packages:
  - apt-file
  - debsums
  • package_update: truepackage_upgrade: true: パッケージ更新を行う (Ubuntuでは apt-get updateapt-get upgrade に相当)
  • packages: ...: パッケージ更新の後に、指定されたパッケージを追加する (Ubuntuでは apt-get install <package>... に相当)

それなりに時間がかかるので、初回起動時に実行しなくてもよいなら後回しにしたほうがいいかもしれない。ただ、SSHログインはパッケージ更新などの完了を待たずに行えるようである。

参照: Package Update Upgrade Install

初回起動

プリインストールイメージを書き込んだmicroSDカードをRaspberry PiのmicroSDカードスロットに挿入し、Raspberry Piがインターネットへとアクセスできる状態にして、Raspberry Piを起動する。ネットワークからのpingなどに応答するまで待ってから、SSHにてログインする。もし下記のように「まだブート中なので一般ユーザーはログイン不可」と表示されたら、もうしばらく待ってから再度ログインする。電源投入からSSHログインが可能になるまでの所要時間は、ネットワークの状況やmicroSDカードへの書き込み速度などに依存するが、手元のRaspberry Pi 4の場合は4分ほどだった。

$ ssh ubuntu
"System is booting up. Unprivileged users are not permitted to log in yet. Please come back later. For technical details, see pam_nologin(8)."
Connection closed by 192.168.0.10 port 22

ログインできたら、問題がないか確認する。 問題がなければ、インストールはこれで完了。

補足は下記のとおり。

  • 問題があった場合には、Raspberry Piを停止させてmicroSDカードを取り出し、第2パーティションのExt4ファイルシステムの ./var/log/cloud-init.log や ./var/log/cloud-init-output.log を調べると、何かわかるかもしれない
  • もし network-config や user-data に漏洩したくない情報を記述していたのであれば、/boot/firmware/ 内のそのファイルを編集して該当情報を削除しておくとよい

インストール完了後のパーティション構成は、手元のRaspberry Pi 4と4GBのmicroSDカードを用いた場合には下記のようになっていた。プリインストールイメージ書き込み直後の状態と見比べると、第2パーティションが最大サイズに拡張されたことがわかる。

Partition No. Size Partition ID: Type Bootable? Filesystem Label
Primary 1 512.0 MiB 0x0c: W95 FAT32 (LBA) yes FAT32 system-boot
Primary 2 3.3 GiB 0x83: Linux no Ext4 writable

補足: Raspberry Pi Imagerを用いたインストールの概要

プリインストールイメージのmicroSDカードへの書き込みと、初期設定内容の基本的な変更は、Raspberry Pi Imagerでも行える。

Raspberry Pi OSのページからRaspberry Pi Imagerをダウンロードし、PCへとインストールする。書き込み対象のmicroSDカードをPCへと接続し、Raspberry Pi Imagerを起動する。ウィンドウが表示されたら、下記の順に操作する。
(下記の操作は Raspberry Pi Imager v1.8.5 によるもの。細部はバージョンによって異なる)

  1. 下記をそれぞれ設定する。終わったら「次へ」を選択
    • Raspberry Piデバイス: 使用するRaspberry Piの種別に応じて設定
    • OS: Other general-purpose OS の Ubuntu の Ubuntu Server 24.04 LTS (64-bit) を設定
    • ストレージ: 書き込み対象のmicroSDカードを設定
  2. OSをカスタマイズするかどうか尋ねられるので、下記のいずれかを選択する
    • カスタマイズしない場合は、「いいえ」を選択
    • カスタマイズする場合は、「設定を編集する」を選択して、例えば下記の項目を任意で変更する。変更が終わったら「保存」を選択して元の画面に戻り、「はい」を選択
      • 一般
        • ホスト名
        • ユーザー名とパスワード
        • Wi-Fi設定
        • ロケール設定
      • サービス
        • SSH有効化
  3. 書き込みを実施してよいか確認されるので、「はい」を選択

最後の確認が終わると、イメージのダウンロードと書き込み、初期設定内容の変更が行われる。完了したら、そのmicroSDカードを使ってRaspberry Piの初回起動を行えばよい。手動での場合と同様に、初回起動前に第1パーティション内の network-config と user-data を変更すれば、初期設定内容を変更できる。

なお、Raspberry Pi Imagerで選択できるプリインストールイメージのリストの実体は https://downloads.raspberrypi.org/os_list_imagingutility_v4.json である(v1.8.5 の場合。参照: ソースコードconfig.hOSLIST_URL)。このファイルは随時更新されるようだが、2024-05-19時点のもので見ると、os_list > 4 (Other general-purpose OS) > subitems > 0 (Ubuntu) > subitems > 1 と辿った箇所に Ubuntu Server 24.04 LTS (64-bit) の情報があり、プリインストールイメージのURLなどが書かれている。

参照:

参考文献

Discussion