Crouton で Ubuntu 18.04 LTS をインストールする


## 概要

Chromebook でウェブアプリの開発ツールを使えるようにするため、Crouton および Ubuntu 18.04 LTS (Bionic Beaver) をインストールしました。Crouton は OS 仮想化のために chroot を使っています。

## 検証機種

Acer Chromebook R13 で検証しました。CPU は ARM 系の MediaTek MT8173C、メモリは 4GB、ストレージは 32GB です。日本支社では正式販売されていないので、米国の Amazon で購入しましたが、底面に技適マークが記載されています。液晶ディスプレイはフル HD で IPS です。タッチパネル対応の 2in1 でタブレットやテント型にして使うことができます。キーボードにはバックライトはついていません。

私が R13 を購入した理由の1つは Intel 系 CPU よりも ARM 系 CPU のほうが Android アプリの互換性がよいのではないかという期待です。

Acer Chromebook R13 以外で検討したのは ASUS Chromebook Flip C302CA です。C302CA は Intel の CPU およびバックライトつきキーボードを搭載しています。C302CA は ASUS の日本支社で正式販売されており、ビックカメラの池袋店や ASUS の赤坂直営店など都心の店舗で展示販売されています。

## 選択肢の検討
### ストレージ容量の上限

Chromebook を開発マシンとして選ぶ場合、検討する必要がある事項はストレージ容量の上限です。さまざまなツールをインストールすると容量不足に陥る可能性があります。

市販されている Chromebook の多くのストレージ容量は 16GB もしくは 32GB で、64GB 搭載モデルは少数です。日本で人気のある ASUS C302CA の 64GB 版は米国の Amazon で販売されています。

Google Pixelbook の最大ストレージ容量は 512GB です。技適マークがないので、日本国内で会社の開発マシンとして使うのであれば企業コンプライアンスの問題になります。ちなみにビットコインのフルノードを運用する場合、メインネットのブロックチェーンを保存するために約 200GB のストレージが必要になります。

Google Pixelbook のほかの問題は価格が高いことです。一番安いモデルで1000ドル前後です。1000ドル以上の予算があれば、米国の Amazon で GeForce GTX 1060 を搭載する VR Ready の Windows マシンを購入できます。

別の選択肢は USB 3.0 以降をサポートする機種を選ぶことです。USB 3.0 の最大速度は 5Gbps で SATA III の 6.0 Gbps に近い速度です。USB 3.1 Gen 2 は 10Gbps、USB 3.2 Gen 2x2 は 20Gpbs で、SATA III の速度を超えます。Thunderbolt 3 は 40Gbps です。Thunderbolt 3 のプロトコルは2018年内に公開され、ロイヤルティフリーで利用できる予定です。

そのほかの選択肢として比較的古い Chromebook のストレージを SSD に換装する方法があります。換装可能な機種は YouTube の作業動画で調べることができます。ただし、機種が限定される上に Chromebook のサポート期間が短い問題があります。

