Windows上でLinux活動するための環境構築します

新しいノートパソコンを買ったので、Windows上でLinux活動するための環境構築します。

## Windows Terminal
とりあえずターミナルがないと落ち着かない
~~コマンドプロンプト？んなもんターミナルソフトに含めねぇよ！~~
Windows Terminalをインストールします。
wingetはプリインストールされていました。

```
PS> winget install terminal
```

CmderとかMsys2とかのターミナルエミュレータソフトは使っていたことがあり、それと似たような作りこみです。
Cmderにあった文字化けとか文字のずれとかがなくてより快適になりました。

デフォルトで立ち上がるシェルがPowerShellだったので、下記のWSL2設定後、<kbd>Ctrl+,</kbd>でWSL2に変更しておきました。

以後、powershellのプロンプトは"PS>"で示します。
SSHでメインマシンンのデスクトップつなぐとかに使うためWSL2は入れておきます。


## WSL2

普通にストアからWSL2落としました。
その後ターミナル上から

```
PS> wsl --install -d ubuntu
```

基本後述のmultipass上にdocker展開して進めるつもりですが、わざわざmultipassつなげなくても、
Vimでメモとったり、デスクトップにsshする時くらいの目的だったらwslでいいかなと思いますので入れました。


## フォント
zsh, neovimでpowerlineを使っていますので、powerline fontをWindowsOSにインストールしておきます。
Dropboxによく使うフォント類はためてあるので、.ttfファイルを右クリック→インストールしました。
私は[ Ubuntu Mono delivative Powerline ](https://github.com/powerline/fonts/tree/master/UbuntuMono) を使っています。


# multipass

dockerで開発進めたいので、[ multipass ](https://multipass.run/)入れます。
WSL2上でdocker構築するのはDocker for Desktopインストールしたりで骨が折れました。
Vagrantとも相性悪く、今まで使っていたVagrant+Virtualbox環境が使えなくなって、Docker for Desktopはもう使いたくありません。
~~だいたいDockerにGUIとかいらねーだろ~~

multipassでDocker環境構築する参考はこの辺
[MacでDocker Desktopを入れずにDocker CLI+Multipassで代替してみる](https://zenn.dev/kitsune3/articles/93edfacabe19cd#%E3%81%93%E3%81%AE%E8%BE%BA%E3%81%AE%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99)

multipassのことはじめはこの辺
[仮想環境multipassを試す](https://qiita.com/u1and0/items/4926da3bef17853d33d1)


## multipass vs Virtualbox+Vagrant
multipassはVirtualbox+Vagrantでやっていた環境構築と似たようなことができます。
Virtualboxは通常GUI操作、そこを Vagrantをはさむことでheadless起動(CUI操作)、仮想マシンの構築、設定のコード化ができます。

multipassの特徴は下記。
結局Virualbox+Vagrantでやっていることとあまり変わらないです。

* ホストのOSがクロスプラットフォーム
* Hypyer-V, QMU, Virtualbox等、踏み台にできる仮想環境が多岐に渡る
* イメージはUbuntu固定
* 操作はCUI限定
* cloud-initによる柔軟な初期設定のコード化

Virtualbox+Vagrantと比べたメリットは余計なGUIがないこととイメージがUbuntu固定とマシンの立ち上げが高速(らしい)ことかな。

WSLが一般的になってきても,なぜmultipassを使うか？
WSLがDocker for Desktopを使わないとDocker使えないからです。


## インストール

```
PS> winget install multipass
```

wingetは管理者権限で実行してください。


## インスタンス立ち上げ

試しにインスタンスを一個作ってみます。

```
PS> multipass launch
 multipass launch
launch failed: Hyper-V is not available on this edition of Windows 10. Please upgrade to one of Pro, Enterpriseor Education editions.
```

エラーで立ち上がりませんでした。
Windows10 Home Editionを使っているので、Hyper-Vをサポートしていないようです。

公式にも書いてありました。

>
 Prerequisites
Hyper-V
Only Windows 10 Pro or Enterprise, version 1803 (“April 2018 Update”) or later is currently supported. It’s due to the right version of Hyper-V only being available on those versions.


[](https://multipass.run/docs/installing-on-windows)

Hyper-Vの代わりに、Virtualboxで立ち上げる設定をします。

まずはVirtualboxをインストールします。

```
PS> winget install virtualbox
```

次にlocal.driverを設定します。

```
PS> multipass set local.driver=virtualbox
```


## コア数、メモリ、ディスク設定を変更したインスタンスの立ち上げ

先ほどの参考を例に
下記設定でインスタンスを立ち上げます。

* インスタンス名: master
* CPU: 4コア
* メモリ: 4GB
* ストレージ: 40GB

```
PS> multipass launch --name master --mem 4G --disk 40G --cpus 4 --cloud-init ./cloud-config.yml
```


docker, docker-composeをプリインストールしたインスタンスを立ち上げるcloudinitのconfigファイルの記述です。

```yaml:cloud-config.yml
#cloud-config

groups:
  - docker

system_info:
  default_user:
    groups: ["docker"]

package_update: true
packages:
  - docker
  - docker.io
  - docker-compose

snap:
  commands:
    - 'snap install multipass-sshfs'
```

うまくたちあがりました。

![スクリーンショット 2021-12-09 220452.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113494/a301087e-b025-cbc3-a6c4-7b0284f49fb1.png)



## 共有フォルダとしてmount
ローカルディレクトリをmountします。

設定項目があるようなので、設定します。
[](https://multipass.run/docs/set-command#local.privileged-mounts)
管理者権限で実行してください。

```
PS> multipass.exe set local.privileged-mounts=true
```


```
PS> multipass.exe mount Dropbox master:/home/ubuntu/Dropbox
mount failed: cannot connect to the multipass socket
```

まだできない。

```
PS> multipass.exe mount C:\Users\yuich\Dropbox\ master:/home/ubuntu/Dropbox
```

sourceは絶対パスが必要だそうです。
これで成功しました。



## Port Forwarding

今のところmultipassには簡単にport forwardingを設定できる機能が備わっていないので、ssh port forwardingを設定する方法をGithubで見かけました。

[canonical / multipass Port forwarding #309](https://github.com/canonical/multipass/issues/309)


> Possible w/ ssh local (or remote) port forwarding:
>
>   • forward requests from multipass host (port 9000) to multipass instance (port 80)
>
>       sudo ssh \
>           -i /var/root/Library/Application\ Support/multipassd/ssh-key/id_rsa \
>           -L 9000:localhost:80 \
>           multipass@<multipass instance ip>
>
>   • access multipass instance (port 80) from any box that can access multipass host
>
>       curl <mutlipass host ip>:9000


もう一つの方法として、Virtualboxを使っていることをいいことに、無理やりVirtualbox GUIからport forwarding の設定を行います。

ただし、multipassから起動したVirtualboxの仮想マシンは管理者権限で実行しているため、普通に開いても仮想マシンが見えません。下記のようにして、[pstools](https://docs.microsoft.com/ja-jp/sysinternals/downloads/pstools)を使用して、仮想マシンが見える状態でVirtualbox UIを開き、さらにそこからport forwadingの設定をします。


> 通常ユーザで VirtualBox を起動しても k3s の仮想 OS は見えません。管理者権限で動いているからです。pstools をインストールし、管理者権限で以下を実行すると出てきます。

```
PS> PsExec64.exe -s -i "C:\Program Files\Oracle\VirtualBox\VirtualBox.exe"
```

参考: [multipass 上に kubernetes 環境を最速で作る](https://zenn.dev/mattn/articles/736874d5a1b7de)

![screenshot2021-12-30 124323.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113494/fcae399a-733c-64f6-fa37-422da55a0bcf.png)


設定は仮想マシンがrun状態で行います。
わざわざshutdownしてから設定したら、Virtualboxからエラーダイアログが出まくりました。
設定完了後に仮想マシンを再起動することも忘れずに行いましょう。

```
PS> multipass restart
```

仮想環境を再起動してport forwading設定完了。
port設定の反映は適当なindex.htmlを用意して、pythonのhttp.serverモジュールでサーバーを立ち上げ、pingやcurlやブラウザからのアクセスをもって確認します。

```
$ python3 -m http.server 8888
```

クライアント側で8888番ポートでサーバー立ち上げ

```
$ curl -fsSL localhost:8888
```

ホスト側(Windows)から疎通確認。
またはブラウザのアドレス欄に`http://localhost:8888`を入力。


## Snapshot / Backup

[](https://github.com/canonical/multipass/issues/208)

Snapshotとかとれる機能はついていないようです。

VirtualboxのGUIからスナップショット作成したり、CUIから
`VBoxManage snapshot snapshot1`でスナップショット作成したり

Vagrantを使っていたら
`vagrant snapshot save snapshot1` とか `vagrant sandbox on`でスナップショットとれるのですが。


基本的にDocker上でしか作業しないので、システム的になんかあったらコンテナを再作成するだけでおしまいですけどね。
コンテナイメージがGBオーダーなので、本当に仮想マシンが立ち上がらなくなって困った場合、スナップショットないと再作成が結構な時間とネットワーク帯域使うので嫌だ、というくらいです。
cloud-initでmultipassインスタンス立ち上げて、`docker-compose up -d`打てば再構築おしまい。


# エディタ

テキストエディタ勉強用にVScode入れておきます。
気が向いたら扱えるようになっておきたいです。
Vimしか使えないと周りと話が合わないので。

```
PS> winget install vscode
```

今のところWindows Terminalで<kbd>Ctrl+,</kbd>を間違えてC<kbd>trl+Shift+,</kbd>としてしまうと立ち上がってしまうくらいしか登場シーンがありません。


# 結局

Vagrant + Virtualbox + Dockerでも同じようなことができます。
[ DockerをプリインストールするVagrantfile ](https://gist.github.com/u1and0/44f001c5b5d1a52f126518a52ab9b0ba)

しかしながら今回は新技術に興味あるので、multipassでDocker環境構築してみました。
このままmultipass + Dockerで作業進めていこうと思います。 ( 外出時は。 )

...とはいえ、やっぱり一番使う時間長いのは
WSL2から`ssh u1and0@192.***.***.***`
しちゃうんですけどね。結局。 ( 在宅時 )