RaspberryPi 3 で Ubuntu Server をうごかす(個人用メモ)

最近ではこちらのページに

>Further releases can be found at http://cdimage.ubuntu.com/ubuntu/releases/. Please note that even though these images are labelled "+raspi3" they are compatible with the Raspberry Pi 2 and 3 (and 4 in the case of 19.10).

このように記載されており公式でイメージが動くようになっているのでwikiを参考に進めてみてください。

https://wiki.ubuntu.com/ARM/RaspberryPi#Download

追記終わり

# はじめに

この記事は筆者が RaspberryPi 3 で公式[^ubuntu-official] の Ubuntu 16.04.3 イメージを動かすまでの手順をメモしたものです。
(大まかな手順は Wiki[^ubuntu-raspi-wiki] によるが、なぜか公式のイメージは RaspberryPi 2 用しかなく[^raspi3-image] こまったりしたので)

[^ubuntu-raspi-wiki]: https://wiki.ubuntu.com/ARM/RaspberryPi
[^ubuntu-official]: RaspberryPi ではなく Ubuntu の方
[^raspi3-image]: https://wiki.ubuntu.com/ARM/RaspberryPi#Download に非公式のものはあるが自分でやってみたかった

# 内容

## 環境

Windows 上で作業していたのでイメージの導入などはそれ前提です。もちろん読み替えれば別の OS 上でも作業可能です。

- [7-Zip](http://www.7-zip.org/)
  - ファイルの展開作業に用います
- [rufus](http://rufus.akeo.ie/)
  - イメージファイルを MicroSD カードに焼くのに使います。
  - [UNetbootin](https://unetbootin.github.io/) とかでもよいです

RaspberryPi 上での作業は普通に Ubuntu を操作しているだけです。
なお、基本的な Linux の知識などを仮定して書いています。

あと、面倒なので Wi-Fi にはつながずに有線で作業していました。

## イメージを用意する

[RaspberryPi 公式のダウンロードページ](https://www.raspberrypi.org/downloads/) には Ubuntu のイメージはないので別の場所から取得します。
(ちなみに [Ubuntu 公式のダウンロードページ](https://www.ubuntu.com/download/server) からたどるのもかなり困難です)

直接のリンクが [Wiki の Download](https://wiki.ubuntu.com/ARM/RaspberryPi#Download) にありますが、日本国内のミラーから落としたほうが早いはずなのでそのようにします。
([ミラー情報](https://www.ubuntulinux.jp/ubuntu/mirrors#dvdimagemirror) によると富山大学だけのようです)

http://ubuntutym2.u-toyama.ac.jp/ubuntu-dvd/16.04.3/release/ubuntu-16.04.3-preinstalled-server-armhf+raspi2.img.xz

上記のリンクからファイルをダウンロードして適当な場所に展開してください。(Windows だったら 7-Zip で展開しましょう)
`raspi2` という文字が見えますが後の手順で対応するので問題ないです。

### 余談

RaspberryPi 用のイメージ配布についてハッキリとはわかっていないのですが以下の通りのようです。

- http://releases.ubuntu.com/ にはない
- http://cdimage.ubuntu.com/ubuntu/releases/ にはある

## イメージを MicroSD カードに焼く

`dd` コマンドが使える環境であれば [Installation](https://wiki.ubuntu.com/ARM/RaspberryPi#Installation) をサクッとやれば良いのですが、Windows だとそういうわけにもいきません。
ということで [rufus](http://rufus.akeo.ie/) を使ってイメージを MicroSD に焼いてください。細かい部分は省略します。
成功すると `system-boot` というドライブ名に書き換わるはず。

## RaspberryPi 3 向けに調整する

正直[この手順](https://wiki.ubuntu.com/ARM/RaspberryPi#Booting_the_official_Pi_2_image_on_the_Pi_3)に従うだけなのですが、Windows でやるにあたり若干わかりずらかったのでちょっと書きます。

まず、次のように `system-boot` 直下の `config.txt` を編集します。

```diff:config.txt
- kernel=uboot.bin
- device_tree_address=0x02000000
+ kernel=vmlinuz
+ initramfs initrd.img followkernel
```

次に、 `bcm2710-rpi-3-b.dtb` を `/lib/firmware/4.4.0-1065-raspi2/device-tree` からコピーして `system-boot` 直下に配置するのですが、 `/lib` を Windows から参照するのは難しいのでイメージから抽出することにします。
`ubuntu-16.04.3-preinstalled-server-armhf+raspi2.img` を 7-Zip で開くと、`1.img` というファイルがあります。
さらに `1.img` を開くと Linux でいう `/` 相当のファイル群が見えるので指定のパス(`/lib/firmware/...`)からファイルをコピーして配置するだけです。

## 起動する

ここまでくれば普通に起動させることはできます。電源とディスプレイを用意して接続すれば Ubuntu のログイン画面(CUI)が表示されるはずです。
(`cloud-init` に時間かかっていました。もし `systemd-modules-load.service loaded failed` などと出ているときは[このページ](https://dbpro.xyz/1894)が参考になります)

初期の `user/password` は `ubuntu/ubuntu` です。初回ログイン時にパスワードを変更するよう促されるので一回はログインしておきましょう。

## SSH する

`ifconfig` などで IP アドレスを調べて SSH でつないでおきましょう。こうすることでコピペが可能になります。
(私の場合はキーボードを使い慣れているもの(HHKB)を使えるほうが大きかったです)

## ホスト名を変更する

```console
$ sudo hostname お好みのホスト名
$ sudo vim /etc/hostname
$ sudo vim /etc/hosts
```

```diff:/etc/hosts
+ 127.0.0.1 お好みのホスト名
```

### 余談

`avahi-daemon` を入れておくと対応した環境からは `お好みのホスト名.local` でアクセスできるようになり捗る。

## パッケージを更新する

まずは参照先を日本のミラーにする。
arm 向けのミラーはちょっと特殊な感じ[^ubuntu-arm-package-mirror]。

[^ubuntu-arm-package-mirror]: https://lists.ubuntu.com/archives/ubuntu-jp/2009-August/002059.html

```console
$ sudo sed -i.bak -e "s%ports.ubuntu.com%jp.archive.ubuntu.com%g" /etc/apt/sources.list
```

それから、RaspberryPi 3 用のリポジトリを追加する。

```console
$ sudo add-apt-repository ppa:ubuntu-raspi2/ppa-rpi3
```

パッケージを最新の状態にする。

```console
$ sudo apt update
$ sudo apt upgrade
```

もしエラーが出たら下記の対処をする[^raspi-package-workaround]。

[^raspi-package-workaround]: https://bugs.launchpad.net/ubuntu/+source/linux-firmware-raspi2/+bug/1691729

```console
$ sudo dpkg-divert \
  --divert /lib/firmware/brcm/brcmfmac43430-sdio-2.bin \
  --package linux-firmware-raspi2 \
  --rename --add /lib/firmware/brcm/brcmfmac43430-sdio.bin
$ sudo apt upgrade
```

# おわり

ここまでやれば普通に SSH したり再起動したりしても問題ないはずです。
ちなみに安定性などは全く検証していないのでわからないです。
書き上げた後に[この記事](https://qiita.com/ww24/items/43de25219159119d5d59)を見て不安になっているところです :scream:

> Ubuntu 16.04 LTS の非公式イメージを使っていた所、突然死することが何度もあり不安定