Raspberry PiにUbuntuをインストールする

Raspberry PiにUbuntuをインストールする

はじめに

今回は、Raspberry Pi に Ubuntu OS をインストールして設定する方法を解説します。

Raspberry Pi とは、教育や趣味のプログラミング、電子工作に使われる小型のコンピューターのことで、Ubuntu は使いやすさに重点を置いた Linux オペレーティングシステムの一種で、パソコンやサーバーで広く使用されています。

使用するモデルはRaspberry Pi 4Bです。

設定などは Windows から行っています。

Raspberry Pi Imager をインストールする

Raspberry Pi で使用する OS を SD カードに書き込むためにRaspberry Pi Imagerというツールをインストールしておきます。

今回は Windows 用のインストーラーをダウンロードします。

raspberry-pi-imager.png

インストーラーの指示に従ってインストールすれば特に迷うことは無いと思いますので詳細は割愛します。

Ubuntu を SD カードに書き込む

Raspberry Pi Imager を起動する前に、Ubuntu OS を書き込む SD カードをセットしておきます。

Raspberry Pi Imager を起動すると以下の画面が表示されるので、各項目を選択していきます。

raspberry-pi-imager01.png

デバイスは今回使用する Raspberry Pi のモデルを選択します。

raspberry-pi-imager02.png

OS の選択で、Other general-porpose OSを選択します。

raspberry-pi-imager03.png

Ubuntu OS を選択します。

raspberry-pi-imager04.png

OS のバージョンは、Ubuntu Server 22.04.3 LTS 64-bitを選択します。

デスクトップ版でもサーバとして動作させれますが、今回 GUI 環境は必要ないのでサーバ版を選びました。

raspberry-pi-imager05.png

インストールするストーレジを選択します。SD カードが正しく認識されていれば以下のように表示されていると思います。

raspberry-pi-imager06.png

「次へ」を選択すると、OS の設定をインストール前に行うか聞かれます。

ここで、ユーザーやロケールの設定、SSH の有効化などが行なえます。

今回はある程度設定しておきます。

raspberry-pi-imager08.png

raspberry-pi-imager09.png

設定内容に問題なければ「保存」を選択します。

raspberry-pi-imager10.png

「はい」を選択して設定を確定させます。

raspberry-pi-imager11.png

「はい」を選択して OS の書き込みを実行します。

raspberry-pi-imager12.png

書き込みが正常に終了したら、SD カードを本体に差し込み、LAN ケーブルを接続し起動します。

SSH 接続する

今回はサーバ OS なので GUI 環境は起動しませんが、モニタで起動時の動作を確認したい場合は、電源を投入する前に HDMI ケーブルでモニタと接続しておきます。

初期設定では IP の割当は DHCP なので、NetEnum5などの LAN 内の端末の一覧を表示できるツールなどで Raspberry Pi に割り当てられた IP アドレスを特定します。

特定した IP アドレスを元に SSH 接続します。

"Windows-Terminal"
ssh [ユーザー名]@192.168.xxx.xxx
[ユーザー名]@192.168.xxx.xxx's password: # OS書き込み前に設定したユーザーのパスワードを入力します。

各種設定

システムのアップデート

端末にログインできたらまずはシステムのアップデートなどを実施します。

"パッケージリストを更新"
$ sudo apt update

アップグレード可能なパッケージを確認する場合は以下のコマンドを実行します。

"アップグレード可能なパッケージを表示する"
$ sudo apt list --upgradable

新しいバージョンに更新可能なすべてのパッケージをアップグレードします。

"パッケージをアップグレードする"
$ sudo apt -y upgrade

必要ではなくなった古いパッケージを削除します。

"古いパッケージを削除"
$ sudo apt autoremove

一旦再起動します。

$ sudo reboot

IP アドレスの固定化

Ubuntu で IP アドレスを固定化するには/etc/netplan配下のファイルを作成します。

