WSL(Windows Subsystem for Linux)の概要と導入

# はじめに

 Windowsの開発環境が改善されてきているとのお話を聞き、今更ながらWSL(Windows Subsystem for Linux)を触ってみました。

# 環境

- OS: Windows10 Pro 64bit
  - Version: 1903
  - OS build: 18362.418

Windows for Dockerなどを後で試す予定なので、 Proを使用してます。(今回の記事とは特に関係ないです)

# そもそもWSLって何？

[Windows Subsystem for Linux に関してよく寄せられる質問 | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/wsl/faq)

- WSLはLinuxコマンドラインをWindows上で実行できるWindowsの機能です。
  - bashや、sed/awkなどのLinuxコマンド、ruby/pythonなどのスクリプトを実行できます。
- 完全仮想化[^1]と違って、少ないリソースで動きます。
  - またLinuxコマンドラインからWindowsのファイルにアクセスできます。
- コマンドラインの実行を目的としているため、GUI/サーバアプリケーションの実行は推奨しません[^2]。
  - すべての機能が使えるわけではないので、必要に応じてHyper-V、Docker等を使いましょう。


# WSLの構成

[Learn About Windows Console & Windows Subsystem For Linux | Windows Command Line]
(https://devblogs.microsoft.com/commandline/learn-about-windows-console-and-windows-subsystem-for-linux-wsl)

`Windows Subsystem for Linux Overview` の項目を見ると構成概要を理解できると思います[^3]。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/12e00bd6-00d9-b263-d041-ed783cb106bc.png)
[Windows Subsystem for Linux Overview &#8211; Windows Subsystem for Linux](https://blogs.msdn.microsoft.com/wsl/2016/04/22/windows-subsystem-for-linux-overview/)より

- WSLはユーザモード/カーネルモードで動作する部品の集まりです。
  - Linuxインスタンスを管理するユーザモードのセッションマネージャ。
  - LinuxカーネルをエミュレートするPico provider drivers (lxss.sys, lxcore.sys) 。
  - Linux(ユーザモードで動作)をホストするためのPico process。

上記の構成要素によって、LinuxシステムコールをWindowsカーネルに転送するほか、Linuxカーネルをエミュレート、またLinuxシステムコールをWindows NTカーネル APIsに変換します。

# インストール手順

[Windows 10 用 Windows Subsystem for Linux のインストールガイド | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)

## WSLの機能を有効化

PowerShellを管理者権限で開き、WSLの機能を有効化します。

```powershell
PS C:\Users\xxx> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

機能を有効化するために再起動します。

```powershell
この操作を完了するために、今すぐコンピューターを再起動しますか?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"):
```
そのままEnterを押します。
再起動後、「プログラムと機能」を開いて有効化しているか確認してみます。

`設定` -> `アプリ` -> `プログラムと機能` -> `Windowsの機能の有効化または無効化`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/c6013180-3781-f477-0d40-0655fcf7e5f4.png)

有効化されていました。

## Linuxディストリビューションのインストール

Microsoft Storeでもインストールできますが、今回はPowerShellでインストールしてみます。

[Windows Subsystem for Linux ディストリビューションパッケージを手動でダウンロードする | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/wsl/install-manual)

Ubuntu 18.04 をインストールするため `https://aka.ms/wsl-ubuntu-1804` からファイルをダウンロードします。
その他のディストリビューションをインストールする場合は、上記リンクの「ディストリビューションのダウンロード」の項目を参考にしてください。

```powershell
PS C:\Users\xxx> Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing
```

その後、インストールを実施します。

```powershell
PS C:\Users\xxx> Add-AppxPackage .\Ubuntu.appx
```

## WSLディストリビューションの初期化

スタートからインストールしたディストリビューションを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/747820f9-c6d4-dfed-7019-ed84c2c51d19.png)

するとインストールが始まります。その後、ユーザ名、パスワードの入力が求められるので入力します。

```shell
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: user_name
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

user_name@pc-name:~$
```

これでコマンドを実行できるようになりました。試しに不要になった `Ubuntu.appx` を削除します。
`/mnt` 配下にWindowsのローカルドライブがマウントされています。

