ChromebookにDebian以外の環境を作り，初期設定までする

※複数端末で執筆しているので，IMEの設定が違って句読点が統一されていません．気にしないでください．

# はじめに  
不自由な環境に置かれると、暴れたくなりますよね(?)　　
ということで、Chromebookに2つ目のLinuxコンテナを構築します。  
なお、開発者モードは不要です。  

# 前提  

- chromeOSのLinux開発環境(以下Crostini)構築済み(設定＞詳細設定＞デベロッパー＞Linux開発環境をオンにする)  
- Linux(ディストリビューション問わず)を触ったことがある  

# 手順  
## Linuxコンテナの仕組み  
参考:

https://qiita.com/mksh/items/7d244230597a34a10c98

ChromeOSには直接Linuxの仮想環境を作れないのか、一度Terminaという読み取り専用のLinux環境を作って、その下にLXCという仕組み（後述）でDebianを構築しているようです。  
今回は、Terminaの下にCrostiniですでに構築されたDebianと並ぶ形で、ArchLinuxを立ててみます。  

## Terminaに入る  
Ctrl+Alt+T キーでcroshを開きます。  
これは、なんかコマンドを実行できるっぽいんですが、用途がよくわからん。```ping```くらいしか使ったことないです。  
とりあえず、croshに入ったら、以下のコマンドを叩きます。(ping以外も使ってるとは突っ込むな)  
```crosh:
crosh> vsh termina
(termina) chronos@localhost ~ $  
```

なんかbashぽいのが出てきました。これが見ての通りTerminaのプロンプトです。  
うまく行かなければ、Crostiniを起動してからやってみてください。  
この中でLXCなるものを使ってDebianが動いてるらしいので確認してみます。  

```bash:
(termina) chronos@localhost ~ $  lxc list
+---------+---------+-----------------------+------+-----------+-----------+
|  NAME   |  STATE  |         IPV4          | IPV6 |   TYPE    | SNAPSHOTS |
+---------+---------+-----------------------+------+-----------+-----------+
| penguin | RUNNING | 100.115.92.197 (eth0) |      | CONTAINER | 0         |
+---------+---------+-----------------------+------+-----------+-----------+
```

penguinってやつですね(デフォルトの場合)。Crostiniを作るときに設定したホスト名になっていると思います。  
ちなみにこのIPV4は当てになりません。Termina内でのプライベートIPです。Chromebookの外側の環境とは縁はないです。(あとでこの仕組を使います)  

参考:

https://mymemo8.hatenablog.com/entry/2021/09/11/002422  

## とりあえずpenguinに入ってみる  
Terminaで以下のコマンドを叩きます  

```bash:
$ lxc exec penguin bash
```

```root@penguin: ~#```とかいうプロンプト出て来たかと思います。まあ、今回のメインはこれじゃないので退出。

```bash:
root@penguin: ~# exit
```

## ArchLinuxコンテナを作成  
LXCを使って、Crostiniのpenguinに並ぶ形でArchLinuxをつくってみます。  

