Chromebook Crostini の構造を簡単に辿る

# はじめに
テレワークの導入に伴って会社から Chromebook を貸与され、Linux が使えるということで試しにテレワークでの開発に使うことになりました。

Chromebook で Linux を使用するにはいくつかの方法があるそうで [^1] 、特別これでなければいけないという理由もなかったため Crostini を利用しました。しかし、実際に操作することになる Linux (デフォルトのターミナルアプリで操作する Linux コンテナ) と ChromeOS の位置関係が分かりづらく躓くことがありました。（特にポートフォワード関連）

また、Crostini に使用されている技術が書かれているページがいくつかありましたが、この記事ではそういった技術をあまり知らなくても、感覚的にこの Linux コンテナと ChromeOS の位置関係をつかめるようにと思い書いた記事になります。

コロナの影響で Chromebook を使い始めた方、使い始める方、開発機としての導入を考えている方もいらっしゃるかもしれません。読みづらい点や間違っている点などあるかもしれませんが参考になれば幸いです。

# 概要

この記事では主に以下の内容について書いています。
（タイトル含め、一部語弊があるかもしれません）

- Crostini について
- ChromeOS からターミナルアプリ上の Linux の位置まで実際に辿ってみる

# 環境
- Acer Chromebook CB715
- Chrome OS (Google Chrome) beta 64bit

# Crostini とは

> Crostini は、Linux アプリケーションのサポートを使いやすくし、ChromeOS とうまく統合するための包括的な用語です。<br>
Referense: [Running Custom Containers Under Chrome OS #Overview](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/containers_and_vms.md#overview)
Translation: [DeepL翻訳](https://www.deepl.com/translator)

なお Crostini では、デフォルトで Debian が入ります。[^2]

# Crostini を構成するもの

Crostini の構成要素で、実際に今回操作するものを列挙し、軽く説明を入れます。[^3] [^4]

- Crosh (ChRome SHell)
- Temina (Termina VM)
- LXC / LXD

## Crosh とは

> Chromeシェル（CROSH）は、Linux BASHまたはWindowsコマンド（cmd.exe）ターミナルと似た、コマンド・ライン・インターフェイスです。Chrome OSはLinuxベースですが、CROSHはほとんどのLinuxコマンドを認識しません。<br>
Reference: [Dell™ ChromebookでのCROSH Diagnostics（診断）の使用](https://www.dell.com/support/kbdoc/ja-jp/000132432/using-the-crosh-diagnostics-on-your-dell-chromebook?lang=ja)）

## Temina とは

起動速度を重視した、読み取り専用の仮想マシン

> Termina は、ChromeOS の Linux カーネルとユーザーランドツールを削ぎ落とした VM イメージです。<br>
Referense: [Running Custom Containers Under Chrome OS #Overview](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/containers_and_vms.md#overview)
Translation: [DeepL翻訳](https://www.deepl.com/translator)

## LXC / LXD とは

システム単位で利用されるコンテナの一種。
因みに Docker はアプリケーション単位で利用されるコンテナだそうです。[^5]

# ChromeOS からターミナルアプリ上の Linux の位置を実際に辿ってみる

では順を追って、ターミナルアプリで表示されている場所まで ChromeOS 上から辿っていきたいと思います。

## 1. Crosh の起動

Google Chorme またはターミナルアプリから `ctrl + alt + t` で Crosh を起動します。

## 2. Termina VM へログイン

Crosh から Termina VM へログインします。[^6]

```sh
crosh> vsh termina
(termina) chronos@localhost ~ $
```

## 3. Termina VM 上で稼働している LXC / LXD コンテナを表示

```sh
(termina) chronos@localhost ~ $ lxc list
+---------+---------+------------------------------+-----------------------------------------------+------------+-----------+
|  NAME   |  STATE  |             IPV4             |                     IPV6                      |    TYPE    | SNAPSHOTS |
+---------+---------+------------------------------+-----------------------------------------------+------------+-----------+
| **penguin** | RUNNING | 172.20.0.1 (br-8703516dbe4d) | 2400:2413:2202:bb00:216:3eff:fed8:4207 (eth0) | PERSISTENT | 0         |
|         |         | 172.17.0.1 (docker0)         |                                               |            |           |
|         |         | 100.115.92.202 (eth0)        |                                               |            |           |
+---------+---------+------------------------------+-----------------------------------------------+------------+-----------+
```

## 4. 稼働中の LXC / LXD コンテナにログイン

デフォルトでは `penguin` というユーザー名の Debian が入っているので、以下のコマンドでログインします。

```sh
(termina) chronos@localhost ~ $ lxc exec penguin bash
root@penguin:~#
```

ログイン後、試しに実行中の Docker コンテナを表示してみます。

これでようやく探していた Linux コンテナまで辿り着きました。
**ここでのコマンド操作が、Linux アプリとして用意されている「ターミナル」と全く同じ** になるという事のようです。

```bash
root@penguin:~# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                  NAMES
6822c5f1993b        nginx:stable-alpine   "/bin/sh -c 'envsubs…"   14 hours ago        Up 3 hours          0.0.0.0:8080->80/tcp   cvat_proxy
55e2b1de1b0e        cvat_cvat_ui          "nginx -g 'daemon of…"   14 hours ago        Up 3 hours          80/tcp                 cvat_ui
b6b4feb3670e        cvat                  "/usr/bin/supervisord"   14 hours ago        Up 3 hours          8080/tcp, 8443/tcp     cvat
8832f64e8f96        postgres:10-alpine    "docker-entrypoint.s…"   14 hours ago        Up 3 hours          5432/tcp               cvat_db
fcf14c4d2ca5        redis:4.0-alpine      "docker-entrypoint.s…"   14 hours ago        Up 3 hours          6379/tcp               cvat_redis
```

# 参考

- Using LXD on your Chromebook, https://ubuntu.com/blog/using-lxd-on-your-chromebook
- Running Custom Containers Under Chrome OS, https://chromium.googlesource.com/chromiumos/docs/+/HEAD/containers_and_vms.md

[^1]: Crostini 以外の Linux 環境と、その比較については「[ChromebookのLinux環境を整える（Crouton + Ubuntu20.04 + Chromebrew + Sommelier）](https://qiita.com/htnk/items/6458ec6412210406486b#chromebook%E3%81%AElinux%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)」という記事が分かりやすかったです。

[^2]: Debian 以外のディストリビューションを入れることもできるそうです。（[Can I run a different Linux distro?](https://chromium.googlesource.com/chromiumos/docs/+/master/containers_and_vms.md#can-i-run-a-different-linux-distro)）

[^3]: こちらのページに Crostini の関係図のようなものがありました。[Crostini developer guide #What is all this stuff?](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/crostini_developer_guide.md#what-is-all-this-stuff)

[^4]: ほとんどのことはこのページに記載されています。（[Running Custom Containers Under Chrome OS](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/containers_and_vms.md)）

[^5]: 「[Dockerもいいけど、LXCも使おうぜ](https://qiita.com/onokatio/items/969e3b470359e4c47a04)」

[^6]: Termina が起動していない時は、Crosh から `vmc start termina` と打ち込み、起動させます。