🥧

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

2023/01/09に公開

ここでは Raspberry Pi に Ubuntu Server をインストールする方法を紹介します。 この方法では、外付けのディスプレイやキーボードは必要ありません。

用意するもの

  • Ubuntu 22.04.1 LTS (イメージファイルを microSD に書き込むためのホスト環境)
  • Raspberry Pi (私は Raspberry Pi 3B を利用しました)
  • 適当な microSD (私は 128 GB のものを利用しました)
  • 適当なネットワーク環境

イメージの用意

Ubuntu の公式ページから Raspberry Pi 向けの Ubuntu のイメージファイルをダウンロードしてきます。 Ubuntu Server は少し下のほうにあります。 64 bit 版と 32 bit 版のどちらを利用しても良いです。 私は 64 bit 版を利用しましたが、Raspberry Pi 3B で稼働させるなら 32 bit 版でもよかったかもしれません。

Ubuntu Server for Raspberry Pi のイメージファイルをダウンロードする
Ubuntu Server for Raspberry Pi のイメージファイルをダウンロードする

ダウンロードされるイメージファイルは xz で圧縮されています (ファイル名の末尾が xz になっていますね)。 そのため、microSD に書き込む前に解凍作業が必要になります。 ダウンロードされたファイルが保存されているディレクトリで次のように実行します。 正常に解凍されるとファイル名の末尾の xz を取り除いた名前を持つファイルに置き換えられます。

イメージファイルを解凍する
% xz -d ubuntu-22.04.1*raspi.img.xz

microSD にイメージファイルを書き込む

続いて、microSD にイメージファイルを書き込みます。 ホスト環境に microSD を接続してください。 microSD-USB 変換モジュールを利用しても良いかもしれません。 接続したら次のように実行して microSD のデバイスファイル名の目星を立てます。

microSD のデバイスファイルの目星を立てる (USB 変換モジュール)
% sudo dmesg | tail
[175357.869368] scsi host7: usb-storage 3-3:1.0
[175358.871619] scsi 7:0:0:0: Direct-Access     USB Mass  Storage Device  1.00 PQ: 0 ANSI: 0
[175358.872476] sd 7:0:0:0: Attached scsi generic sg2 type 0
[175358.873694] sd 7:0:0:0: [sdc] 251707392 512-byte logical blocks: (129 GB/120 GiB)
[175358.873826] sd 7:0:0:0: [sdc] Write Protect is off
[175358.873831] sd 7:0:0:0: [sdc] Mode Sense: 03 00 00 00
[175358.873971] sd 7:0:0:0: [sdc] No Caching mode page found
[175358.873977] sd 7:0:0:0: [sdc] Assuming drive cache: write through
[175358.881559]  sdc: sdc1
[175358.883139] sd 7:0:0:0: [sdc] Attached SCSI removable disk

ここで、129 GB 程度のリムーバブルディスクが sdc としてアタッチされたことがわかります。 私が利用している microSD は 128 GB のものですから、これで間違いなさそうです。

デバイスファイル名は環境によって変化します。 環境によっては次のように表示されるかもしれません。 この場合は mmcblk0 がデバイスファイル名です。

microSD のデバイスファイルの目星を立てる (SD スロット)
% sudo dmesg | tail
[175724.282714] mmc0: cannot verify signal voltage switch
[175724.431253] mmc0: new ultra high speed SDR104 SDXC card at address 0001
[175724.432067] mmcblk0: mmc0:0001 SD16G 120 GiB 
[175724.436176]  mmcblk0: p1
[175724.617500] FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

microSD のデバイスファイルを特定できたなら、いよいよ microSD にイメージファイルを書き込みます。 書き込みには dd(1) を利用します[1]操作を誤るとデータを意図せず破壊する恐れがあります。 microSD に記録されているデータは全て破壊されます。

microSD にイメージファイルを書き込む (microSD が mmcblk0 の場合)
% sudo dd if=/path/to/ubuntu-22.04.1*raspi.img of=/dev/mmcblk0 conv=sync bs=4m
946+1 records in
947+0 records out
3972005888 bytes (4.0 GB, 3.7 GiB) copied, 104.523 s, 38.0 MB/s

コマンドが返ってきたら次のように実行します[2]

確実に書き込む
% sudo sync
% sudo sync
% sudo sync

確実に書き込みが完了したなら、一度 microSD をホスト環境から取り出しておきます。

