Windows10でプログラミングをはじめる（１）　～WSL2によるLinuxの導入～

# 「はじめに」の前に (2022/1/27 追記)
以下の記事は古い内容となっております。

最新のインストール方法については、WSL2 インストールガイド：[Microsoft　Windows Subsystem for Linux Installation Guide for Windows 10](https://docs.microsoft.com/en-us/windows/wsl/install-win10)をご確認ください。

#はじめに
プログラミングを行うには準備が必要です．たとえば

- エディタ
- コンパイラ（C言語などコンパイラ型言語の場合）
- インタプリタ（pythonなどインタプリタ型言語の場合）
- バージョン管理システム
- デバッガ

こういった，プログラミングを行うにあたり必要となるものをまとめて**開発環境**などといいます．
そして，こういった環境を準備することを**環境を構築する**などといいます．

Windowsでプログラミングを行う場合，開発環境として次のようにいくつか選択肢があります：

- 統合開発環境（IDE）（Visual Studio, Eclipse等）
- エディタ（Emacs, Atom等）+コンパイラ（Cygwin, MinGW等）[^1]
- **Windows Subsystem for Linux**（**WSL**）

この記事では３番目の，WSL を用いて環境を構築する方法を説明します．

#WSL とは？

WSL は Windows Subsystem for Linux という名前の通り，Windows10 上に Linux 実行環境を作る仕組みです[^2]．

この記事を書いている時点では WSL1 と WSL2 という２つのバージョンがあります．

これらの２つのバージョンは実装がかなり異なっており，WSL1 が Linux システムコールを Windows API に変換する仕組みであるのに対し，WSL2 では専用の軽量な仮想マシンを使用して，実際の Linuxカーネルを動かします．

２つのバージョンの詳しい比較は Microsoftの公式ドキュメント（[Comparing WSL 1 and WSL 2](https://docs.microsoft.com/en-us/windows/wsl/compare-versions)）を参照してください．

ここでは WSL2 の利点をいくつか書いておきます：

- WSL1 に比べ，`git clone`，`apt undate`，`cmake`などのファイル処理が速い
- WSL1で使用できなかったDockerなどが動く
- 勝手に Linuxカーネルを更新してくれる

Dockerとか使ったことないんですけど，拡張性を考えると，とりあえず WSL2 にしたほうがいいんじゃないかと思います．

#WSL2 の導入前に
まずはWindowsのバージョンを確認しましょう．
Microsoftによると，WSL2 を導入するための要件は次の通りです：

>- x64 システムの場合:バージョン 1903 以降、ビルド 18362 以上。
- ARM64 システムの場合:バージョン 2004 以降、ビルド 19041 以上。

これを確認するためには，デスクトップ左下のWindowsアイコンをクリックし，「設定」>「システム」>「バージョン情報」を選択してください．画面を少しスクロールすると，次のように表示されます．
<img width="500" alt="バージョン情報の確認" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397727/4bacfd7a-bd41-0890-2dfb-09b49759399e.png">

「システムの種類」の項目に「x64 ベース プロセッサ」とあるので，画像のPCは「x64 システム」ということになります．
「ARM64 システム」の場合には，この項目が「ARM64 ベース プロセッサ」と表示されると思います．

x64 システムの場合にはバージョン1903以降，ビルド18362以上であればOKですが，画像の下の方を見ると「バージョン 1909」「OSビルド 18363.1440」とあるので，画像のPCは要件を満たしています．

自分のPCでも確認してみましょう．
最初に書いた要件を満たしていれば，WSL2 の導入に進んでください．

#WSL2 の導入と Linux のインストール
[Microsoft による WSL2 のインストールガイド](https://docs.microsoft.com/en-us/windows/wsl/install-win10)があるので，そちらを参照してください．
ここではMicrosoftのドキュメントが読みにくかった人向けの説明を書きます．

###1. PowerShellを管理者として起動する
デスクトップの左下にある検索窓に"powershell"と入力し，「管理者として実行する」をクリック（下図参照）．
<img width="600" alt="PowerShellを管理者として実行" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397727/dde1afe1-ab02-d5d1-e7ab-8009a0ccd64a.png">
「このアプリがデバイスに変更を加えることを許可しますか？」と表示されると思いますが，「はい」を選んでください．

下のようなウィンドウが表示されたらOKです．
<img width="600" alt="PowerShell" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397727/26444901-0960-f62b-7074-657881eee7f9.png">

###2. WSL を有効にする
上のようなウィンドウが表示されたら，そこに

``` :PowerShell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```
と入力し，Enterキーを押します．

うまくいけば，次のような表示が出ます．
<img width="600" alt="WSLの有効化" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397727/52895a68-fcbf-22c9-3a28-a28073ef0018.png">

###3. 仮想マシンの機能を有効にする
続いて

``` :PowerShell
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
と入力します．

うまくいけば，先ほどと同様に次のような表示が出ます．
<img width="600" alt="仮想化システムの有効化" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397727/9116a1a3-13d3-2e71-9bf0-b5cba4b5d4e2.png">

###4. PCを再起動する
ここまでできれば，一度PCを再起動します．

###5. Linux カーネル更新プログラム[^3]をインストールする
自分のPCのシステム（x64 または ARM64）に合わせて，次のリンクをクリックして，Linux カーネル更新プログラムのパッケージをダウンロードしてください．

- [Linuxカーネル更新プログラムのパッケージ（x64）](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)
- [Linuxカーネル更新プログラムのパッケージ（ARM64）](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_arm64.msi)

ダウンロードしたファイルを実行すると，プログラムのインストールが始まります．
次のような画面が表示されたらインストール完了です．
<img width="400" alt="Linuxカーネル更新プログラムのインストール完了ウィンドウ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397727/6af77293-9c28-6c0c-da50-af7f287055ea.png">

###6. WSLのデフォルトのバージョンをWSL2にする
新たに Linux ディストリビューションをインストールするとき，WSL1 と WSL2 とでは動作の仕組みが全く異なります．
WSL2 をデフォルトのバージョンに設定するために PowerShell で次のコマンドを入力します．

```:PowerShell
wsl --set-default-version 2
```

###7. Linux ディストリビューションを選択し，インストールする
まずはインストールする Linux ディストリビューションを選択します．

いろいろなディストリビューションが WSL ではサポートされています（[こちらのページ](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-3---enable-virtual-machine-feature)の「手順６」を参照）が，広く利用されている Ubuntu を選択するのが無難かと思います．

インストールするディストリビューションを決めたら，Microsoft Storeからインストールを行ってください（Ubuntu[^4]の場合は[こちら](https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6?activetab=pivot:overviewtab)からでも）．

以下では，Ubuntu をインストールした場合について書きます．

###8. Ubuntuを起動する
デスクトップ左下の検索窓に"ubuntu"と入力するなどして，Ubuntuを見つけ，起動しましょう．

起動すると次のようなウィンドウ（**ターミナル**）が表示され，ユーザ名の入力を促されます．
<img width="500" alt="Ubuntuターミナル" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397727/9a835197-31f1-33fd-ca8c-fb71391c9c3b.png">
ユーザ名を決めて入力しましょう．

その後，パスワードの入力が求められますから，それも入力してください．
（確認のために２回入力を求められます．）

セキュリティの都合上，パスワード入力しても画面に表示されませんが，実際にはちゃんと入力できているので安心してください．

パスワードの入力が完了すると，次のように`ユーザ名@ホスト名:~$`という文字（**プロンプト**）が左端に表示されます．
<img width="500" alt="Ubuntuターミナル" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397727/a13c50da-9507-fe35-c4e5-7877631774cd.png">
これで，**UNIX/Linuxコマンドが使用できるようになりました**．

たとえば，ルートディレクトリに移動（`cd /`）して，その中身を表示（`ls`）し，言語設定を確認（`echo $LANG`）してみると，次のようになります．
<img width="500" alt="コマンド例" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397727/a2db5a21-02a1-f392-d67b-1a3611a08573.png">

#おわりに
これで，Windows10にUbuntuが導入できました．

ところで上の画面，見にくくないですか？
青文字と黒背景とが判別しにくいですよね？

ウィンドウのデザインもダサくないですか？

次の記事では，この欠点を **Windows Terminal** により解決する方法について書きます．

#用語説明
<dl>
  <dt>Linux</dt>
  <dd>Linus Torvalds により開発が始められたオープンソースのOS．</dd>
  <dt>Linux カーネル</dt>
  <dd>Linux のうち 主要な部分で，ハードウェア制御を行う．</dd>
  <dt>シェル</dt>
  <dd>ユーザとカーネルとの間のインターフェース．ユーザは直接カーネルに指示を出せないので，シェルを通してカーネルに処理を命令したり，処理の結果を受け取ったりする．
  </dd>
  <dt>Linux システムコール</dt>
  <dd>シェルからLinux カーネルへの命令．</dd>
  <dt>ターミナルエミュレータ</dt>
  <dd>シェルに渡す指示の入力や，シェルからの結果を表示するためのソフトウェア．単に<strong>ターミナル</strong>ということも多い．</dd>
  <dt>Linux ディストリビューション</dt>
  <dd>Linux カーネルは Linux という OS の基礎的な部分でしかないので，そのままユーザに配布しても使い勝手が悪い．そのため，通常は Linux カーネルとその他便利なソフトウェアをセットにして配布する．このセットを Linux ディストリビューションという．</dd>
</dl>

#参考資料・読書案内
WSL1 の説明：[パソコン工房NEXMAG　WSLでWindows 10にLinux仮想環境を構築](https://www.pc-koubou.jp/magazine/21475)
WSL1 と WSL2 の比較：[Microsoft　Comparing WSL 1 and WSL 2](https://docs.microsoft.com/en-us/windows/wsl/compare-versions)
WSL2 インストールガイド：[Microsoft　Windows Subsystem for Linux Installation Guide for Windows 10](https://docs.microsoft.com/en-us/windows/wsl/install-win10)
Linux の基礎：[三宅英明, 大角祐介,『新しい Linux の教科書』, SB Creative (2015)](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E-ebook/dp/B072K1NH76?ref_=Oct_s9_apbd_orec_hd_bw_b26ma&pf_rd_r=K7EPK88SHVQ79CTDVKRF&pf_rd_p=c42b9ec6-091c-5d79-a173-1f372d3a6fc4&pf_rd_s=merchandised-search-12&pf_rd_t=BROWSE&pf_rd_i=502732)

[^1]: CygwinやMinGW自体はコンパイラではなく，「Windowsで動くLinuxのような環境」です．僕がはじめてWindowsでプログラミングをはじめたときは，この２番目の方法（Emacs+Cygwin）をとっていましたが，Cygwinの機能の１つであるCコンパイラ（gcc）を目的に使用していたため，Cygwinなどをコンパイラとみなしました．

[^2]: WindowsのPCでLinux環境を作る方法として「デュアルブートを行う」「VirtualBoxなどの仮想マシンを使用する」というやり方もあります．

[^3]: WSL2ではLinux カーネルを利用するわけですが，Linux カーネルはたびたび更新されます．この更新を WSL2 では自動で行ってくれますが，その役割を担うのがこの「Linuxカーネル更新プログラム」のようです．

[^4]: Microsoft Store には現時点で「Ubuntu」「Ubuntu 20.04 LTS」「Ubuntu 18.04 LTS」という３つのUbuntuがあります．これについては[こちらの記事](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1134055.html)を参照してください．