ChromebookのLinux環境を整える（Crouton + Ubuntu20.04 + Chromebrew + Sommelier）

# ChromebookのLinux環境について

ChromebookにLinux環境を整える方法は以下の通りです。

+ **Crostini**
    + 公式のLinux環境作成機能
    + KVMとLXCを使用し、DebianやArch Linux、CentOS等を起動できる
    + Sommelierというウィンドウマネージャを使ってGUIアプリを表示する
    + 仮想マシン + コンテナなので動作が重い
    + Chromebookのハードウェアの使用に制限がある
    + デベロッパーモード不要
+ **Crouton**
    + 非公式のLinux環境作成スクリプト
    + chrootを使用し、Ubuntu、Debian、Kali Linuxを起動できる
    + xiwiというChrome拡張機能を使ってGUIアプリを表示する
    + xorgを使ってChrome OSと切り離されたGUI表示を行うことも可能
    + Chromebookに接続したUSB機器に直接アクセスできる
    + デベロッパーモード必要
+ **Chromebrew**
    + 非公式のChrome OS用パッケージマネージャ
    + 他のLinuxディストリビューションを入れる訳ではなく、Chrome OSに直接パッケージをインストールする
    + Sommelierというウィンドウマネージャを使ってGUIアプリを表示する
    + デベロッパーモード必要

たぶんこんな感じ。
他には**Chrx**を使ってデュアルブート環境を作成する方法もありますが、割愛します。
動作の軽さですが、体感は以下の通りです。
`Chromebrew >= Crouton(xorg) >>> Crostini > Crouton(xiwi)`

今回は**Crouton**に**Chromebrew**を使って**Sommelier**をインストールし、GUIアプリを表示出来るようにしたいと思います。
（バージョン: 83.0.4103.77（Official Build）beta （64 ビット）にて確認）


# デベロッパーモードへの切り替え
`ESC + F3 + 電源キー`を同時押しし、リカバリモードを起動します。
リカバリ画面にて`Ctrl + D`を押下し、画面表示にしたがって`Enter`押下等すればデベロッパーモードに切り替わります。
この際Chromebookが初期化されるので注意してください。


# Croutonコマンドをインストール
[dnschneid/crouton](https://github.com/dnschneid/crouton)に従い[https://goo.gl/fd3zc](https://goo.gl/fd3zc)にアクセスし、ファイル「crouton」をダウンロードフォルダにダウンロードします。
`Ctrl + Alt + T`を押下し、croshを開きます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/cb72d269-9c15-42ea-5bcf-af55e30cf49b.png)
`shell`コマンドを実行し、bashを起動します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/bb856d3e-09fe-ae4c-bb97-2b2f2a75e7b8.png)

``` sh
sudo install -Dt /usr/local/bin -m 755 ~/Downloads/crouton
```
を実行し、croutonコマンドをインストールします。
これでcroutonコマンドが使用可能になりました。


