はじめに
今回は、Raspberry Pi に Ubuntu OS をインストールして設定する方法を解説します。
Raspberry Pi とは、教育や趣味のプログラミング、電子工作に使われる小型のコンピューターのことで、Ubuntu は使いやすさに重点を置いた Linux オペレーティングシステムの一種で、パソコンやサーバーで広く使用されています。
使用するモデルはRaspberry Pi 4Bです。
設定などは Windows から行っています。
Raspberry Pi Imager をインストールする
Raspberry Pi で使用する OS を SD カードに書き込むためにRaspberry Pi Imagerというツールをインストールしておきます。
今回は Windows 用のインストーラーをダウンロードします。
インストーラーの指示に従ってインストールすれば特に迷うことは無いと思いますので詳細は割愛します。
Ubuntu を SD カードに書き込む
Raspberry Pi Imager を起動する前に、Ubuntu OS を書き込む SD カードをセットしておきます。
Raspberry Pi Imager を起動すると以下の画面が表示されるので、各項目を選択していきます。
デバイスは今回使用する Raspberry Pi のモデルを選択します。
OS の選択で、Other general-porpose OSを選択します。
Ubuntu OS を選択します。
OS のバージョンは、Ubuntu Server 22.04.3 LTS 64-bitを選択します。
デスクトップ版でもサーバとして動作させれますが、今回 GUI 環境は必要ないのでサーバ版を選びました。
インストールするストーレジを選択します。SD カードが正しく認識されていれば以下のように表示されていると思います。
「次へ」を選択すると、OS の設定をインストール前に行うか聞かれます。
ここで、ユーザーやロケールの設定、SSH の有効化などが行なえます。
今回はある程度設定しておきます。
設定内容に問題なければ「保存」を選択します。
「はい」を選択して設定を確定させます。
「はい」を選択して OS の書き込みを実行します。
書き込みが正常に終了したら、SD カードを本体に差し込み、LAN ケーブルを接続し起動します。
SSH 接続する
今回はサーバ OS なので GUI 環境は起動しませんが、モニタで起動時の動作を確認したい場合は、電源を投入する前に HDMI ケーブルでモニタと接続しておきます。
初期設定では IP の割当は DHCP なので、NetEnum5などの LAN 内の端末の一覧を表示できるツールなどで Raspberry Pi に割り当てられた IP アドレスを特定します。
特定した IP アドレスを元に SSH 接続します。
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
ファイルの記述は以下のようになっています。
# 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
コマンドを実行します。
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 アドレスの設定をします
$ sudo vim /etc/netplan/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]
設定を反映させます。
$ sudo netplan apply
一旦ターミナルを閉じて再度 SSH 接続します。
$ ssh [user]@192.168.10.9
# パスワードを入力
私の環境では設定反映時に以下の警告が出力されました。
** (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 ユーザー以外からファイルの内容が読み取られることが好ましくないからのようです。設定自体は正しく反映されますが、この警告が気持ち悪い場合はファイルの権限を変更します。
$ 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 キーを作成します。
$ 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 を起動して以下のコマンドを実行します。
$ 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
次にリモート側で以下のコマンドを実行します。
# 秘密鍵と同時に作成された公開鍵を 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
の設定を変更します。
$ 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 接続します。
$ ssh rasb4
初期設定時にはパスワード入力を求められましたが、パスワード無しに接続できたと思います。
必要な設定ができました。