What is WSL
- Windows Subsystem for Linux
- 少ないオーバヘッドで GNU/Linux の CLI Program を実行できる環境を提供する機能のこと
- 簡単に言うと Windows 上で bash が動く
本来は Windows 上で Linux プログラムは動かない
- Windows
- Linux
- Executable and Linkable Format
(補足)ファイルフォーマット
一言でいうとバイナリファイルの中身の作り方
Portable Executable(PE)
- Windows のローダが認識する実行可能ファイルのフォーマット
- EXE, DLL, SYS, FON など
- MS-DOS HEADER > MS-DOS REAL-MODE STUB PROGRUM > NT ヘッダ > セクションテーブル > セクションデータ
- Linux や 組み込み系で使われている
- C をコンパイルしたプログラム など
- ELF ヘッダ > プログラムヘッダ > セクションヘッダ
ELF を動かすために必要なこと
- Linux カーネルレベルの機能
- システムコール API(プロセス管理、メモリ管理など)
- Shell
- Package Manager
WSL では Linux システムコールを Windows の機能として用意し、Microsoft Store からダウンロードした Linux を動かす
WSL には Vesrion 1 と Vesrion 2 がある
v1 と v2 でアーキテクチャが全く違うので単純な後継バージョンではない。
- v1(since 2016/4/6)
- v2(since 2020/5/19 正式版)
Architecture の違い
- v1
- NT Kernel Driver(Pico Provider)が、Linux システムコール命令 → Windows システムコール命令 へ変換する
- ファイルシステム = VolFS
- Pico Provider(Linux) >(Linux SysCall)> Pico Provide(NT Kernel)r > (WinNT SysCall) > Windows NT Kernel
- v2
- Hyper-V 仮想マシン上で動く Linux カーネルでシステムコールを実行する
- ファイルシステム = 仮想ディスクに Linux ファイルシステム(ext4 とか)
- Linux 仮想マシン > (Linux SysCall) > Linux Kernel > (CPU 命令) > Hyper-V Hypervisior
WSL 1 の仕組み
v2 と共存可能ではあるけど、利点がないので省略
※Linux ディストリビューション単位で v1 と v2 の切り替え可能
WSL 2 の仕組み
- Hyper-V で軽量な Linux を動かす(Linux が動くのは仮想化技術の範囲)
- ホストマシン(Windows)とのやり取りは「9P」を介してやり取りする
- Win : p9rdr.sys(in Windows NT Kernel)
- Lin : /init
- /sys とか /proc とかの特殊ディレクトリも 9P でやり取り可能に!
Ubuntu だと 400 MB ぐらい・・!
ファイルシステムの違い
- ファイルシステム
- v1 : NTFS 上にマッピングした VolFS
- v2 : 仮想 HDD(root.vhdx)上の ext4
- アクセス方法
WSL を使ってみる
とても簡単(だけど苦労した)
- Windows 10 Version 2004 Build 19041 or later
- Windows 10 Home Edition でも OK
Install WSL
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --set-default-version 2
bash
echo "Hello WSL 2"
WSL 起動方法
とても簡単
- Command Prompt から bash
- Poershell から bash
- Ubuntu Application を Launch
explorer から ファイルシステムへアクセスする
Linux 側から Windows 側へアクセスする
xxxxx@DESKTOP-O5ES243:/$ cd /mnt
xxxxx@DESKTOP-O5ES243:/mnt$ ll
total 8
drwxr-xr-x 6 root root 4096 Oct 18 21:07 ./
drwxr-xr-x 19 root root 4096 Oct 18 21:12 ../
drwxrwxrwx 1 xxxxx xxxxx 512 Oct 18 20:55 c/
drwxrwxrwx 1 xxxxx xxxxx 512 Oct 18 20:55 d/
drwxrwxrwx 1 xxxxx xxxxx 512 Jan 1 1980 e/
drwxrwxrwt 2 root root 40 Oct 18 21:10 wsl/
シンボリックリンクをつけておくと楽
xxxxx@DESKTOP-O5ES243:/mnt/d/work$ sudo ln -s /mnt/d/work/linux-work/ /work
[sudo] password for xxxxx:
xxxxx@DESKTOP-O5ES243:/mnt/d/work$
xxxxx@DESKTOP-O5ES243:/mnt/d/work$ ll -ad /work
lrwxrwxrwx 1 root root 23 Oct 18 21:22 /work -> /mnt/d/work/linux-work/
Windows Terminal
get from Microsft Store
参考
https://roy-n-roy.github.io/Windows/WSL&コンテナ/Architecture/