LXCとは？[https://linuxcontainers.org/](https://linuxcontainers.org/)
> LXC is a well-known Linux container runtime that consists of tools, templates, and library and language bindings. It's pretty low level, very flexible and covers just about every containment feature supported by the upstream kernel.
>> LXCは，有名なLinuxコンテナのランタイムで，テンプレート，ライブラリ，言語バインディングによって構成されている．かなり低レベルで，柔軟性があって，アップストリームカーネルでサポートされているほぼすべてのコンテナ機能に対応している．

Q. ところで、なんでArchLinux?
A. なんとなく。基本的に僕はあまのじゃくなので、公式でイメージが配布されていて検索でよく出てくるUbuntuは却下。その他Ubuntu系は、GUIに力入れてるものが多くて、CUI操作しかする予定ないので却下。Alpineは、Dockerの定番らしいので却下。Debianは、他の環境でよくお世話になるので却下。CentOSは、なんとなく却下。残ってて情報豊富そうなのがArchくらいしかなかった。

僕は今までLXCとか使ったことなかったので、色々調べました。  

参考1:[https://qiita.com/m-shibata/items/3308bb7724749ba9e0f1](https://qiita.com/m-shibata/items/3308bb7724749ba9e0f1)  

LXCでコンテナを新規作成するには```lxc launch リモートサーバ:イメージ ホスト名(任意)```コマンドで作るらしい。  
公式イメージが配布されているUbuntuの場合、```lxc launch ubuntu:```で最新版、```:```のあとにバージョンを指定できるらしい。  

ちなみに、ホスト名は指定したほうが良いですよ。指定しないと、脈略もクソもない長いホスト名つけられるので、だるいです。試しにやってみたら、```artificial-ant```(うろ覚え)みたいなのつけられました。人工アリってなんだよ。  

上記記事によると，公式イメージがないAlpineは、imagesリモートサーバにあるっぽい。んじゃ、Archもここにありそう。  
参考2:[https://us.lxd.images.canonical.com/](https://us.lxd.images.canonical.com/)  
やっぱりありますね。  

...すげえこれ。AmazonLinuxとかdevuanとかもあるじゃん。Ubuntuもあるし。  

てなことで、インストールしましょう。  

```bash:
$ lxc launch images:archlinux alpaca
```

ホスト名はalpacaにしました。  

## ログイン  
以下コマンドを叩きます。  

```bash:
$ lxc start alpaca #alpacaコンテナを起動
$ lxc exec alpaca bash #alpacaコンテナにログインし，Bashを起動
```

## 各種設定  
### 必要パッケージのインストール  
pacmanを使います。ついでにアップグレードします。  

```bash:
~# pacman -Syu vim #vimのインストールとその他アップデート
~# pacman -S curl #curlインストール
~# pacman -S fish #個人的に好きなshell
```

### ユーザ作成  
現状ではrootとシステム用ユーザしかないので、作ります。  

```bash:
~# useradd me #meユーザ作成
~# cat /etc/passwd | grep me #確認
```

この時点ではmeにはパスワードもないしsudo権限もないし挙げ句にはホームディレクトリさえないので、諸々作ります。  

#### パスワードとホームディレクトリ
参考:[https://webkaru.net/linux/sudo-user-add/](https://webkaru.net/linux/sudo-user-add/)  

```bash:
~# passwd me #meのパスワードを設定
~# passwd root #ついでにrootも
~# mkdir /home/me #ホームディレクトリ作成
~# chown me /home/me #ホームディレクトリの所有者設定
```

ちなみに、/home/me作っただけでホームディレクトリになりました。  

#### sudo権限
```bash:
~# usermod -G wheel me #sudo権限ユーザグループに追加。Debianの場合はwheelじゃなくてsudo
~# visudo #sudo権限を追加するエディタを起動
```

↓visudo画面(エディタはデフォルトでviです。変更できますが、僕はこれで問題ないのでやり方はわかりません。)  

```bash:visudo
(省略)
root ALL=(ALL:ALL) ALL #そのまま
(省略)
%wheel ALL=(ALL:ALL) ALL #コメントアウトを外す
(省略)
```

最後に確認します。  

```bash:
~# su me #meにアカウント変更
$ sudo pacman -Syu #sudoが必要なコマンドなら何でもOK
```

これでちゃんと実行されればOKです。  

### fishの設定(個人的な好み)  
```su me```でmeユーザに切り替えた状態で  

```bash:
$ fish #fish shellの起動
#fisher(プラグインマネージャ)のインストール
> curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish

> fisher install jethrokuan/z #ディレクトリ移動をスムーズにするプラグイン
```

### SSHの設定  
penguinからalpacaにログインできるようにSSHを設定します。  
penguinとalpacaはTerminaの中で同じLANに所属していることを利用します。  
ChromeOSの設定の、Crostiniの設定で、ポート転送をオフにしてある前提です。外からアクセスできちゃったらセキュリティが怖い。  

参考:[https://blog.masato.jp/arch-linux-ssh-setup](https://blog.masato.jp/arch-linux-ssh-setup)  

```bash:
> sudo pacman -S openssh #sshのインストール
> sudo vim /etc/ssh/sshd_config # sshの設定ファイル
```

以下のように編集します。※実機とかでやるととてつもなく危険な設定です。  

```bash:sshd_config
(省略)
Port 22 #13行目のこの行のコメントアウトを外す
PermitRootLogin yes #32行目のコメントを外し、値をyesに変える
PasswordAuthentication yes #57行目のコメントを外す
(省略)
```

sshデーモンを再起動  

```bash:
> sudo systemctl rebstart sshd #sshdの再起動
> sudo systemctl enable sshd #コンテナ起動時にsshd自動起動
```

### 各種設定ファイルのインポート  
せっかくSSHをオンにしたので、SFTPで送ります。  

penguin上のプロンプトで

```bash:
$ sftp alpaca
sftp>
```

<details>
<summary>SFTPコマンド一覧（クリックで開く）</summary>

```bash:
pwd #リモート側のpwd
lpwd #ローカル側のpwd
ls #リモート側のls
lls #ローカル側のls
cd #リモート側のcd
lcd #ローカル側のcd
mkdir #リモート側のmkdir
lmkdir #ローカル側のmkdir
get #リモートからローカルに転送
put #ローカルからリモートに転送
exit または bye #終了
```
</details>

とりあえず僕は.bashrc .vimrc config.fish fish_prompt.fish を転送しました。  

# おわり
ちなみにこのあと，ストレージ容量見誤ってどうしようもなくなったので，Crostiniもろとも消してやり直しましたとさ．  
その話についてもいつか書きたいと思う．  
重要なデータ入ってなくてよかった．

なお、デフォルトで起動するコンテナをArchにするには、以下のArch wikiを参考にしてください。

https://wiki.archlinux.jp/index.php/Crostini