【WSL】Windows上でLinuxを動かす今時の方法

# WSL(Windows上でLinuxを動かす)今時の方法まとめ

今？ 2024/10 時点の記事です。

　WSLは、Windows Subsystem Linuxの略で、文字通りWindows上のサブシステムとしてUbuntuやDebianといったLinuxを動かせるというものです。
 
 「Windowsマシン上でLinuxを動かす」となると、わりと面倒くさそうで、いろいろやらないといけないんだろうな～という気がしますが、この辺の機能は日進月歩。今となってはずっと簡単に入れることができます。
　ただ変化が激しいためか、自分でいざやってみる際に、過去の資料などを調べてみるといろんな時期の情報や断片的な情報が混在していて、少し迷走することになりました。

　本記事は、**今の時点で**、**私の環境**においては、ゼロの状態からこうやれば行けたよ、という備忘録です。

:::note warn
* Windows 11 & PowerShell 5.1で検証しています
:::

使うものは、Windows PowerShellです。


## Windowsの機能の有効化

WSLの機能は当初Windowsの設定で無効になっているため、これを有効化します。
これ自体はコンパネの``Windowsの機能の有効化または無効化``でも可能なのですが、
PowerShellから``dism.exe``コマンドでもできるので、そちらでやった方が楽だと思います。

#### 0) Windows PowerShellを管理者権限で実行し、コンソールを開く

<details><summary>どうやって？っていう人居ます？</summary>
Windows検索窓でPowerShellを検索するか、スタートメニューから、Windows PowerShellアイコンを探し出して右クリックから「管理者として実行」
</details>

#### 1) 機能が有効になっているかどうかを確認する

必要な機能とは、次の２つです。

*  **Microsoft-Windows-Subsystem-Linux** (WSL)
*  **VirtualMachinePlatform** (仮想マシンプラットフォーム)

~~~powershell 
  dism.exe /online /get-features | select-string "Linux","Virtual" -Context 0,1
~~~
~~~
  > 機能名 : VirtualMachinePlatform
    状態 : 無効
  > 機能名 : Microsoft-Windows-Subsystem-Linux
    状態 : 無効
~~~
    
``dism.exe``で起動中のOS (``/online``) の機能一覧を取得(``/get-features``) ⇒
結果を``select-string``で"``Linux``","``Virtual``"を含む行を検索し、該当行の0行目～1行目 を表示
(PowerShellを使いこなすなら``select-string``は覚えておくと便利かも)

両方とも有効になっているなら、次のステップと再起動は不要です。

#### 2) 機能を有効にする

無効になっていれば、``/enable-feature``オプションで有効化します。

~~~powershell 
  dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
~~~

オプションの意味は、``/all``が必要な親機能もセットで有効化する、``/norestart``は再起動させないフラグ、の模様。

#### 3) PCを再起動する

再起動自体は必要なので再起動します。


## wslのコマンドの確認と導入

#### 0) PowerShellを管理者権限で実行し、コンソールを開く

#### 1) wslコマンドを確認する

~~~powershell 
  wsl -l
~~~
結果の例(これは後述の導入などが済んでいる場合です)：
~~~
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-24.04 (既定)
Ubuntu-22.04
~~~

#### 2) もし、wslコマンドが無いよ！と言われた場合は

wslをインストールする。

~~~powershell 
  wsl --install --no-distribution
~~~
これはwslのディストリビューションのインストールコマンドなのですが、
``--no-distribution``を指定すると、wslの基本的な仕組みだけ入れることができます。

環境によっては``--no-distribution``を解釈してくれないケースもあるようで、
その場合は仕方なしで飛ばす。（本当は要らないのかなこれ？）

#### 3) WSLのデフォルトバージョンを2に設定する

もしかしたら元から2で設定されている可能性もありますが、
これを設定することで、今後、バージョン2で確定で使われるようになります。
~~~powershell 
  wsl --set-default-version 2
~~~
ちなみに大雑把に言うと、1はLinuxもどきで、2はLinuxそのものが動いているらしい。
2が使える環境であるなら、1を使う必要はあまりないと思います。


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

wslコマンドが使えるようになったら、ディストリビューションをインストールします。

<details><summary>WSLのディストリビューションは</summary>
一般的にディストリビューションと言った場合、LinuxのOS本体＋基本的なソフトウェアを纏めたパッケージのカタマリ(それこそUbuntuやDebian)のイメージのことですが、WSLにおいてのディストリビューションは、インストールするだけでなく、起動や終了といった操作の対象になるもの(起動時にディストリビューション名を指定します)です。
つまり、仮想マシンのインスタンス名のようにも扱われているようです。
</details>

#### 1) インストール可能なディストリビューションを確認する

~~~powershell
  wsl -l --online
~~~
``-l --onlene``を指定すると、インストールできる一覧が確認できます。

<details><summary>結果の一例</summary>

```
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl --install -d <Distro>' を使用してインストールします。

NAME                            FRIENDLY NAME
Ubuntu                          Ubuntu
Debian                          Debian GNU/Linux
kali-linux                      Kali Linux Rolling
Ubuntu-18.04                    Ubuntu 18.04 LTS
Ubuntu-20.04                    Ubuntu 20.04 LTS
Ubuntu-22.04                    Ubuntu 22.04 LTS
Ubuntu-24.04                    Ubuntu 24.04 LTS
OracleLinux_7_9                 Oracle Linux 7.9
OracleLinux_8_7                 Oracle Linux 8.7
OracleLinux_9_1                 Oracle Linux 9.1
openSUSE-Leap-15.6              openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP5    SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
openSUSE-Tumbleweed             openSUSE Tumbleweed
```
</details>

