はじめに
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
- 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。
Windows Subsystem for Linux Overview – Windows Subsystem for Linuxより
- 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
WSLの機能を有効化
PowerShellを管理者権限で開き、WSLの機能を有効化します。
PS C:\Users\xxx> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
機能を有効化するために再起動します。
この操作を完了するために、今すぐコンピューターを再起動しますか?
[Y] Yes [N] No [?] ヘルプ (既定値は "Y"):
そのままEnterを押します。
再起動後、「プログラムと機能」を開いて有効化しているか確認してみます。
設定
-> アプリ
-> プログラムと機能
-> Windowsの機能の有効化または無効化
有効化されていました。
Linuxディストリビューションのインストール
Microsoft Storeでもインストールできますが、今回はPowerShellでインストールしてみます。
Windows Subsystem for Linux ディストリビューションパッケージを手動でダウンロードする | Microsoft Docs
Ubuntu 18.04 をインストールするため https://aka.ms/wsl-ubuntu-1804
からファイルをダウンロードします。
その他のディストリビューションをインストールする場合は、上記リンクの「ディストリビューションのダウンロード」の項目を参考にしてください。
PS C:\Users\xxx> Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing
その後、インストールを実施します。
PS C:\Users\xxx> Add-AppxPackage .\Ubuntu.appx
WSLディストリビューションの初期化
スタートからインストールしたディストリビューションを起動します。
するとインストールが始まります。その後、ユーザ名、パスワードの入力が求められるので入力します。
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のローカルドライブがマウントされています。
$ 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
削除できました。最後にディストリビューションのパッケージを更新/アップグレードします。
$ sudo apt update && sudo apt upgrade
挙動確認
UbuntuコマンドラインからWindowsのディレクトリのファイル操作
$ 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
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
$ sudo vi /etc/wsl.conf
# Enable extra metadata options by default
[automount]
enabled = true
options = "metadata,umask=22,fmask=11"
その後、Windows側でファイルを作成します。
$ 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やサーバアプリケーションの実行は推奨されない。
-
Virtual Box/Hyper-Vのホスト型、Xen/VMware ESXiなどのハイパーバイザ型などの仮想化。 ↩ ↩2
-
推奨しないだけでインストールできるみたいです。「WSL上にXサーバをインストールしてGUIを実現する(VcXsrv編):Tech TIPS - @IT 」またWSL2だと問題なくなるかもしれません。 ↩
-
これはWSL1の構成でWSL2とは異なります。「完全なLinuxがWindows 10上で稼働する? 「WSL 2」とは」 ↩ ↩2