インストール直後には50-cloud-init.yamlというファイルが存在し、このファイルはNetplantという仕組みで管理されており従来の/etc/network/interfacesでネットワークの設定をすることは非推奨になっています。

Netplant とはネットワークの設定を YAML ファイルで管理する仕組みで、Ubuntu 18.04 以降よりで採用されています。

50-cloud-init.yamlファイルの記述は以下のようになっています。

"50-cloud-init.yaml"
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
    version: 2

デフォルトではeth0という NIC に対して DHCP 機能が有効になっています。

50-cloud-init.yaml を直接修正しない

このファイルはcloud-initによって作成されており、修正しても上書きされてしまう可能性があります。

そのため、固定 IP アドレスの設定を行う場合は別の yaml ファイルを作成し設定することが推奨されています。

公式ドキュメントのStatic IP address assignmentでのサンプルには99_config.yamlというファイル名で設定ファイルを作成しているのでこれを参考にします。

設定する NIC を調べるにはip aコマンドを実行します。

"Windows-Terminal"
ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
+ 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether dc:a6:32:89:e9:5a brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.165/24 metric 100 brd 192.168.10.255 scope global dynamic eth0
       valid_lft 35sec preferred_lft 35sec
    inet6 240d:1e:331:3100:dea6:32ff:fe89:e95a/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 86070sec preferred_lft 86070sec
    inet6 fe80::dea6:32ff:fe89:e95a/64 scope link
       valid_lft forever preferred_lft forever

# 省略

eth0に固定 IP アドレスの設定をします

"Windows-Terminal"
$ sudo vim /etc/netplan/99_config.yaml
"99_config.yaml"
network:
    version: 2
    renderer: networkd
    ethernets:
        eth0:
            # DHCP機能を無効化
            dhcp4: no
            addresses:
                # 任意の固定IPアドレスを指定
                - 192.168.10.9/24
            routes:
                # デフォルトゲートウェイ
                - to: default
                  via: 192.168.10.1
            nameservers:
                # DNSサーバーのアドレスを指定
                addresses: [192.168.0.1, 8.8.8.8]

設定を反映させます。

"Windows-Terminal"
$ sudo netplan apply

一旦ターミナルを閉じて再度 SSH 接続します。

"Windows-Terminal"
$ ssh [user]@192.168.10.9
# パスワードを入力

私の環境では設定反映時に以下の警告が出力されました。

"Windows-Terminal"
** (process:6073): WARNING **: 12:06:11.256: Permissions for /etc/netplan/50-cloud-init.yaml are too open. Netplan configuration should NOT be accessible by others.

** (process:6073): WARNING **: 12:06:11.257: Permissions for /etc/netplan/99_config.yaml are too open. Netplan configuration should NOT be accessible by others.

WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running.

上記 2 つのメッセージはセキュリティ上の理由から、root ユーザー以外からファイルの内容が読み取られることが好ましくないからのようです。設定自体は正しく反映されますが、この警告が気持ち悪い場合はファイルの権限を変更します。

"Windows-Terminal"
$ sudo chmod 600 /etc/netplan/50-cloud-init.yaml
$ sudo chmod 600 /etc/netplan/99_config.yaml

もういちどsudo netplan applyを実行して警告が出力されなくなったことを確認します。

WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running.というメッセージは、Open vSwitch のデータベースサーバー(ovsdb-server)が実行されていないことを示しています。

これは、Netplan のバグとして報告されており、特に Ubuntu 22.04 や 23.04 などのバージョンで発生しているようです。

今回はこのメッセージに関しては無視します。

ファイルの読み込み順序

今回設定ファイルを99_config.yamlとしましたが、Netplan は/etc/netplan/ディレクトリ内の YAML ファイルを数字の昇順で読み込みます。

したがって、99_config.yamlのように高い番号で始まるファイル名を使用すると、他の設定ファイルより後に読み込まれます。