#### 2) ディストリビューションのインストールをする

好きなディストリビューションを選び‥‥ここでは Ubuntu-22.04 を選んでいます。
``--install -d <ディストリビューション名>``でインストール。

~~~powershell 
  wsl --install -d Ubuntu-22.04
~~~

```
  インストール中: Ubuntu 22.04 LTS
  Ubuntu 22.04 LTS はインストールされました。
  Ubuntu 22.04 LTS を起動しています......
```

 プロンプト画面が別に起動し、しばらく待つとユーザーの名とパスワードを聞かれるので、最初のユーザとパスワードを登録してインストール完了。

<details><summary>プロンプト画面</summary>

```
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: tabito
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This message is shown once a day. To disable it please create the
/home/tabito/.hushlogin file.
tabito@MyComputer:~$
```

</details>

このプロンプト画面がそのままlinuxのシェルなのでこっちはUnixのコマンドで実行可能です。

<details><summary>[0x800701bc]エラー！</summary>

  Win10あたりだと、ユーザ名を聞かれずに
   ~~~
   WslRegisterDistribution failed with error: 0x800701bc
   ~~~
  というエラーがでてしまうことがあります。(これが出ると導入には失敗しています)

  これは、WSL2 Linux カーネルが古いためですので、
  [learn.microsoft.com](https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package)に貼られているリンクからパッケージをダウンロード・導入してから、もう一度インストールコマンドを実行すればうまく行くと思います。

</details>

#### 4) WSLの状態を確認する

``-l``の後に``-v``をつけると状態とWSLのバージョンが確認できます。
~~~powershell 
  wsl -l -v
~~~

~~~
    NAME            STATE           VERSION
  * Ubuntu-22.04    Stopped         2
~~~
VETSION 2であることを確認できればOK。


## WSLの操作

動作させるぶんにはコレで終わっているわけですが、
WSLの操作についてメモしておきます。

#### 起動してコンソールを開く

Windowsのスタートメニューにディストリビューションの名前で登録されているので、
それでシェルを開けられます。
![Ubuntu_Icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1443439/a5f207f7-f355-f089-b7fa-0f265dd49967.png)
この時、ディストリビューションが起動していなければ自動起動してくれます。

ちなみにPowerShell上でも`-d <ディストリビューション名> `で起動・シェル接続できます。
~~~powershell 
  wsl -d Ubuntu-22.04
~~~
この時は、PowerShell上のコンソールがそのままシェルになりますが、
カレントディレクトリが良く分からない所にいるので注意が必要です。これを避けるには
~~~powershell 
  wsl ~ -d Ubuntu-22.04
~~~
``-d``の前に``~``をつけると、アイコンから起動したのと同様、``/home/ユーザ名/``から始められます。

#### 止める
シェルを閉じてもディストリビューションは起動しっぱなしになるようです。
PCを落とすと止まりますが、自分で止めるなら``--terminate  <ディストリビューション名>``で止まります。
~~~powershell 
  wsl --terminate Ubuntu-22.04
~~~

#### 規定の変更

複数のディストリビューションを入れているところで、規定を変更したい場合は、
``--set-default <新しい規定のディストリビューション名>``です。
~~~powershell 
  wsl --set-default Ubuntu-22.04
~~~
ちなみに漠然と``wsl``コマンドだけ実行すると、``wsl -d <規定のディストリビューション名> ``と同じ動作、つまり、規定のディストリビューションの起動と接続になります。
``wsl ~``で規定かつhome配下で始められるので、これが一番楽でしょう。

#### アンインストール

``--unregister``で削除です。データ類は全て消えるのでご注意を。

~~~powershell 
  wsl --unregister Ubuntu-22.04
~~~

## WindowsとLinuxのデータのやりとり

#### WindowsからLinuxのフォルダを

  エクスプローラにLinuxの項目が追加されていて、そこからアクセスできます。
  ![Ubuntu_Folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1443439/127b229a-e576-8791-382d-5a186700a632.png)
  具体的なフォルダ名は`` \\wsl.localhost\Ubuntu-22.04`` みたいな感じになるようです。
  
#### LinuxからWindowsのフォルダを

 シェルからは、``/mnt/<ドライブ名>/～～～``で、ドライブを参照できます。

----

「いまどき」なんて書いてますが、
実のところ、私は「いつからこの形で、できるようになったか」というのは知らないで書いておりまして、ここ数年は、この形であった可能性があります。
  WSL1は2016年、WSL2は2019年、なので、WSL2として考えてもゆうに5年前からはあるテクノロジなんですけど、さすがにそのころは、コマンド一発ではなかったと思います。ディストリビューションをMicrosoft Storeから探してくる手順とかも見つかるもので‥‥なのでここ1年くらいではないかなとか考えています。

知っている人にとってはもう今更何やねんみたいな感じの記事なのかもしれません。
そう思ってもご容赦くださいませ。

----
独学のため正確でない可能性があります。
（っ・ｘ・）っ きゅ