ネットワーク設定の編集

ネットワーク設定を書き込むためにもう一度 microSD をホスト環境に接続します。 microSD に記録されているパーティションが自動的に認識され、/media 配下にマウントされます。 ネットワーク設定は /media/*/system-boot/network-config に記述します。

ネットワーク設定を編集する (お好みのエディタで)
% vi /media/*/system-boot/network-config

設定項目は 27 行目以降に記述されています。 次の設定は、静的なプライベート IPv4 アドレス 192.168.1.184 を名乗り、IPv4 のゲートウェイを 192.168.1.1 に向け、ネームサーバとして 8.8.8.8, 8.8.4.4, 1.1.1.1 を利用する場合の例です。 詳細な設定方法はリファレンスを参照してください。

network-config (抜粋)
version: 2
ethernets:
  eth0:
    addresses: [ 192.168.1.184/24 ]
    gateway4: 192.168.1.1
    nameservers:
      addresses: [ 8.8.8.8, 8.8.4.4, 1.1.1.1 ]

設定を完了したら、microSD をアンマウントします。

microSD をアンマウントする
% cd	# アンマウントするディレクトリから脱出します
% umount /media/*/system-boot
% umount /media/*/writable

アンマウントが完了したら microSD をホスト環境から取り出します。

Raspberry Pi にリモートログインする

microSD を Raspberry Pi に接続し、電源を投入します。 この際、Raspberry Pi がネットワークに接続していることを確認してください。 設定が適用されると ping に応答するようになります。

ネットワークの設定の成功を祈る
% ping 192.168.1.184
PING 192.168.1.184 (192.168.1.184) 56(84) bytes of data.
64 bytes from 192.168.1.184: icmp_seq=1 ttl=64 time=1.54 ms
64 bytes from 192.168.1.184: icmp_seq=2 ttl=64 time=1.45 ms
64 bytes from 192.168.1.184: icmp_seq=3 ttl=64 time=1.45 ms
64 bytes from 192.168.1.184: icmp_seq=4 ttl=64 time=1.59 ms
64 bytes from 192.168.1.184: icmp_seq=5 ttl=64 time=1.61 ms
64 bytes from 192.168.1.184: icmp_seq=6 ttl=64 time=1.47 ms

設定が適用されているなら ssh で接続できます。 ユーザ名とパスワードのいづれも ubuntu です。 初回の接続時にはパスワードの変更を求められます。

初回ログイン
% ssh ubuntu@192.168.1.184
The authenticity of host '192.168.1.184 (192.168.1.184)' can't be established.
ED25519 key fingerprint is SHA256:OjAm1X7R2bYvYfiqzhgCv2D7zbfs5T0nZZCWjB6EPrk.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.184' (ED25519) to the list of known hosts.
ubuntu@192.168.1.184's password: ubuntu

パスワードの変更が完了すると一度通信が切断されます。 再度ログインしましょう。

Welcome to Ubuntu 22.04.1 LTS

これで Raspberry Pi に Ubuntu Server をインストールできました。 パッケージの更新などの作業を行っておきましょう。

おわりに

おわりです。


参考

  • Brain W. Kernighan; Rob Pike. “第 1 章 初心者のための UNIX”. UNIX プログラミング環境. 石田晴久監訳; 野中浩一訳. ASCII DWANGO, 2017, p. 7–55, ISBN978-4-04-893057-4.
  • JM Project. Man page of SYNC. JM Project. 2022-06-18. (accessed 2023-01-09). (コマンド)
  • JM Project. Man page of SYNC. JM Project. 2020-08-13. (accessed 2023-01-09). (システムコール)
脚注
  1. 多くの UNIX ユーティリティに比べると dd(1) のオプションの取り方は異質です。 dd(1) はもともと磁気テープのデータを処理するためのプログラムであり、その名前は OS/360 にあったジョブ制御言語の名残です。 ↩︎

  2. Linux では、ディスクに対する読み書きを頻繁に行わないようにするため、データをメモリ上にキャッシュすることがあります。 このキャッシュをディスクに反映するために sync(1) を利用します。 しかし、sync(1) が呼び出すシステムコール sync(2) は書き込みを完了する前に返ってくることがあり、より確実に書き込みを行うために sync(1) を複数回呼び出す必要があります。 太古の UNIX ではシステムの電源を落とす前にも同様のコマンドを利用していました。 ↩︎

Discussion