さらに別の選択肢として CloudReady を利用して普通の PC/Mac に Chrome OS をインストールする方法が挙げられます。動作が確認されている機種は公式サイトの[リスト](https://guide.neverware.com/supported-devices/)で確認することができます。

### chromebrew との使いわけ

chromebrew はパッケージマネージャーで macOS の homebrew と似たようなツールです。Crouton よりも消費するストレージは少なくてすみます。Python 3 や Go などで書いたプログラムをちょっと試すのに便利です。たとえば、Go の対話式プログラムの gore を導入する場合、次のコマンドを入力します。

```bash
crew install go
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
go get -u github.com/motemen/gore
```

一方でプロジェクトの規模が小さいので、サポートされないパッケージがあったり、プログラミング言語のバージョンが最新ではないことがあります。私が Crouton を導入したきっかけは Node.js が動かなかったことです。

### Linux ネイティブサポート

2018年5月に開催された Google I/O で将来の Chrome OS で Linux が利用できるようになることが発表されました。Android Studio や Visual Studio Code などの統合開発環境が動くようになるとのことです。5月の時点で Pixelbook で試すことができるようになっています。将来において Chromebook のために設計された Linux 仮想マシンが動かすことが計画されています。

## 仮想マシン
### デベロッパーモードでの起動
シェルを利用するための前提条件は Chromebook をデベロッパーモードで起動していることです。デベロッパーモードに切り替えるには電源を切った状態から `Esc`+`F3` (リフレッシュボタン) を押しながら電源ボタンを押して起動させた上でいくつかの手順を進めます。その際にローカルデータはすべて削除されます。

特に変わったことをしていなければ sudo のパスワードは設定されず、sudo を実行する際にパスワードは要求されません。

デベロッパーモードが有効な状態では電源をつけるたびに「OSの確認機能はオフになっています」というメッセージが表示されるので、`Ctrl` + `d` を同時に押して OS を起動させます。

### シェルの起動
シェルを起動させるには `Ctrl` + `Alt` + `t` のキーを押し、crosh を起動させた後で `shell` コマンドを実行します。

### OS のインストール

`https://goo.gl/fd3zc` のリンクをクリックして `crouton` という名前のファイルをダウンロードします。シェルを起動させた上で次のコマンドを実行します。

```bash
sudo sh ~/Downloads/crouton -r bionic -t core
```

パッケージのインストールが終わった後、ユーザー名とパスワードの設定が求められます。

### 仮想 OS の起動とシャットダウン

`enter-chroot` を実行します。

```bash
sudo enter-chroot
```

仮想マシンのシェルで `exit`を実行すれば自動的に OS はシャットダウンします。

### apt と apt-get

Ubuntu の最近のバージョンでは `apt-get` の代わりに `apt` を使うことができます。ただし Ubuntu の古いバージョンを考慮してほとんどのチュートリアルでは `apt-get` を使い続けています。

```bash
sudo apt update
```

### curl のインストール

開発ツールの導入スクリプトのために curl をインストールします。

```bash
sudo apt install curl
```

curl のバージョンを調べると HTTP/2 のためのライブラリである nghttp2 がサポートされていることが確認できます。

```bash
curl --version
```

### micro エディタのインストール

普段はシェルで設定ファイル（.bashrc、.bash_profile）を編集するために nano を使っているのですが、R13 では起動させても画面が激しく点滅して正常に使うことができなかったので、Go で開発された micro を導入することにしました。

**2018年10月10日追記**
設定ファイルを開いて画面が激しく点滅している状態で下向きの矢印でカーソルを移動させると点滅は収まり、正常に編集できるようになります。

配布されている micro のバイナリファイルが正常に動かないので、ソースコードからビルドすることになりました。

最初に Go に関する環境変数を追加します。

```bash
export GOPATH=$HOME/go
export PATH="$PATH:$GOPATH/bin"
```

次に PPA から Go の最新バージョンをインストールします。

```bash
sudo add-apt-repository ppa:gophers/archive
sudo apt update
sudo apt install golang-1.10-go
```

Go がインストールされているか確認してみましょう。```

```bash
/usr/lib/go-1.10/bin/go version
```

PATH もしくはエイリアスを追加します。

```bash
export PATH="$PATH:/usr/lib/go-1.10/bin"
```

次に micro をインストールします。

```bash
go get -d github.com/zyedidia/micro/cmd/micro
cd $GOPATH/src/github.com/zyedidia/micro
make install
```

micro を起動させてみます。

```bash
micro test.txt
```

プログラムを終了させるには `Ctrl` + `q` を押します。


### nvm (Node Version Manager) のインストール

大手のクラウドサービスの開発ツールを導入する場合、Node.js が要求されることがあります。Node.js は定期的に新しいバージョンがリリースされるので、 バージョンの切り替えをしやすくするためにバージョンマネージャーを導入しました。

```bash
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
```

インストールが終わった後、一旦 Ubuntu のシェルを抜け出して、再度ログインして次のコマンドを実行して nvm が使えるか確認します。

```bash
nvm
```
次に最新のバージョンをインストールします。

```bash
nvm install node
```
nvm 以外に nvs も試しましたが、インストールの段階でうまくゆきませんでした。