デフォルトで存在していた50-cloud-init.yamlではeth0に対して DHCP で IP アドレスを取得する設定になっていたので、今回作成したファイルでeth0に対して設定を上書きした形になります。

SSH 接続の設定

パスワードで接続していましたが SSH キーを作成します。

"Windows-Terminal"
$ ssh-keygen -t ed25519 -C Raspberry-Pi-4B -f ~/.ssh/raspi-4b
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): # パスフレーズは空でエンター
Enter same passphrase again: # 同様

# 正しく作成されているか確認
$ la -la ~/.ssh
-rw------- 1 [your user] [your user]    0 Nov 19 21:07 authorized_keys # デフォルトで存在しているファイル(後にraspi-4b.pubをリネームして上書きする)
-rw------- 1 [your user] [your user]  411 Dec 13 20:28 raspi-4b # 秘密鍵
-rw-r--r-- 1 [your user] [your user]   97 Dec 13 20:28 raspi-4b.pub # 公開鍵

リモート接続している状態を保ったままローカル側で作業します。

次に、秘密鍵をローカルの PC にダウンロードします。

Linux コマンドを実行できる方が効率が良いので、Windows を利用している場合はGit Bashをインストールしておきます。

Git Bash を起動して以下のコマンドを実行します。

"Git-Bash"
$ cd .ssh/

$ scp -P 22 [your user]@192.168.10.9:/home/[your user]/.ssh/raspi-4b /c/Users/[your user]/.ssh
[your user]@192.168.10.9's password:
raspi-4b   100%  411   139.4KB/s   00:00

# ダウンロードできていることを確認
$ ls -la
# 省略
-rw-r--r-- 1 [your user] 197121  411 Dec 13 20:56 raspi-4b

# configを編集する
$ vim config

# 追記する
Host rasb4
  HostName 192.168.10.9
  User [Raspberry Pi 4Bのユーザー]
  Port 2222
  IdentityFile ~/.ssh/raspi-4b

次にリモート側で以下のコマンドを実行します。

"Windows-Terminal"
# 秘密鍵と同時に作成された公開鍵を authorized_keys にリネームする
$ mv ~/.ssh/raspi-4b.pub ~/.ssh/authorized_keys

# 権限を変更
$ chmod 600 ~/.ssh/authorized_keys

# 確認
$ la -la ~/.ssh
-rw------- 1 [your user] [your user]   97 Dec 13 20:28 authorized_keys
-rw------- 1 [your user] [your user]  411 Dec 13 20:28 raspi-4b

最後にsshd_configの設定を変更します。

"Windows-Terminal"
$ sudo tee -a /etc/ssh/sshd_config <<EOF

Port 2222 # 任意のポートに変更
PermitRootLogin no # rootユーザーでログインを禁止する
MaxAuthTries 3 # 一つのセッションで認証試行を最大3回までに制限する
PasswordAuthentication no # パスワードによるログインを無効にする
PermitEmptyPasswords no # 空のパスワードを持つユーザーがSSH接続出来ないようにする
EOF

# 追記されたか確認する
$ cat /etc/ssh/sshd_config
# 省略

Port 2222 # 任意のポートに変更
PermitRootLogin no # rootユーザーでログインを禁止する
MaxAuthTries 3 # 一つのセッションで認証試行を最大3回までに制限する
PasswordAuthentication no # パスワードによるログインを無効にする
PermitEmptyPasswords no # 空のパスワードを持つユーザーがSSH接続出来ないようにする

# sshデーモンを再起動して設定を反映させる
$ sudo systemctl restart sshd
# ステータスの確認
$ sudo systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
    Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
    Active: active (running) since Wed 2023-12-13 22:08:31 JST; 3s ago
    # 以下略

一旦ターミナルからログアウトして、再度ローカル側から SSH 接続します。

"Windows-Terminal"
$ ssh rasb4

初期設定時にはパスワード入力を求められましたが、パスワード無しに接続できたと思います。

必要な設定ができました。

参考