Windows11でKali Linux + WindowsTerminalのモダンな開発環境を作る

# はじめに
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453380/2c6847a7-bacb-61c3-b8fc-3cd66a6c943c.png)

普段はMacを使っているのですが、windows環境もなかなかいいなと思ったので、セットアップ手順を思い出しながら書きます。

# WindowsTerminalをインストール

Microsoft製のOSSで新しいターミナルを、ストアからインストールボタンをポチります

https://www.microsoft.com/store/productId/9N0DX20HK701

linuxとpowershellとコマンドプロンプトを同じウィンドウで開けてすごい。
Ctrl+Shift+Pでいろんなコマンドをためしてみると楽しいです。

# WSL2をインストール
ストアからインストールボタンをポチります。Windows11になって入れるのがだいぶ楽になりました。
kali-linux入れてますが、ペネトレーションテストツールが不要であれば別のディストリビューションをどうぞ。
ちなみに、MincrosoftStoreではなくwingetでインストールしたら、だいぶ古いバージョンがインストールされて時間を無駄にしました。

https://www.microsoft.com/store/productId/9PKR34TNCV07

KaliLinuxインストール時に色々と聞かれますが、大体はデフォルトのままでいいです。
ポートフォワーディングの設定はデフォルトでONになっているらしいです。ありがたや。

# kali-linuxにパッケージを入れる

ひとまず更新します

```shell
sudo apt update && sudo apt upgrade
```

パッケージセットをいれます

https://www.kali.org/docs/general-use/metapackages/

```shell
sudo apt install -y kali-linux-default
```

パッケージセットにzshもついてきました。zshを規定にします

```shell
sudo chsh -s $(which zsh)
sudo chsh -s /bin/zsh # だめならこっち
```

# Win-KeXをセットアップ

windows11でlinuxのGUIアプリが動作します（下の画像はシームレスモードです）
![sl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453380/5ac45f62-1702-6269-dd3a-5fe05d90a273.png)

```shell:インストール
sudo apt install -y kali-win-kex
```

```shell:シームレスモードで起動
kex --sl -s
```

```shell:ウィンドウモードで起動
kex --win -s
```

コマンドを打つのは面倒なので、WindowsTerminalから直接ひらけるようにします
設定を開いて以下のようなプロファイルを追加します

```json:settings.json>profiles.list
      {
        "closeOnExit": "always",
        "commandline": "wsl -d kali-linux kex --wtstart -s",
        "guid": "{55ca431a-3a87-5fb3-83cd-11ececc031d2}",
        "icon": "file:///c:/users/<ユーザ名>/pictures/icons/kali-menu.png",
        "name": "kali-win",
        "startingDirectory": "//wsl$/kali-linux/home/<ユーザ名>"
      },
      {
        "closeOnExit": "always",
        "commandline": "wsl -d kali-linux kex --sl -s",
        "guid": "{4c044aff-d034-2e7c-7568-0d00d85d6e46}",
        "icon": "file:///c:/users/<ユーザ名>/pictures/icons/kali-menu.png",
        "name": "kali-sl",
        "startingDirectory": "//wsl$/kali-linux/home/<ユーザ名>"
      },
```

GUIで設定してもいいです。自身の環境に合わせてよしなに設定します。
※ アイコンはググって適当にダウンロードしてきました

startingDirectoryは`/mnt/c`ではなく、**wslのホームに設定**しましょう。
理由はIOが著しく低下するためです（ファイルシステムの変換が必要なので）。
`/mnt/c`で作業するとパッケージのインストールにやたら時間がかかり、仕事になりませんでした。

# プロンプト(starship)をセットアップ
![starship.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453380/dcf4d311-382d-820e-781a-cd84b369c85f.png)

https://starship.rs/

見た目がクリーンになるのでいいです（`Oh My Posh`派の方などは読み飛ばしてください）
```shell:インストール
curl -sS https://starship.rs/install.sh | sh
```

`.zshrc`の最後の行に起動コマンドを追加します。

```shell:~/.zshrc
eval "$(starship init zsh)"
```

`NerdFonts`で表示するのを前提として作られているため、このままだと一部文字化けします。ダウンロードします

https://www.nerdfonts.com/

選択肢が多くてわけがわからないですが、starship公式に書いてあったFiraCodeの**Fira Code Regular Nerd Font Complete Windows Compatible.otf**をインストールしました

WindowsTerminalの設定に追記します（たぶんGUIのほうが楽です）

```json:settings.json>profiles.defaults.font
{
  "profiles": {
    "defaults": {
      "font": {
        "face": "FiraCode NF",
        "size": 11
      },
    },
}
```

# WindowsTerminalの配色の設定
配色は趣味になると思いますが、そこそこ有名なMonokaiテーマに設定しました。

```json:settings.json>schemes
    {
      "background": "#272822",
      "black": "#272822",
      "blue": "#9D65FF",
      "brightBlack": "#75715E",
      "brightBlue": "#AE81FF",
      "brightCyan": "#66D9EF",
      "brightGreen": "#A6E22E",
      "brightPurple": "#AE81FF",
      "brightRed": "#F92672",
      "brightWhite": "#F8F8F2",
      "brightYellow": "#E6DB74",
      "cursorColor": "#FD971F",
      "cyan": "#58D1EB",
      "foreground": "#F8F8F2",
      "green": "#A6E22E",
      "name": "Monokai",
      "purple": "#AE81FF",
      "red": "#F92672",
      "selectionBackground": "#75715E",
      "white": "#F8F8F2",
      "yellow": "#FD971F"
    },
```

# その他

- vscodeはwsl上で`code`と入力するだけでいろいろセットアップしてくれました
- dockerはwsl上に入れてもいいですが、docker desktopがWSL2と連携してるので、windows上にいれました
- docker+wsl2のセットはvmmemのメモリ使用量が増大するため、マシンによってはメモリ上限を指定したほうがよいかもしれません
- `[TCP Retransmission] [TCP Port numbers reused]`などを吐いてネットワークが安定しない問題がありましたが、[こちら](https://github.com/microsoft/WSL/issues/7254#issuecomment-905767204)の方法で直りました