Raspberry PiにUbuntu Server 24.04 LTSをヘッドレスインストール
Ubuntu Server 24.04 LTSがリリースされたので、Ubuntu Serverで運用している手元のRaspberry Pi 3とRaspberry 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
手順
大まかな作業順序は下記のとおり。
- プリインストールイメージをダウンロードし、microSDカードへと書き込む
- Raspberry Pi初回起動時の初期設定内容がmicroSDカード内に書かれているので、それを必要に応じて変更する
- そのmicroSDカードをRaspberry Piのスロットに挿入し、ネットワークに接続した状態で初回起動を行い、初期設定を行わせる
以降、ネットワーク越しにRaspberry Piを使用できる。SSHを使ってログインし、必要に応じて追加のセットアップなどを行えばよい。
初回起動時の初期設定は、cloud-initによって実施される。cloud-initは初期設定のためのツールなので、ネットワーク設定などの必須のもののみをcloud-initに行わせ、それ以外のものは以後に別途行うほうが扱いやすい。
プリインストールイメージのmicroSDカードへの書き込み
Ubuntu Releasesの24.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:
version: 2
ethernets:
eth0:
dhcp4: true
optional: true
- イーサネットインターフェイス
eth0
を設定する- IPv4 DHCPにてIPアドレスなどを取得する (
dhcp4: true
による) - 起動時に設定を試みるが、失敗したらスキップする (
optional: true
による)
- IPv4 DHCPにてIPアドレスなどを取得する (
このファイルを編集すれば、ネットワーク設定を変更できる。以降、いくつか変更例を示す。記述方法の詳細は、YAML configuration - Netplan Documentationを参照のこと。
イーサネットインターフェイスに固定IPアドレスを設定
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:
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形式のファイルである。何も編集していない場合は、下記のような内容になっている(関連しないコメントは省略している)。
#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
であることによる)
- プライマリグループは mygroup (
補足は下記のとおり。
-
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: true
とpackage_upgrade: true
: パッケージ更新を行う (Ubuntuではapt-get update
とapt-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 によるもの。細部はバージョンによって異なる)
- 下記をそれぞれ設定する。終わったら「次へ」を選択
- Raspberry Piデバイス: 使用するRaspberry Piの種別に応じて設定
- OS: Other general-purpose OS の Ubuntu の Ubuntu Server 24.04 LTS (64-bit) を設定
- ストレージ: 書き込み対象のmicroSDカードを設定
- OSをカスタマイズするかどうか尋ねられるので、下記のいずれかを選択する
- カスタマイズしない場合は、「いいえ」を選択
- カスタマイズする場合は、「設定を編集する」を選択して、例えば下記の項目を任意で変更する。変更が終わったら「保存」を選択して元の画面に戻り、「はい」を選択
- 一般
- ホスト名
- ユーザー名とパスワード
- Wi-Fi設定
- ロケール設定
- サービス
- SSH有効化
- 一般
- 書き込みを実施してよいか確認されるので、「はい」を選択
最後の確認が終わると、イメージのダウンロードと書き込み、初期設定内容の変更が行われる。完了したら、そのmicroSDカードを使ってRaspberry Piの初回起動を行えばよい。手動での場合と同様に、初回起動前に第1パーティション内の network-config と user-data を変更すれば、初期設定内容を変更できる。
なお、Raspberry Pi Imagerで選択できるプリインストールイメージのリストの実体は https://downloads.raspberrypi.org/os_list_imagingutility_v4.json である(v1.8.5 の場合。参照: ソースコードのconfig.hのOSLIST_URL
)。このファイルは随時更新されるようだが、2024-05-19時点のもので見ると、os_list > 4 (Other general-purpose OS) > subitems > 0 (Ubuntu) > subitems > 1 と辿った箇所に Ubuntu Server 24.04 LTS (64-bit) の情報があり、プリインストールイメージのURLなどが書かれている。
参照:
- Raspberry Pi OS - Raspberry Pi (Raspberry Pi Imagerが置かれている)
- raspberrypi/rpi-imager: The home of Raspberry Pi Imager, a user-friendly tool for creating bootable media for Raspberry Pi devices (Raspberry Pi Imagerのソースコード)
- Raspberry Pi Imager のインストールと使い方
参考文献
- Raspberry PiへのUbuntu Serverのインストール
- cloud-init
- Netplan
Discussion