📑

"いまさら" Raspberry Pi 4でUbuntu Server 24.04 LTSを立ち上げる

2024/09/02に公開

余っていたRaspberry Pi4にUbuntu Server 24.04.1 LTSをインストールしたので、その工程のメモ。

UbuntuのイメージをSDカードに書き込む

世の中的には rpi-imagerというアプリを使うようだが、ddコマンドでSDカードにイメージを作る方が楽なので、Ubuntuのサイトからイメージファイルをダウンロードし、ddコマンドを使ってSDカードにイメージを作る。

UbuntuのRaspberry Pi用イメージは、ありがたいことにUbuntuが提供してくれている。今回は、これをそのまま使うことにした。

Raspberry Pi用イメージは以下のURLからダウンロードできる
Canonical Ubuntu/Downloads: Install Ubuntu on a Rasberry Pi

ダウンロードしたイメージファイルをddを使ってSDカードにコピーする

xzcat ./ubuntu-24.04.1-preinstalled-server-arm64+raspi.img.xz | sudo dd of=/dev/sda bs=32M status=progress; sync

標準イメージのパーティション構成

ddで構築したSDカードをPCに自動マウントするとsystem-boot,writableという2つのパーティションが見える。ルートファイルシステムはwritableに格納されている。

この後の手順でルートファイルシステムを編集する場合は、writeble以下のファイルを編集する。

sshでログインする環境を準備する

デスクトップ環境を一切使わずにRaspberry Piを使うために、ネットワーク越しにsshでログインする環境を準備する。

ネットワークを設定する

Ubuntu Server 24.04.1 LTSのネットワーク設定は、デフォルトでDHCPになっている、この設定のまま有線LANネットワークに接続すると、IPアドレスが自動で割り振られてしまい迷子になる。もっとも接続された機器のIPアドレスを調べる方法はあるが、健全なネットワークであれば固定IPアドレスの領域が定義されているはずなので、はじめから固定IPアドレスを設定する方が効率がよい。また、どうせネットワークの設定をするならば、一緒に wifiの設定をしてしまえば、有線LANを繋ぐ物理的な制約がなくなる。

Ubuntuのネットワーク設定

Ubuntuはネットワーク設定の抽象化レイヤーとしてNetplanを採用している。Ubuntuサーバーはネットワーク管理としてsystemd-networkdが実装されており、この設定をNetplanにより行う。

Netplanの設定ファイルは、ユーザーランドの/etc/netplan/以下に設定ファイルを配置する。
設定ファイルはYamlで記載する。Netplanの設定ファイルの例は、GithubのNetplanのRepositoryにあるため参考にするとよい
https://github.com/canonical/netplan/tree/main/examples

Ubuntu Server 24.01.1 LTSのDHCP設定

「Ubuntu Server 24.04.1 LTSではデフォルトでDHCPになっている」と上述した。これはUbuntuに実装される cloud-initが初期設定時に生成する/etc/netplan/50-cloud-init.yamlにて設定される。
そのため、ネットワーク設定を行うためにcloud-initの設定ファイルを修正するという方法も考えられるが、今回はシンプルに50-cloud-init.yaml以降に実行されるネットワーク設定ファイルを、ルートファイルシステムに追加しておくことにする。

有線LANの設定

ネットワークインターフェースeth0に固定IPアドレスの設定を行う。

例として以下のネットワークのNetplanの設定を記す

  • IPアドレス: 192.168.1.100
  • DNS: 8.8.8.8
  • デフォルトルート: 192.168.1.1

固定IP

/etc/netplan/99-static.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
      addresses:
        - 192.168.1.100/24
      nameservers:
        addresses: [8.8.8.8]
      routes: 
        - to: default
          via: 192.168.1.1

無線LAN (Wifi)の設定

ネットワークインターフェースwlan0に固定IPアドレスの設定とアクセスポイントへ接続するための設定をする

有線LANの設定と無線LANの設定は同じ設定ファイルに記載してかまわないため、wlan0の設定はeth0の後に追加する

例として、以下のネットワークのNetplanの設定を記す

  • ネットワークインターフェース: wlan0
  • IPアドレス: 192.168.1.101
  • DNS: 8.8.8.8
  • デフォルトルート: 192.168.1.1
  • アクセスポイントSSID: my_ap
  • my_apパスワード: my_ap_passwd
/etc/netplan/99-static.yaml
wifis:
  wlan0:
    dhcp4: false
    addresses:
      - 192.168.1.101/24
    nameservers:
      addresses: [8.8.8.8]
    access-points:
      my_ap:
        password: "my_ap_passwd"
    routes:
      - to: default
        via: 102.168.1.1

ssh接続するPCの公開鍵を登録する

sshを公開鍵認証で接続するため、Raspberry Piに接続するPCの公開鍵を登録する。しかし、ルートファイルシステムができたときは、まだユーザーのホームディレクトリ /home/ubuntuは存在していない。そのためホームディレクトリの.ssh/authorized_keysファイルを配置することはできない。

ホームディレクトリはcloud-initにより生成される。この設定ファイル/etc/cloud/cloud.cfgを修正することで公開鍵を登録することができる。

ubuntuユーザーにssh_authorized_keys:を追加するとauthorized_keysが追加された状態で、ホームディレクトリが生成される。

/etc/cloud/cloud.cfg
   default_user:
     name: ubuntu
     lock_passwd: True
     gecos: Ubuntu
     groups: [adm, cdrom, dip, lxd, sudo]
     sudo: ["ALL=(ALL) NOPASSWD:ALL"]
     shell: /bin/bash
+    ssh_authorized_keys:
+      - ssh-rsa AAAAB3NzaC1yc...
   network:
     dhcp_client_priority: [dhcpcd, dhclient, udhcpc]
     renderers: ['netplan', 'eni', 'sysconfig']
     activators: ['netplan', 'eni', 'network-manager', 'networkd']
   # Automatically discover the best ntp_client
   ntp_client: auto
   # Other config here will be given to the distro class and/or path classes

なお、Ubuntu Server 24.04.1 LTSのデフォルトイメージではsshのパスワード認証を禁止している。もしも、パスワード認証を許可したい場合は、clout-initで生成された/etc/ssh/sshd_config.d/50-cloud-init.confを修正する必要がある

/etc/cloud/cloud.cfgを変更すると、ubuntuユーザーではなく任意のユーザーを作ることもできる。そのようなことがしたい場合は、clout-initのReference Manualを読むみ設定を変更すると良い。

https://cloudinit.readthedocs.io/en/latest/reference/index.html

Discussion