```shell
$ ls /mnt/c/Users/[ユーザ名]/Ubuntu.appx
Ubuntu.appx

$ rm /mnt/c/Users/[ユーザ名]/Ubuntu.appx
$ ls /mnt/c/Users/[ユーザ名]/Ubuntu.appx
ls: cannot access '/mnt/c/Users/[ユーザ名]/Ubuntu.appx': No such file or directory
```

削除できました。最後にディストリビューションのパッケージを更新/アップグレードします。

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

# 挙動確認

## UbuntuコマンドラインからWindowsのディレクトリのファイル操作

```shell
$ mkdir test
$ touch test/test.txt

$ ls -la test/test.txt
-rwxrwxrwx 1 user_name user_name 0 Oct 20 13:25 test/test.txt
```

ここでWindowsのエクスプローラで開いて、適当な文字列をテキストに記入。

```
$ cat test/test.txt
test
```

問題なさそうですね。その後 `vi` でUbuntu側からテキスト追記しましたがこれも問題なさそうです。

## Windows側からUbuntuのディレクトリのファイル操作

こちらの操作は非推奨でしたが、version 1903 で問題なくなったようです。

[What’s new for WSL in Windows 10 version 1903? | Windows Command Line](https://devblogs.microsoft.com/commandline/whats-new-for-wsl-in-windows-10-version-1903/)

```powershell
PS C:\Users\xxx> wsl --list
Windows Subsystem for Linux ディストリビューション:
Ubuntu-18.04 (既定)

PS C:\Users\xxx> ls \\wsl$\Ubuntu-18.04
    ディレクトリ: \\wsl$\Ubuntu-18.04


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/10/18     22:10                bin
d-----       2018/07/26      0:56                boot
d-----       2019/10/20     12:50                dev
以下略

PS C:\Users\xxx> cd \\wsl$\Ubuntu-18.04
PS Microsoft.PowerShell.Core\FileSystem::\\wsl$\Ubuntu-18.04>
PS Microsoft.PowerShell.Core\FileSystem::\\wsl$\Ubuntu-18.04> explorer.exe .
```

エクスプローラが開くので、`/home/[ユーザ名]` のディレクトリに適当なファイル作ってみます。

```
$ ls -la test.txt
-rw-rw-rw- 1 user_name user_name 0 Oct 20 14:38 test.txt
$ cat test.txt
あいうえお
```

これも問題なさそうです。

`C:\Users\[ユーザ名]\AppData\Local\Packages\[ディストリビューションフォルダ名]\LocalState\rootfs` に実ファイルは存在するようですが、 このパスでアクセスしてしまうとLinuxファイルが破損する可能性があるようです。 そのため `\\wsl$\[ディストリビューション名]` のアクセスだけにします。

## wsl.confの設定

Windows側のファイルパーミッションがゆるいので `wsl.conf` で設定を追加します。

[Linux ディストリビューションの管理 | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config#set-wsl-launch-settings)

```shell
$ sudo vi /etc/wsl.conf

# Enable extra metadata options by default
[automount]
enabled = true
options = "metadata,umask=22,fmask=11"
```

その後、Windows側でファイルを作成します。

```shell
$ mkdir test
$ touch test/test.txt

$ ls -la test/test.txt
-rw-rw-rw- 1 user_name user_name 0 Oct 20 15:12 test/test.txt
```

パーミッションの設定が反映されていることが確認できました。

# まとめ

- WSLはWindows上でLinuxコマンドラインを実行するための機能。
- 完全仮想化[^1]、dockerとは異なり、Windows独自機能[^3]。
- Windows上のファイルをLinuxコマンドライン経由でアクセスできる。
- GUIやサーバアプリケーションの実行は推奨されない。

[^1]: Virtual Box/Hyper-Vのホスト型、Xen/VMware ESXiなどのハイパーバイザ型などの仮想化。
[^2]: 推奨しないだけでインストールできるみたいです。「[WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）：Tech TIPS - ＠IT](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html) 」またWSL2だと問題なくなるかもしれません。
[^3]: これはWSL1の構成でWSL2とは異なります。「[完全なLinuxがWindows 10上で稼働する？　「WSL 2」とは](https://www.atmarkit.co.jp/ait/articles/1906/14/news019.html)」