Raspberry Pi 3 Model B plus でUbuntu18.04を起動してみた。

# はじめに
Raspberry Pi 3 Model B PlusにUbuntu18.04をインストールした時のまとめです.

# 結果
Ubuntu16.04などではubuntu-desktopをインストールするとうまく動作しなかったのですが、Ubuntu18.04ではUbuntu serverをインストールしてからデスクトップをインストールすると問題なく動作しました.
ファームウエアを書き換える必要がありますが、eth0とwlan0は問題なく使用することができました.
しかし変換したHDMIなどを使用するとディスプレイ出力ができませんでした.

# 使用環境
- Raspberry Pi 3 Model B Plus + SDcard(16GB)
- Raspberry Pi 3 Model B
- MacBook (Mojave 10.14)

## 参考先
- [Wiki](https://wiki.ubuntu.com/ARM/RaspberryPi)
- [ASRobot](https://www.asrobot.me/entry/2018/07/05/045832/)
- [Raspberry Pi 3 Model B+ で Ubuntu Server 16.04 を使う方法](https://qiita.com/adeliae1316/items/e34170584b3abdb7253c)

# 手順

## 1.ダウンロード
- Raspberry pi 向けのubuntu18.04イメージを[ダウンロード](http://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ubuntu-18.04.1-preinstalled-server-armhf+raspi2.img.xz)する.

```Bash
wget http://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ubuntu-18.04.1-preinstalled-server-armhf+raspi2.img.xz
```

## 2.書き込み
書き込む前にSDcardのフォーマットを行う.

- GUIを使う場合
[Etcher](https://etcher.io)を使うとやりやすいです.
ダウンロードしたイメージをそのまま使えます.

- CUIで行う場合
```df```コマンドで確認するとSDcardが確認できると思います.（環境によって変わる) *表示したディスクはフォーマットされていません.

```Bash:ddの結果(抜粋)
Filesystem    512-blocks      Used Available Capacity iused               ifree %iused  Mounted on
/dev/disk2s1    60544960  27862400  32682560    47%  435350              510665   46%   /Volumes/UNKNOWN
```
フォーマット後にSDcardをアンマウント.

```Bash:Example
sudo umount disk2s1
```

イメージを解凍する.

```Bash:Example
unxz ubuntu-18.04.1-preinstalled-server-armhf+raspi2.img.xz
```

イメージを書き込む.
<font color=Red > 注意: ofに設定するものを間違えると大変なことになるので慎重に行ってください.

```Bash:Example
sudo dd bs=4m if=ubuntu-18.04.1-preinstalled-server-armhf+raspi2.img of=/dev/rdisk2
```
Ubuntuなどで行う場合は、```bs=4m```を```bs=4M```にしてください

## 3.system-bootの書き換え
イメージを書き込むとsystem-bootと言う名前でSDcardがマウントされると思います.
このままではRaspberry Piでブートすると問題が発生するので、ファームウエアを書き換える必要があります.

まずファームウエアを[ダウンロード](https://github.com/raspberrypi/firmware/archive/master.zip)します.

```
git clone https://github.com/raspberrypi/firmware.git
```
次にsystem-boot内にあるconfig.txtを編集します.

```Bash:config.txt
kernel=uboot.bin
device_tree_address=0x02000000
```
となっている部分を

```Bash:config.txt
kernel=vmlinuz
initramfs initrd.img followkernel
#kernel=uboot.bin
#device_tree_address=0x02000000
```
に書き換える

先ほどダウンロードしたfirmwareの中にあるbootディレクトリ以下を全てsystem-bootに入れる.

```Bash
cp -r firmware/boot/* /Volume/system-boot/
```
これでsystem-bootの書き換えは終わりになります.

## 4.Raspberry Pi 3 Model Bで起動する
なぜRaspberry Pi 3 Model B PlusではなくRaspberry Pi 3 Model Bでブートするのかというと、先ほどの書き換えだけでは、DHCPがIPを振ってくれないため、起動した際にログインまでたどり着きません.
なのでRaspberry Pi 3 Model Bで一度起動し、サービスを無効にする必要があります.

もしRaspberry Pi 3 Model Bが手元にない場合は、UbuntuなどでSDcardをマウントすると```cloudimg-rootfs```というパーティションが見えるようになるので以下で行う内容を手動で行えば問題ありません.


Raspberry Pi 3 Model Bで先ほどのSDcardを挿して起動します.
<font color=Red > 注意: 有線LANとキーボードとモニターを接続. </font>
起動後のデフォルトusernameとpasswordはubuntuです. パスワードの変更を求められるので変更してください.
ログイン後、以下のコマンドを実行.

```Bash
systemctl disable systemd-networkd-wait-online.service
systemctl mask systemd-networkd-wait-online.service
```

以上でRaspberry Pi 3 Mode B内での作業は終了です.

## 5.Raspberry Pi 3 Model B Plusで起動する
ログイン後、eth0にIPを振る.

```Bash
sudo dhclient eth0
```

Raspberry Pi 3 Model B Plusのモデル名を調べる.

```Bash
cat /proc/device-tree/model
```
モデル名を追記します 以下は今回の場合.

```Bash:/usr/share/flash-kernel/db/all.db
Machine: BCM2710
Machine: Raspberry Pi 3 Model B Plus Rev 1.3
DTB-Id: bcm2710-rpi-3-b-plus.dtb
U-Boot-Script-Name: bootscr.rpi3
Required-Packages: u-boot-tools
Boot-DTB-Path: /boot/firmware/bcm2710-rpi-3-b-plus.dtb
Boot-Kernel-Path: /boot/firmware/vmlinuz
Boot-Initrd-Path: /boot/firmware/initrd.img
Boot-Script-Path: /boot/firmware/boot.scr
```

GPUのファームウエアを置き換える.

```Bash
wget http://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/raspberrypi-bootloader_1.20180417-1_armhf.deb
dpkg-deb -x raspberrypi-bootloader_1.20180417-1_armhf.deb /tmp/pi-bootloader
sudo apt remove linux-firmware-raspi2
sudo cp /tmp/pi-bootloader/boot/* /boot/firmware/
```

Wifiのファームウエアを置き換える.

```Bash
wget https://github.com/RPI-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.bin
wget https://github.com/RPI-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.clm_blob
wget https://github.com/RPI-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.txt
sudo cp *sdio* /lib/firmware/brcm
```

デスクトップをインストールします.

```Bash
sudo apt update
sudo apt install ubuntu-desktop
```

以上でデスクトップのインストールは終了です.

#オプション
## 1.ネットワーク有線LANに自動でIPが振られるようにする
上記の状態では、起動毎に```sudo dhclient eth0```を実行しなければIPが振られないため自動に振られるようにする.
```/etc/network/interfaces```に以下の内容を追記します.

```Bash:/etc/network/interfaces
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
```
そして```ifupdown```をインストールする.

```Bash
sudo apt install ifupdown
```
これで再起動した際にも自動でeth0にIPが振られるようになったと思います.
もし静的IPを振る場合は、```/etc/network/interface```にstatic ipを追加し```resolvconf```をインストールしてください.