# Croutonコマンドを使ってUbuntu20.04をインストール
インストールするのはfocal(Ubuntu20.04)ですが、とりあえずbionic(Ubuntu18.04)用の「[3 Steps to Install Bionic Beaver · dnschneid/crouton Wiki](https://github.com/dnschneid/crouton/wiki/3-Steps-to-Install-Bionic-Beaver)」に従います。
まず、下記コマンドを実行します（10分程ダウンロード/インストールが行われます）。

``` sh
sudo crouton -r focal -t core,audio,cli-extra
```
完了したら

``` sh
sudo enter-chroot
```
にてLinux環境に入ります。

``` sh
sudo apt install xterm xinit
```
を実行し、完了したら`Ctrl + D`か`exit`を実行しLinux環境を抜けます。
残りのcroutonで入れたいターゲットを、下記コマンドでインストールします（-uオプションで既存の環境を更新）。

``` sh
sudo crouton -r focal -t audio,chrome,cli-extra,extension,keyboard,touch,x11,xiwi,xorg -u
```


# Ubuntu20.04 + xiwiでGUIアプリを表示する
Sommelierをインストールする前に、一旦xiwiでGUI表示できるか確認します。
まず[crouton integration - Chrome ウェブストア](https://chrome.google.com/webstore/detail/crouton-integration/gcpneefbbnfalgjniomfjknbcgkbijom)をChromeにインストールします。

```
sudo enter-chroot
```
にてLinux環境に入ります。
GUIを持つLinuxアプリを、何でも良いですが今回は**gvim**をインストールします。

```
sudo apt install vim-gtk3
```
インストールできたら

```
xiwi gvim
```
を実行し、Chrome OS上にgvimがウィンドウ表示出来ることを確認します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/33a033c6-8492-8865-1fab-8dbaeebf467c.png)
（ツールバーの表示がおかしいですが、スクショ以外では正常でした。）


# Ubuntu20.04にChromebrewをインストール
SommelierをインストールするためにChromebrewをインストールします。（[Chromebrewを使わない方法](https://github.com/dnschneid/crouton/wiki/Sommelier-(A-more-native-alternative-to-xiwi))もあるようですが、動作しませんでした。）
[skycocker/chromebrew](https://github.com/skycocker/chromebrew)に従い下記コマンドを実行します。

``` sh
sudo apt install curl
curl -Ls git.io/vddgY | bash
```
`crew`コマンドのインストールは成功すると思いますが、`crew`を実行すると下記のエラーを吐きます。

```
/usr/local/lib64/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require': libcrypto.so.1.0.0: cannot open shared object file: No such file or directory - /usr/local/lib64/ruby/2.7.0/x86_64-linux-gnu/digest/sha2.so (LoadError)
```
下記みたいな感じで適当に対処します。

``` sh
cd /usr/local/lib64/
ln -s libcrypto.so libcrypto.so.1.0.0
```
`crew`コマンドが使えるようになったと思います。


# ChromebrewでSommelierをインストールし、GUIアプリを表示する

下記インストールコマンドを実行し**Sommelier**をインストールします。

``` sh
crew install sommelier
```
インストール完了時に下記の指示がありますので、適当に従います。

``` sh
To complete the installation, execute the following:
echo '# Sommelier environment variables + daemon' >> ~/.bashrc
echo '# See https://github.com/dnschneid/crouton/wiki/Sommelier-(A-more-native-alternative-to-xiwi)' >> ~/.bashrc
echo 'if [ ! -d /tmp/.X11-unix ]; then' >> ~/.bashrc
echo 'mkdir /tmp/.X11-unix' >> ~/.bashrc
echo 'fi' >> ~/.bashrc
echo 'sudo chmod -R 1777 /tmp/.X11-unix' >> ~/.bashrc
echo 'sudo chown root:root /tmp/.X11-unix' >> ~/.bashrc
echo 'alias startsommelier="set -a && source ~/.sommelier.env && set +a && initsommelier"' >> ~/.bashrc
echo 'startsommelier' >> ~/.bashrc
source ~/.bashrc

To start the sommelier daemon, run 'startsommelier'
To stop the sommelier daemon, run 'stopsommelier'
To adjust environment variables, edit ~/.sommelier.env
You may need to adjust the SCALE environment variable to get the correct screen size.
Please be aware that gui applications may not work without the sommelier daemon running.
If you are upgrading from an earlier version of sommelier, run
'stopsommelier && startsommelier' or logout and login again.
```

sommelier.envは自動作成してくれなかったので、下記の内容で作成します。
（Chrome OS側にてChromebrewを使いSommelierをインストールした際に作成されたもの）

``` :~/sommelier.env
GDK_BACKEND=x11
CLUTTER_BACKEND=wayland
XDG_RUNTIME_DIR=/var/run/chrome
WAYLAND_DISPLAY=wayland-0
DISPLAY=:0
SCALE=1
```
また、ターミナルを開くたびにパスワード入力するのも面倒なので、以下の通りGUIを使いたい時だけ`startsommelier`を実行し起動する感じにしました。

``` sh:~/.bashrc
# Sommelier environment variables + daemon
# See https://github.com/dnschneid/crouton/wiki/Sommelier-(A-more-native-alternative-to-xiwi)
if [ ! -d /tmp/.X11-unix ]
then
    mkdir /tmp/.X11-unix
fi
#sudo chmod -R 1777 /tmp/.X11-unix
#sudo chown root:root /tmp/.X11-unix
alias startsommelier="sudo chmod -R 1777 /tmp/.X11-unix && sudo chown root:root /tmp/.X11-unix && set -a && source ~/.sommelier.env && set +a && initsommelier"
#startsommelier
```

これで`startsommelier`を実行すると、下記のエラーを吐きます。

```
sommelier: error while loading shared libraries: libxcb-composite.so.0: cannot open shared object file: No such file or directory
```
aptでlibxcb-composite0をインストールして対処します。

``` sh
sudo apt install libxcb-composite0
```
`/usr/lib/x86_64-linux-gnu/libxcb-composite.so.0`が作成されてエラー解消されたのだと思います。
これで`startsommelier`を実行すると、下記のエラーを吐きます。（しつこい）

``` sh
/usr/local/bin/Xwayland: error while loading shared libraries: libffi.so.6: cannot open shared object file: No such file or directory
```
適当に対処します。

``` sh
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libffi.so.7 libffi.so.6
```
これで`startsommelier`で**Sommelier**が起動できるようになりました。（以下の通り文句を言われておりますが、スルーします。）

```
Warning: Unknown scale factor: 1429
Warning: Unknown scale factor: 1176
Warning: Unknown scale factor: 1111
Warning: Unknown scale factor: 1053
Warning: Unknown scale factor: 909
Warning: Unknown scale factor: 833
Warning: Unknown scale factor: 769
The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning:          Unsupported maximum keycode 569, clipping.
>                   X11 cannot support keycodes above 255.
> Internal error:   Could not resolve keysym Invalid
> Internal error:   Could not resolve keysym Invalid
> Error:            Key <CAPS> added to map for multiple modifiers
>                   Using Mod3, ignoring Lock.
Errors from xkbcomp are not fatal to the X server
sommelier process 22829 is running
```

**Sommelier**が起動している状態で`gvim`を実行し、Chrome OS上に**gvim**がウィンドウ表示出来ることを確認します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/7ee90feb-a937-5b99-328b-72277a45e10e.png)

以上、CrostiniやCrouton(xiwi)より軽いLinuxGUIアプリ実行環境が作成できました。