WSLの環境を整える(ショートカット, GUI, 開発環境)

関連記事：[やさしいWindows Subsystem for Linux (WSL) のインストール手順](https://qiita.com/kekenonono/items/1ddbb5a1125d496c0010#4-wsl%E3%81%A8windows)
#はじめに
[WSLをインストール](https://qiita.com/kekenonono/items/1ddbb5a1125d496c0010)したは良いけど、WSLからWindows10側のファイルシステムへのアクセスが面倒だったり、逆にWin10側からWSLのファイルシステムにアクセスできなかったり、使いづらい場面も多々あります。

そこで、この記事ではWSLとWindows10側の相互運用性を高めるために行った作業を簡単に残します。
主に研究室の新入生向けに作った記事なので内容は少し投げやりで間違っている箇所があるかもしれません。バシバシ指摘してください。

#シンボリックリンクの作成
まず、WSL側からWin10側のファイルシステムに簡単にアクセスできるようにするために、シンボリックリンク（いわゆるショートカット）を作成しました。

###いままで
通常、WSLのディレクトリからWindows10のディレクトリにアクセスする場合、`/mnt/c`から始まるパスを指定しなくてはいけません。

<details><summary>WSLとWindowsの関係</summary>
<div>
>WSLの中で動作しているのは、ほぼ普通のLinuxでコマンドのバイナリコードもそのままである。コマンドに関しては特にWSL用に変更が加えられているわけではない。このため、WSL側には、Linuxのファイルシステムがそのまま見える。これを「VolFs（Volume File System）」と呼ぶ。これに対して、Windows OS側の普通のファイルシステム（Cドライブなど）は、WSL側からは、「/mnt/」以下にドライブ文字から始まるパスとして見ることができる。これを「DrvFs（Drive File System）」と呼ぶ。
>>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521871/8aaa5970-9918-011c-572c-859098024658.png)

>[@IT 【WSL入門】第3回 WSL活用の落とし穴：LinuxからWindowsフォルダへのアクセス完全マスター](https://www.atmarkit.co.jp/ait/articles/1904/19/news033.html)より引用
</div></details>

例えば、WindowsのDesktopにディレクトリを移動する場合、以下のようにコマンドを実行する必要があります。

```bash
$ cd /mnt/c/Users/user_name/Desktop/
```

うーむ、とても長くて面倒ですよね。

###lnコマンド
そこで、`ln`コマンドを使って**「WSLのホームディレクトリ」から「Windowsのデスクトップ」に直接アクセスすることができるショートカット**を作成します。

その方法は簡単で、以下に示すコマンドをショートカットを作成したいディレクトリで実行すれば完了です。

```bash
$ ln -s /mnt/c/Users/user_name/Desktop/ Win_Desktop
```

`ls -l`を実行すると以下のような実行結果が表示されると思います[(「ls -l」コマンドの表示からファイルの属性を理解しよう)](https://www.atmarkit.co.jp/ait/articles/1605/18/news015_3.html)


```bash
#ホームディレクトリでlsコマンド実行
$ ls -l

#実行結果抜粋（Win_Desktop が /mnt/c/Users/user_name/Desktop のリンクであることを示している）
Win_Desktop -> /mnt/c/Users/user_name/Desktop
```



実際にシンボリックリンクを使ってディレクトリを移動してみると、ショートカットできていることが分かります。

```bash
#ディレクトリを移動
$ cd Win_Desktop

#物理的なパスを表示
$ pwd -P
/mnt/c/Users/user_name/Desktop #実行結果
```

今回は、Windowsのデスクトップへのパスをシンボリックリンクとして作成しましたが、以下のコマンドのTARGETを「ディレクトリ」や「ファイル」に設定することで様々なリンクを作成できます。
ただし、TARGETにスペースが入っている場合は`""`でエスケープしてください。

```bash
ln -s TARGET LINK_NAME
```

詳しいlnコマンドの使い方は、[ここ](https://www.atmarkit.co.jp/ait/articles/1605/30/news022.html)や[ここ](https://eng-entrance.com/linux-command-ln)に書いてあるので参考にしてみてください。

#VcXsrvのインストール
WSLをインストールしただけでは、WSL上のGUIアプリケーションを使用することはできません。
これは、おそらくLinuxとWindowsではウィンドウシステムが異なることが原因だと考えられます。

例えば、WSLの標準エディタ（gedit）を使用しようとすると以下のエラーが吐き出されます

```bash
$ gedit
Unable to init server: Could not connect: 接続を拒否されました
```


そこで、**Windows側にXサーバ（X Window System）をインストール**してGUIのデスクトップ環境を構築します。
**XサーバはUnix系のウィンドウシステムで、WSL側から見たディスプレイと考えてください。**

XサーバとしてVcXsrvをインストールし、GUI環境を実現する手順が以下のサイトに分かりやすくまとめられているので参考にしてください。
**[WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html)**

上記の参考ページでは

1. VcXsrvをWindow側にインストール(win)
2. VcXsrvの起動(win)
3. 2. の操作をwindows起動時に自動で実行されるようにスタートアップアプリとして設定(win)
4. WSLのDISPLAY環境変数を設定(wsl)
5. 3. の操作をwsl起動時に自動で実行されるように~/.profileを追記(wsl)
6. 動作テスト(wsl)

という手順で説明されています。
3. と5. の手順はスキップすることができます。
**ただしその場合、WSLでGUIアプリを実行する際は2. と4. の手順を毎回実行する必要があるので注意してください。**

#VSCodeのインストール
**基本的にWSL内のファイルシステムにはWindows側からアクセスすることはできません。**
したがって、WSL側にインストールしたライブラリなどをWindowsで使うことはできないのです。
また、WSL内のファイルをWindows側のエディタで開くこともできません。

これではせっかくWSLでLinux環境を使えるようになったのに開発環境としては貧弱です。

そこで、Windowsに**VSCode (Visual Studio Code)**をインストールし、**Remote-WSL**という機能を利用します。

簡単な手順は以下の通りです。
1. 公式ページ(https://code.visualstudio.com/) からVSCodeをインストールします。
2. VSCodeを起動すると、WSLインストール後であればRemote-WSLという拡張機能がレコメンドされると思うのでインストールします。

これでVSCodeからWSLのファイルシステムにアクセスできるようになります。
以下のページにも簡単にまとめられています。
[WindowsのVS CodeからWSL(Linux環境)を使う (Remote-WSL)](https://blog.cosnomi.com/posts/remote-wsl-vscode/)

###使い方
VSCode自体は使用者も多く検索すれば便利な拡張機能や設定のしかたなどはたくさん出てくると思います。
なのでここでは、**Remote-WSLにフォーカスします。**

なぜ、WindowsアプリであるVSCodeからWSLのファイルシステムにアクセスし、編集できるのかという説明が以下の図にまとめられています。

>><dev>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521871/3abe8dbc-74ab-0edf-0852-68c428a83217.png)

>Visual Studio Code /Developing in WSL(https://code.visualstudio.com/docs/remote/wsl) より


簡単にいえば、WSL内にVSCode Serverを立ててWSLのファイルシステムにアクセスし、インターフェースだけはWindows側が担当するという形です。
したがって、**Windows側のVSCodeに拡張機能をインストールした場合でも、Remote-WSL側に再度インストールする必要があります**ので注意してください。

VSCodeをwslのコンソールから起動する場合は、作業したいディレクトリ下で以下のコマンドを実行してください

```bash
$ code .
```

これでVSCodeが起動します。
Remote-WSLが正常に動作しているかは、VSCodeのウィンドウの左下にWSLと表示されているかで確認できます。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521871/5042ca45-5fc3-e223-cd7b-4ea49a099a50.png)

また、Windows側のVSCodeを使用している最中でも上記赤枠の部分をクリックするとRemote-WSLに切り替えることができます。

#参考資料
記事内のリンクを参考にしたということで省略します。