Raspberry Pi 4でUbuntuデスクトップを動かして遊ぶ

# はじめに

Raspberry Piはこれまでにも少し触ったことがありましたが，Raspberry Pi 4になってRAMが4GBになり，さらに秋ころにUbuntuデスクトップが正式対応されたと聞いたので，単純に動かして遊んでみたときのメモです．

# やってみたこと

基本はRaspberry Pi 4上でUbuntuデスクトップ（GNOME 3）を動かしてみただけです．あとはリモート操作できるようにや，ちょっとしたプログラミング環境を作ってみました．

* Ubuntu Desktop 20.10をインストールして動かす
* ChromiumをインストールしてYouTubeを見てみる
* リモート接続環境のセットアップ（SSH，VNC）
* Visual Studio Codeをインストールして動かす
* PythonでHello world
* GoでHello world（Windowsでクロスコンパイルしてラズパイで動かす）

# 準備したもの

* Raspberry Pi 4 4GB（スターターキット）
* タッチディスプレイ 7インチ
* キーボード・マウス
* スピーカー

Raspberry Pi 4はRAM4GBのものを使いました．本体の他にケース・ヒートシンク・ファン・電源アダプタ・MicroSDカード・MicroHDMI-to-HDMIケーブルがセットになっているスターターキットを買うと楽でいいかもしれません．ラズパイ本体には電源ボタンがないのでON/OFFスイッチの付いた電源アダプタがあると便利です．microSDカードは64GBのものを使用しました．
またせっかくデスクトップ環境を動かすのでディスプレイも用意しました．ラズパイ向けで7インチくらいのタッチ対応のディスプレイがいろいろとあるので，安いものを選んで購入しました．小さい画面にほんとにGNOMEの画面が表示されるのはそれだけでも楽しいです．
その他，USB接続のキーボード・マウスを用意します．今回は雰囲気を出すためにRaspberry Piオフィシャルのキーボード・マウスを購入しました．おなじみの赤/白のカラーリングでかわいくてよいです．
あとYouTubeを見てみたかったので，イヤホンジャック接続の小型スピーカーを用意しました．

今回は普通のRaspberry Pi 4を使いましたが，キーボード一体型になっているRaspberry Pi 400もあります．

# OSイメージの作成

以前はOSイメージをddやEtcherを使ってSDカードに書き込んだり，NOOBSを使ってSDカードを準備していましたが，今はRaspberry Pi Imagerというソフトウェアが公式で用意されています．
今回は通常のRaspberry Pi OS（Raspbian）でなくUbuntuデスクトップを使用するのですが，UbuntuもRaspberry Pi Imagerを使ってSDカードに書き込むことができます．WindowsでRaspberry Pi Imagerを使ってOSイメージのSDカードを作成しました．
[https://www.raspberrypi.org/software/](https://www.raspberrypi.org/software/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/d0bd6b46-42bd-7267-27c5-2d9ffe62f486.png)
`Operationg System`で書き込むOSを設定します．`Other general purpose OS`から`Ubuntu Desktop 20.10 (RPi 4/400)`を選択します．またここで`Erase`を選択するとSDカードのフォーマットを行うこともできます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/731ca3d2-ad04-67f9-dced-c59bbcfdc4ed.png)
次に`SD Card`で書き込むmicroSDカードを選択します．（お間違いのないように！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/40ca9136-af3b-3d92-d3e0-3e9e464a9e01.png)
最後に`WRITE`ボタンを押すとSDカードへの書き込みが開始されます．しばらく待ちましょう．
書き込みが終わるとOSイメージのSDカード作成は完了です．

# Ubuntu Desktop 20.10のセットアップ

microSDカードをRaspberry Pi 4本体に挿し，その他にキーボード・マウス，ディプレイを接続して電源を入れると，初期設定がはじまります．ディスプレイはmicro-HDMIポートが2つありますが，USB Type-C側のHDMI0に繋げるとよさそうです．
手順にそって言語設定・キーボード設定・Wi-Fi設定・地域の設定・ユーザ設定を行うと初期設定が完了します．
ログインすると，おなじみのGNOME 3のデスクトップが表示されます！サングラスがラズパイ仕様になっているようですね．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/156494ad-ccb6-8a91-3bcb-2b4b48e4d369.png)
まずはターミナルを立ち上げてパッケージの更新をしておきます．

```console
$ sudo apt update && sudo apt upgrade -y
```

## 日本語化の設定

起動した直後だと表記が日本語化されていません．デスクトップ上の何もないところを右クリックして`Settings`を選択します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/9fde00e7-486b-439d-90fb-273c935c8048.png)
`Region ＆ Language`から`Manage Installed Languages`を選択すると「言語サポートが完全にはインストールされていません」と出るので，そこからインストールを行います．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/345bc371-2697-96a4-afb5-75354a1b99a9.png)
インストールが完了してから再起動すると表記が日本語に変わっています．

