Chromebookでできること -Crostiniを用いた開発環境の構築手順-

拙い技術力，文章力ゆえに必ずしも本稿で記す内容がベストプラクティスとは言えないが
筆者がChromebookを使いこなすために行った設定や作業についてまとめる．

# 本記事の内容

- Chromebookで日本語に対応したLinux環境を構築する
- パフォーマンスや使用感を改善し，Chrome OS側のアプリケーションに近い使用感にする

# Chromebookってどうなの？

最近ChromebookのCMが放送されたのを見て，興味を惹かれつつ常用に耐えるのか不安に思い購入をためらっている人も多いのではないか．

確かに過去のChromebookはネットサーフィン以外の用途に使うことは困難であった．
筆者が2015年に購入した[C100PA](https://www.asus.com/jp/Laptops/ASUS_Chromebook_Flip_C100PA/)は，ARMプロセッサを搭載していたことと，当時はまともなLinux環境の構築ができなかったため，非常に使いにくいパソコンであった．

しかし，Chromebookが公式にサポートするCrostiniが開発されたことで
これらの問題は過去のものとなった．

ここではChrostiniを使いLinux環境を作る方法について説明する．

# Crostini

CrostiniとはChrome OS上でLinuxアプリケーションが使えるようにGoogleによってサポートされている機能である．
厳密にはChrome OS内でアプリケーションを走らせるのではなく，lxcという仮想環境ツール上でLinuxコンテナを動作させる形となっている．

lxcについて語りだすとそれだけで１つの記事になってしまうのでここでは簡単な説明に留める．
lxcとは，

- Linuxカーネルが起動しているホストマシン上で動作する
- ホストマシンのLinuxカーネル内でプロセスを分離する

システムであり，Dockerとはまた仕組みが異なっている．
筆者がここで付け焼き刃の知識を羅列するより，よくまとめられた記事を見たほうが
早くて正確なので，詳しくは以下のリンクを見てほしい．

[LXC(Wikipedia)](https://ja.wikipedia.org/wiki/LXC)
[Docker と LXC](https://qiita.com/Surgo/items/709a07d68c6eafbad267)

Chrome OSとうまく統合されており，使用感としてはネイティブのアプリケーションとほぼ変わらない．
しかし，仮想環境ゆえの制約も存在する．詳しくは後述する．
 
# 作業環境

- モデル:C403NA
- OS:Chrome OS 84.0 (Crostini: Debian Buster)

# 手順

## Chrome OSのアップデート

まずは，何はともあれChrome OSをアップデートしよう，

Chrome OSの設定（歯車アイコン）を開き，[Chrome OSについて]をクリックすると
[アップデートを確認]ボタンがある．初回のアップデートは時間がかかるので
コーヒーでも飲んで落ち着こう．

![step1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204952/9b80b726-2b41-6cdb-f21a-bb88fc6bbc49.png)

![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204952/9ff870ee-e717-0734-5a0c-6f4f61d2f8fe.png)

![step3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204952/36c6d99a-e052-773a-c5b8-54c650f346d2.png)

というのも，発売開始日が古いChromebookは，購入時のOSのバージョンが古いことがある．
この状態でLinuxコンテナを作ると，Debian stretchがインストールされてしまうのだ．

最新のChrome OSではちゃんとDebianのバージョンがbusterとなっている．

海外のフォーラムを見る限り，Linuxコンテナのバージョンもアップグレードしてくれる機能があるようだが
筆者の環境ではstretchのままだった．

頑張って作った環境をリセットするのは精神的に辛いので，同じ轍を踏まないよう
良い子の皆は注意してほしい．

## Linuxコンテナを作る

無事にアップデートが終わったら，早速Linuxコンテナを作ろう．

![step4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204952/5e6c86da-9c19-6a03-2960-600441576a31.png)

無事にコンテナが出来たら，「ターミナル」というアプリケーションが追加される．
このアプリケーションからLinuxの端末を開くことができるが，常用はおすすめしない．

「ターミナル」自体はChrome OS上で動く．これの何がだめかというと，Linux環境でインストールしたフォントが使えないのだ．そのため，PowerlineフォントやRictyDiminishedを使うことが出来ない．

なので，Linux環境で「Guake」や「Terminator」をインストールして使うのがおすすめである．
なんと，Linux環境でインストールされたアプリケーションはとくに設定をしなくても
使えてしまう．さらにはChrome OSのランチャーにも勝手に登録されるという至れり尽くせりな仕組みになっている．

もしもランチャーに登録されなければ一度

```
exec hogehoge
```

でアプリケーションを起動させれば解決するはず．


## Linux環境でも日本語入力したい!

残念ながら，いまのところLinux環境でChrome OSの日本語入力を使うことは出来ない．
そのため，Linux環境でfcitx-mozcをインストールする必要がある．

```
sudo apt install fcitx-mozc fcitx-config-common fcitx-frontend-all
```

でfcitxとmozcをインストールしよう．
次に，GUIアプリケーションでfcitxが使えるように設定をしよう．

```
sudo お好きなエディタ /etc/systemd/user/cros-garcon.service.d/cros-garcon-override.conf
```

ファイルの下に以下の設定を追記しよう．

```
Environment="GTK_IM_MODULE=fcitx"
Environment="QT_IM_MODULE=fcitx"
Environment="XMODIFIERS=@im=fcitx"
```

そしてホームディレクトリ直下に以下のファイルを作る

```
touch .sommelierrc
```

中にはこう書く．

```
/usr/bin/fcitx-autostart
```

mozcのカスタマイズがしたい人は

```
/usr/lib/mozc/mozc_tool --mode=config_dialog 
```

を実行しよう．Mozcの設定画面が起動する．

## Chrome OSのショートカットキーを有効にする

Chrome OSにもGUIアプリのサイズや場所を変える便利なショートカットキーがあるが
デフォルトの設定ではこれらの機能はLinux環境のアプリでは使えない．
次の２つのファイルのEnvironmentという項目を

```
/etc/systemd/user/sommelier-x@0.service.d/cros-sommelier-x-override.conf
/etc/systemd/user/sommelier@0.service.d/cros-sommelier-override.conf
```

```
Environment="SOMMELIER_ACCELERATORS=Super_L,<Alt>bracketleft,<Alt>bracketright,<Alt>minus,<Alt>equal,<Alt>1,<Alt>2,<Alt>3,<Alt>4,<Alt>5,<Alt>6,<Alt>7,<Alt>8,<Alt>9"
```

とすることで晴れてショートカットを使うことができる．
ただし，設定を有効にするにはLinux環境を再起動する必要がある．

「ターミナル」アプリを右クリックすると，"Linux（ベータ版）を終了"という項目がある．
これを選ぶと文字通りLinux環境そのものを終了することができる．

当然Linuxのアプリケーションがすべて落ちるので，作業は終了させておこう．

## パフォーマンスの向上

次に，必須ではないがLinuxアプリケーションのパフォーマンスが劇的に変わる設定を紹介する．

ChromeのURL欄に

```
chrome://flags/
```
と入力すると

![Screenshot 2020-08-11 at 23.57.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204952/da0aba13-5241-9e53-3f2d-54d5764886b6.png)


こんな感じの画面が開く．
その中の"Crostini GPU Support"というオプションをONにしよう．
Steamのゲーム等ではもっさり感が目に見えて軽減するはずだ．

# 注意事項

最近のChromebookは十分に開発用のマシンとして通用する仕上がりになっている．
しかし，当然ながらChromebook特有の問題も有る．人によっては死活問題となるような仕様もあるので
購入する前にこの項目を読んでほしい．

## ARMプロセッサが乗ったChromebookがある

Chromebookには，パソコンにしては珍しくARMプロセッサが乗ったモデルがある．
このようなモデルでは，当然DebianのARM向けのリポジトリが使用される．
ARM向けのリポジトリは，x86/x64向けのリポジトリに比べアプリケーションの種類が少ない．
特に理由がない限りは，できるだけx86/x64系のプロセッサが乗ったモデルを買おう．

## MicroSDカード上のファイルのパーミッション

安価なChromebookにはほぼ必ずついて回る問題が容量の乏しさである．
かく言う筆者のパソコンも内蔵ストレージは32GBしかない．

その代わり，ほとんどのChromebookにはMicroSDスロットが有る．
また，MicroSDカードのディレクトリをLinux環境で共有するオプションがあり
単純にファイルを保存するだけならそれほど困らない．

しかし，MicroSDカード上のファイルには実行権限を付与することは出来ない．
つまり，MicroSDカード上にシステムファイルを移したり，MicroSD上にアプリケーションを
ローカルインストールして容量を節約することができない．

容量がかさむLinuxアプリケーションをガンガン使いたい人は，ハイエンドなモデルを買うか，
普通のWindowsやMacOSが入ったパソコンを買おう．

## DNSサーバーが機能しない（かもしれない）

CrostiniでDNSサーバーが機能しない問題はよく有るようで，[Archlinuxのwiki](https://wiki.archlinux.jp/index.php/Crostini)に解決法が記載されている．

筆者の環境ではなぜかこれに従ってもDNSサーバによる名前解決は出来なかった．
普段ローカルDNSサーバーの恩恵にあずかっている人は，.ssh/configやブラウザのブックマークのドメインを
IPアドレスに書き直すか，DNSサーバーのゾーンファイルを暗記して人間キャッシュサーバになろう．

# Crostiniでできること

特に項目を作るほどではないが現状のCrostiniで（筆者の環境で）できることをまとめる．

- Linux側でssh接続し，Chrome OS側のChromeにポートフォワーディング
- Linix側でlocalhostにサーバーを立て，Chrome OS側で閲覧
- Steamのゲーム（Linux向け）

ちょっとした資料作成がオンラインのMicrosoft OfficeやGoogleのアプリでできる昨今，
Chromebookの実用性は他のOSと比べ遜色ないレベルになっている．
とくにChrome OSは非常に軽快であり，普段遣いのサブPCとして最適である．

# 参考文献

[ChromeOS/Chromebook　開発用マシン構築手順](https://qiita.com/tetsuyaohira/items/38d156e2e1c8ef8b2d66)
[How to get other ChromeOS Keyboard Shortcuts Working](https://www.reddit.com/r/Crostini/comments/94wenl/how_to_get_other_chromeos_keyboard_shortcuts/)
[Problem with using files on the SD Card](https://www.reddit.com/r/Crostini/comments/au8r8p/problem_with_using_files_on_the_sd_card/)
[Crostini](https://wiki.archlinux.jp/index.php/Crostini)