## 画面表示の設定

今回は7インチと小さいディスプレイを使っているので，画面を少しでも広く使うためにDockを自動的に隠す設定にします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/41b1a6d4-3305-7409-7e85-e20c78bf14ee.png)
またディスプレイにアイコンを表示するのが好みでないので，Tweak Toolを使って非表示に設定します．

```console
$ sudo apt install gnome-tweak-tool
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/ecaf0a29-c442-3a3c-c541-984938b9de9f.png)

# ChromiumでYouTubeを見る

UbuntuにはブラウザはデフォルトでFirefoxがインストールされていますが，ここではChromiumをインストールして使ってみます．Chromiumはaptでインストールできます．

```console
$ sudo apt install chromium-browser
```

ChromiumでYouTubeのサイトを開いてみました．サムネイルが表示しきるまで多少のもたつきはありますが，それほど待たされることなく表示されるかと思います．また動画をフルスクリーンで再生しても特に問題なく表示されました．十分使えるかなと感じます．これはすごい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/572eefa5-489f-42bb-2ee8-8a8c88700cf7.png)
音声はラズパイ本体のイヤホンジャックにスピーカーを挿せば出力されました．ただし安いスピーカーでは音量が小さかったので，次の設定で音量を上げています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/39039758-aee6-9a47-c674-f7f55ba860cf.png)

# リモート接続のセットアップ

ここまではディスプレイやキーボード・マウスをRaspberry Piに接続して操作していましたが，リモート接続を行えるようにしておくと開発やちょっとした操作などに便利です．

## SSHの設定

下記のコマンドでOpenSSHをインストールすればOKです．インストール後SSHサーバが起動しています．

```console
$ sudo apt install openssh-server
$ sudo systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-12-30 13:19:15 JST; 28min ago
```

これでSSHで接続することができます．

```console
$ ssh tsutsu@192.168.1.8
tsutsu@192.168.1.8's password:
Welcome to Ubuntu 20.10 (GNU/Linux 5.8.0-1010-raspi aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 updates can be installed immediately.
0 of these updates are security updates.

Last login: Wed Dec 30 17:42:29 2020 from 192.168.1.7
```

## VNCの設定

設定画面の中から`共有`を選択して`画面共有`をアクティブにします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/9cada72e-206c-f4d4-9081-f76991e3d832.png)
これでVNC接続できるようになりますが，WindowsのVNCクライアント（今回はVNC Viewerを使用）から接続するとエラーが出て接続できません．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/9262fa2a-6187-6686-51fb-818d3684887d.png)
この場合は`dconf-editor`で下記の設定を行い解決することができます．dconf-editorはaptでインストールできます．

```console
$ sudo apt install dconf-editor
```

`org/gnome/desktop/remote-access/require-encryption`をOFFにします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/dca7f97f-e3fe-5675-a624-932db6a70e30.png)
またRaspberry Piにディスプレイを接続していない状態でVNC接続するには，ダミーのグラフィックドライバをインストールしておく必要があります．

```console
$ sudo apt install xserver-xorg-video-dummy
```
VNC接続する画面の表示設定をファイルに保存します．

```console
$ sudo vi /usr/share/X11/xorg.conf.d/80-dummy.conf
```

```text:80-dummy.conf
Section "Device"
    Identifier  "Configured Video Device"
    Driver      "dummy"
    VideoRam 256000
EndSection

Section "Monitor"
    Identifier  "Configured Monitor"
    HorizSync 5.0 - 1000.0
    VertRefresh 5.0 - 200.0
    # 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz
    Modeline "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
EndSection

Section "Screen"
    Identifier  "Default Screen"
    Monitor     "Configured Monitor"
    Device      "Configured Video Device"
    DefaultDepth 24
    SubSection "Display"
        Depth 24
        Modes "1920x1080"
    EndSubSection
EndSection

Section "InputClass"
    Identifier "system-keyboard"
    MatchIsKeyboard "on"
    Option "XkbLayout" "jp,us"
    Option "XkbModel" "jp106"
    Option "XkbVariant" ",dvorak"
    Option "XkbOptions" "grp:alt_shift_toggle"
EndSection
```

`Modeline`の設定は`cvt`コマンドで確認できます．

```console
$ cvt 1920 1080
# 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz
Modeline "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
```

電源投入後は一度デスクトップでログインをしないとVNCでログインができないので，自動ログインを有効にしておくと便利です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/afd452d9-368f-e577-c112-0740dc63a054.png)
VNC関連は下記を参考にしました．
[http://rarak.jp/16022](http://rarak.jp/16022)
[https://kokufu.blogspot.com/2018/02/ubuntu-vino.html](https://kokufu.blogspot.com/2018/02/ubuntu-vino.html)

# Visual Studio Codeのインストール

Visual Studio CodeにはARM版も公開されているので，Raspberry Pi上でインストールして動かしてみます．
インストールは下記ページから`ARM 64`の.debファイルをダウンロードしてインストールします．
[https://code.visualstudio.com/download](https://code.visualstudio.com/download)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/d23ecf94-e158-16a9-b95c-67e5e4f01670.png)

```console
$ sudo apt install libxss1
$ sudo dpkg -i code_1.52.1-1608136325_arm64.deb
```

問題なく起動して使えそうです．Visual Studio Codeはリモート機能もありますが，このようにRaspberry Pi上で直接動かすこともできます．これもすごい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/2490f089-4fee-1983-0d21-129d8e9b81cf.png)

# PythonでHello world！

Raspberry Pi上で簡単なプログラミングを動かしてみます．
UbuntuにはPython3の環境がもともとインストールされているようでしたが，ここではpyenvを使って最新バージョンのPythonをインストールして動かしてみます．

```console
$ sudo apt install -y libsqlite3-dev libreadline-dev libgdbm-dev zlib1g-dev libbz2-dev sqlite3 tk-dev zip libssl-dev libffi-dev git
$ git clone https://github.com/yyuu/pyenv.git $HOME/.pyenv
$ export PYENV_ROOT=$HOME/.pyenv
$ export PATH=$PYENV_ROOT/bin:$PATH
$ eval "$(pyenv init -)"
$ pyenv install 3.9.1
$ pyenv global 3.9.1
```

```console
$ python
Python 3.9.1 (default, Dec 30 2020, 15:30:40)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello, world!')
Hello, world!
```

pyenvでのPythonも問題なく動かせました．これで任意のバージョンのPythonを使っていくこともできそうです．

# GoでHello world！

今度はGoを使ってHello worldを動かしてみます．ただし今度は，Windows上でクロスコンパイルしたものをRaspberry Piで動かすのを試してみます．
今回使用したGoのバージョンはこちらです．

```console
$ go version
go version go1.15.5 windows/amd64
```

お試しのHello worldのソースコードはこちら．

```go:main.go
package main

import "fmt"

func main() {
	fmt.Println("Hello, world!")
}
```

クロスコンパイルは次のページを参考に環境変数を設定してビルドします．
[https://golang.org/doc/install/source#environment](https://golang.org/doc/install/source#environment)

```console
$ set GOOS=linux
$ set GOARCH=arm64
$ set GOARM=7
$ go build -o hello main.go
```

ビルドして生成した`hello`ファイルをscpでRaspberry Piに転送し，Raspberry Pi上で実行します．実行するときには実行権限をつけてあげます．

```console
$ chmod a+x hello
$ ./hello
Hello, world!
```

しっかりと実行することができました．Goはクロスコンパイルが手軽に行えるのとシングルバイナリで動かすことができるので便利です．

# おまけでRustでHello world！

Rustでもクロスコンパイルを試してみたので，簡単にメモです．今回は`cross`というコマンドを使った方法です．

```console
$ cargo init .
$ cargo run  # cargo initでHello world!のコードが生成されるので，今回はそれをそのまま利用
   Compiling hellors v0.1.0 (/tmp/hellors)
    Finished dev [unoptimized + debuginfo] target(s) in 0.33s
     Running `target/debug/hellors`
Hello, world!
$ cargo install cross
$ rustup target list  # 対象の環境を一覧
aarch64-apple-ios
aarch64-fuchsia
aarch64-linux-android
aarch64-pc-windows-msvc
aarch64-unknown-linux-gnu
:
$ cross build --release --target aarch64-unknown-linux-gnu
```

こちらも生成した実行バイナリをscpで転送して，Raspberry Pi上でしっかりと実行できました．

```console
$ chmod a+x hellors  # 実行権限がなければ追加
$ ./hellors
Hello, world!
```

# おわりに

目標どおりにRaspberry Pi 4にUbuntuデスクトップをセットアップして，普通のパソコンのような感覚でYouTubeを視聴することができました．手のひらサイズのラズパイでここまでしっかりと動くのは驚きですし，これだけでも触っていて楽しいです．
またリモート接続も簡単にセットアップできるので，部屋の隅のほうでラズパイ本体だけを電源つけっぱなしにするような運用でも，操作を手軽に行うことができそうです．
また開発環境としても，Visual Studio Codeが動いてしまうのにもびっくりです．今回はPythonとGoを試してみましたが，他にもいろいろ動かしてみたいですね．