Windows上のLinux開発環境構築ガイド:WSL 2とUbuntuのインストール・設定・運用

【概要】WSL 2(Windows Subsystem for Linux 2)は、Windows上でLinuxカーネルを実行するための仕組みであり、軽量な仮想マシン技術を利用してLinux環境を提供する。ハードウェア仮想化支援機能を利用するため、PCによってはBIOS/UEFI設定での有効化が前提となる場合がある(詳細はトラブルシューティングを参照)。WSL 2を利用するには、wsl --installコマンドを実行する方法があり、このコマンドは必要なWindows機能の有効化とLinuxディストリビューション(以下、ディストリビューション。本稿ではUbuntuを例とする)のインストールをまとめて行う。この方法が利用できない場合は、Windowsの機能を個別に有効化したうえでディストリビューションをインストールする。インストール後、bashコマンドでLinuxシェル(Bash)を起動し、Linuxコマンドを実行できる。また、wslコマンドを使用してWSL自体の管理を行う。運用時には、.wslconfig設定ファイルを用いることで、メモリ使用量、スワップ領域、CPUコア数などを調整できる。WSL 2上にインストールしたUbuntuに開発ツールを導入することで、コンパイラの動作確認やプログラムのテストが可能である。Windows 11ではWSLg機能により、LinuxのGUIアプリケーションも追加設定なしで利用できる。

【目次】

  1. WSL 2の有効化
  2. Ubuntu(ディストリビューション)のインストール
  3. 基本的な使い方:bashとwslコマンド
  4. WSL 2の設定と.wslconfigファイル
  5. Ubuntuの初期設定
  6. 開発環境のセットアップ例(C/C++/Python)
  7. ネットワーク設定(ポートフォワーディング・ファイアウォール)
  8. WSLgによるGUIアプリの利用
  9. トラブルシューティング

主なwslコマンド:

【サイト内の関連ページ】

WSL 2の有効化

このセクションでは、WSL 2を利用するために必要なWindows機能を有効化する。現在のWindowsではwsl --installコマンドが必要な機能の有効化からディストリビューションのインストールまでを自動で行う。この自動化された方法でエラーが発生する場合や、機能を個別に制御したい場合は、後述の「必要なWindows機能の有効化(コマンド操作)」を参照のこと。

WSL 2の動作要件:WSL 2を利用するにはWindows 11、またはWindows 10 version 2004以降(Build 19041以降)が必要である。本稿ではWindows 11を前提として説明する。

前提:Windows Updateの実行

以下のコマンドを実行してWindows Updateを開き、更新プログラムを確認・適用する。

powershell -command "Start-Process ms-settings:windowsupdate"
Windows Update画面

更新後、再起動が要求された場合はWindowsを再起動する。

wsl --installによる一括セットアップ

管理者権限のコマンドプロンプト(またはPowerShell)でwsl --installを実行する。このコマンドは、WSLに必要なWindows機能(Linux用WindowsサブシステムおよびVirtual Machine Platform)の有効化、WSLカーネルのインストール、および既定のディストリビューション(Ubuntu)のインストールをまとめて実行する。実行後、Windowsの再起動を求められた場合は再起動する。

wsl --install

この方法でセットアップが完了する場合は、本セクションの以降の手動操作は不要であり、「Ubuntuの初期設定」へ進んでよい。特定のディストリビューションを指定してインストールする手順は次のセクションで説明する。

管理者権限のコマンドプロンプトの起動

以降のコマンド操作は、管理者権限のコマンドプロンプトで実行する。起動手順は次のとおりである。Windowsキーを押す、またはスタートメニューを開き、cmdと入力して表示された「コマンド プロンプト」を右クリックし、「管理者として実行」を選択する。

必要なWindows機能の有効化(コマンド操作)

wsl --installが利用できない場合や、機能を個別に有効化したい場合は、以下のコマンドを実行してWSL 2に必要なWindows機能を有効化する。

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

Windows Proエディションの場合は、追加で以下も実行する。

dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all /norestart

上記Hyper-Vに加え、必要に応じて以下のハイパーバイザープラットフォーム機能も有効化する。

dism.exe /online /enable-feature /featurename:HypervisorPlatform /all /norestart
dism.exeコマンドの実行結果
機能有効化の完了メッセージ

有効化可能な機能名の一覧は、powershell Get-WindowsOptionalFeature -Onlineで確認できる。

WindowsOptionalFeature一覧

再起動

機能の有効化を完了するため、Windowsを再起動する。

shutdown /r /t 0
再起動コマンドの実行

GUIでの有効化手順(コマンド操作の代替方法)

コマンド操作でエラーが発生する場合や、GUIでの操作を希望する場合は、以下の手順で機能を有効化できる。
  1. 「コントロールパネル」を開く
  2. 「プログラム」を選択する
  3. 「プログラムと機能」を選択する
  4. 画面左側の「Windowsの機能の有効化または無効化」を選択する
  5. 「Windowsの機能の有効化または無効化」で、以下の項目にチェックを入れ、「OK」をクリックする
    • Linux用Windowsサブシステム(または Windows Subsystem for Linux)
    • 仮想マシンプラットフォーム
    • (Windows Proエディションの場合)Hyper-V
コントロールパネル
プログラムと機能
Windowsの機能の有効化または無効化

Ubuntu(ディストリビューション)のインストール

ここでは、WSL 2上にUbuntuをインストールする手順を説明する。wsl --installを引数なしで実行した場合は既定でUbuntuがインストールされるが、以下では特定のバージョンを明示的に指定する手順を示す。

  1. 管理者権限のコマンドプロンプトで、利用可能なディストリビューションを確認する
    wsl --list --online
    
    利用可能なディストリビューション一覧
  2. WSL本体(カーネル等)を最新の状態に更新する
    wsl --update
    
  3. Ubuntu 24.04をインストールする。他のバージョンやディストリビューションをインストールする場合は、-dオプションに続けて一覧表示された名前を指定する
    wsl --install -d Ubuntu-24.04
    
    Ubuntuのインストール

    インストール完了後、初回起動時にUbuntuで使用するユーザー名とパスワードの設定を求められる。このパスワードは、sudoコマンドで管理者権限が必要な操作を行う際に使用する

基本的な使い方:bashとwslコマンド

bashコマンドの使用(Linux環境の操作)

bashコマンドを実行すると、既定に設定されているディストリビューションのLinuxシェル(Bash)が起動し、Linuxコマンドを実行できる。通常、インストール時に設定したユーザー権限で起動する。exitコマンドでシェルを終了する。

bash
pwd
exit
bashコマンドの実行

bash -c "コマンド"の形式で、対話シェルを起動せずに単一のLinuxコマンドを実行することも可能である。

bash -c "pwd"
bash -cコマンドの実行

主要なLinuxコマンドについては、関連ページ「Linux基本コマンドとその活用法」を参照のこと。

wslコマンドの使用(WSLシステムの管理)

ディストリビューション管理

WSL 2のシャットダウン

実行中のすべてのWSLインスタンスを停止する。.wslconfigの変更を反映させる際や、動作が不安定な場合に使用する。

wsl --shutdown

ディストリビューションのエクスポート(バックアップ)とインポート(復元)

ディストリビューションの状態をtarファイルにバックアップする。

wsl --export Ubuntu-24.04 ubuntu-backup.tar

バックアップファイルから新しいディストリビューションとして復元する。

wsl --import MyUbuntu C:\WSL\MyUbuntu ubuntu-backup.tar

コマンドの使い分け

WSL 2の設定と.wslconfigファイル

WSL 2は仮想マシン上で動作するため、リソースを多く消費する開発作業では、メモリやCPUコア数の割り当てを調整できる。

設定ファイルは%UserProfile%\.wslconfig(例:C:\Users\ユーザー名\.wslconfig)に配置する。このファイルは既定では存在しないため、新規に作成する。

.wslconfig設定例

[wsl2]
memory=4GB
swap=2GB
processors=4
設定項目:

値の単位を省略するとバイト単位として扱われる。GBMBなどの単位を明示すること。

設定方法

  1. テキストエディタ(メモ帳など)で.wslconfigファイルを%UserProfile%ディレクトリに作成または開く。コマンドプロンプトで以下を実行する
    cd %UserProfile%
    notepad .wslconfig
    
    .wslconfigファイルの作成
  2. メモ帳で必要な設定を記述し、ファイルを上書き保存する
    .wslconfigファイルの編集
  3. 設定を反映させるために、WSL 2を再起動する。コマンドプロンプトで以下を実行する
    wsl --shutdown
    
    WSL 2の再起動

    次にWSLを起動した際に設定が反映される

設定値を変更した場合は、wsl --shutdownを実行してWSLを再起動しないと変更は反映されない。すべてのインスタンスが停止するまで数秒かかる。停止状態はwsl --list --runningで確認できる。

Ubuntuの初期設定

Ubuntuのインストール後、以下の初期設定を行う。コマンドは、UbuntuのLinuxシェル(Bash)内で実行する(bashコマンドでシェルを起動)。管理者権限が必要なコマンドにはsudoを付加する。

aptパッケージリポジトリのミラーサーバー変更(任意)

ダウンロード速度を向上させるため、パッケージのダウンロード元を日本のミラーサーバーに変更する。変更しない場合はこの手順を省略する。

Ubuntu 24.04では、パッケージリポジトリの設定形式がdeb822形式に変更され、設定ファイルが/etc/apt/sources.list.d/ubuntu.sourcesに移動している。従来の/etc/apt/sources.listは空または存在しない場合がある。

まず、使用されている設定ファイルを確認する。

# 設定ファイルの存在確認
ls -la /etc/apt/sources.list /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null

/etc/apt/sources.list.d/ubuntu.sourcesが存在する場合(Ubuntu 24.04のデフォルト)は、以下のコマンドでミラーサーバーを変更する。

# バックアップを作成
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak

# ミラーサーバーを日本に変更
sudo sed -i 's|http://archive.ubuntu.com|http://jp.archive.ubuntu.com|g' /etc/apt/sources.list.d/ubuntu.sources
sudo sed -i 's|http://security.ubuntu.com|http://jp.archive.ubuntu.com|g' /etc/apt/sources.list.d/ubuntu.sources

従来形式の/etc/apt/sources.listを使用している場合は、以下のコマンドを実行する。

# バックアップを作成
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# ミラーサーバーを日本に変更
sudo sed -i 's|//archive.ubuntu.com|//jp.archive.ubuntu.com|g' /etc/apt/sources.list
sudo sed -i 's|//security.ubuntu.com|//jp.archive.ubuntu.com|g' /etc/apt/sources.list

パッケージリストの更新とアップグレード

システムを最新の状態に更新する。

sudo apt update
sudo apt -yV upgrade
# オプション:ディストリビューション全体のアップグレード(カーネル等も更新される場合がある)
sudo apt -yV dist-upgrade

開発環境のセットアップ例(C/C++/Python)

ここでは例として、C/C++およびPythonの基本的な開発環境をUbuntu上にインストールし、動作確認を行う。コマンドはUbuntuのLinuxシェル(Bash)内で実行する。

必要なパッケージのインストール

C/C++コンパイラ(gcc、g++)、makeツール、Python3開発ヘッダ、pipなどをインストールする。

sudo apt update
sudo apt -y install build-essential python3-dev python3-pip wget ca-certificates

Cコンパイラ(gcc)の動作確認

テキストエディタ(例:nano)を使用して、Cプログラムを作成する。

nano hello.c

エディタが開いたら、以下の内容を入力または貼り付ける。

#include<stdio.h>
int main() {
    printf("Hello, World!\n");
    printf("sizeof(size_t)=%zu\n", sizeof(size_t));
    return 0;
}

Ctrl+Oを押し、Enterキーでファイルを保存する。その後、Ctrl+Xnanoを終了する。

作成したプログラムをコンパイルして実行する。

gcc -o hello hello.c
./hello

以下のような出力が表示されれば成功である。

Hello, World!
sizeof(size_t)=8
Cプログラムの実行結果

Python 3の動作確認

Python 3のバージョンを確認し、コードを実行する。

python3 --version
python3 -c 'print("Hello, Python!")'

以下のような出力が表示されれば成功である。

Python 3.x.y
Hello, Python!
Pythonの実行結果

ネットワーク設定(ポートフォワーディング・ファイアウォール)

WSL 2内で起動したサーバー(例:Webサーバー)にWindows側や他のPCからアクセスするには、ネットワーク設定が必要になる場合がある。WSL 2の既定のネットワークモードはNAT(Network Address Translation)であり、この場合はポートフォワーディングとファイアウォールの設定が必要になることがある。

ミラードネットワーキングモードについて:Windows 11 22H2以降では、.wslconfignetworkingMode=mirroredを設定することで「ミラードモード」を利用できる。このモードではWindowsのネットワークインターフェースがLinux側に反映され、localhost(IPv4の127.0.0.1)でWindowsとWSL 2を相互に接続できるほか、LANからWSL 2への接続も容易になる。このモードではNATモードでのポートフォワーディング設定が不要になる場合が多い。
[wsl2]
networkingMode=mirrored

設定後はwsl --shutdownでWSLを再起動して反映する。

以下では、既定のNATモードを前提としたポートフォワーディングとファイアウォールの設定手順を説明する。

ポートフォワーディングとは、特定のポート(通信の窓口)への接続を別のアドレスに転送する仕組みである。NATモードのWSL 2は独自の仮想ネットワークを持つため、Windowsが受けた接続をWSL 2に転送する設定が必要となる。

ポートフォワーディングの設定

  1. WSL 2のIPアドレス確認:WSL 2のIPアドレスを確認する。コマンドプロンプトから次のコマンドで取得できる(大文字の-Iを使用すること)
    wsl hostname -I
    

    UbuntuのLinuxシェル(Bash)内で確認する場合は、次のコマンドも利用できる

    ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1
    
    WSL 2のIPアドレス確認

    NATモードでは、WSL 2のIPアドレスはWSLの再起動などで変更される可能性がある。接続できなくなった場合は、再度IPアドレスを確認すること

  2. Windowsでポートフォワーディング設定:管理者権限のコマンドプロンプトで、Windowsのポートフォワーディングを設定する。以下の例では、Windowsの80番ポートへのアクセスを、手順1で確認したWSL 2のIPアドレスの80番ポートに転送する
    netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=<WSL2のIPアドレス>
    

    <WSL2のIPアドレス>は、手順1で確認した実際のIPアドレスに置き換える。PowerShellで実行する場合は、次のようにコマンド置換でIPアドレスを指定することもできる。wsl hostname -Iの出力には複数のIPアドレスや末尾の空白が含まれることがあるため、整形してから指定する

    $wslIp = (wsl hostname -I).Trim().Split()[0]
    netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=$wslIp
    
    ポートフォワーディング設定

    設定を削除する場合は、以下のコマンドを実行する

    netsh interface portproxy delete v4tov4 listenport=80 listenaddress=0.0.0.0
    
目的:NATモードのWSL 2は独自の仮想ネットワークを使用するため、外部(Windowsホストや他のマシン)からWSL内のサーバー(例:80番ポートのWebサーバー、3306番ポートのデータベース)へアクセスするにはポートフォワーディングが必要である。

ファイアウォール設定

Windows Defenderファイアウォールが有効な場合、WSL 2への着信接続を許可するルールを追加する必要がある場合がある。NATモードで通常のWindowsファイアウォールルールを追加するには、管理者権限のPowerShellで以下のコマンドを実行する(例:80番ポートへのTCP接続を許可する場合)。

New-NetFirewallRule -DisplayName "WSL 2 Inbound Port 80" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80

-DisplayNameは識別用の名前、-LocalPortには許可するポート番号を指定する。

Hyper-Vファイアウォールについて:Windows 11 22H2以降かつWSL 2.0.9以降では、Hyper-Vファイアウォール機能が既定で有効になっている。ミラードモードでは着信制御がこのHyper-Vファイアウォール側で行われるため、次のミラードモード向けの設定を使用する。
ミラードモードでのファイアウォール設定:ミラードネットワーキングを利用している場合は、Hyper-Vファイアウォールが着信を制御する。着信を許可するには、管理者権限のPowerShellで以下のいずれかを実行する。

方法1:個別のポートに対してルールを追加する(例:80番ポート)

New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80

方法2:WSL向けの既定の着信動作を許可に変更する

Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
セキュリティ上の注意:ファイアウォールでポートを開放すると、同じネットワーク上の他のマシンからもアクセス可能になる。信頼できないネットワークに接続している場合は、開発作業終了後にルールを削除するか、接続元IPアドレスを制限する。ルールを削除するには、以下のコマンドを実行する。
Remove-NetFirewallRule -DisplayName "WSL 2 Inbound Port 80"

WSLgによるGUIアプリの利用

Windows 11ではWSLg(WSL GUI)機能が組み込まれており、追加設定なしでWSL 2上のLinux GUIアプリケーションを利用できる。

例えば、UbuntuにGUIテキストエディタgeditをインストールすると、Windowsのスタートメニューから直接起動したり、Ubuntuのターミナルからgeditコマンドを実行したりすることで、Windows上にgeditのウィンドウが表示される。

UbuntuのLinuxシェル(Bash)で以下を実行してgeditをインストールする。

sudo apt update
sudo apt install gedit -y

インストール後、ターミナルで以下を実行するとgeditが起動する。

gedit
geditのインストール
geditの起動画面

WSLgの詳細については、公式リポジトリ(https://github.com/microsoft/wslg)を参照のこと。

トラブルシューティング

BIOS/UEFI設定の確認

WSL 2はハードウェア仮想化支援機能を利用する。PCによっては、この機能がBIOS/UEFI設定で無効になっている場合がある。WSL 2のインストールや起動に問題がある場合は、以下の設定が有効になっているか確認すること(名称はマザーボードメーカーにより異なる場合がある)。

BIOS/UEFIメニューへのアクセス方法はPCによって異なるが、以下のコマンドを管理者権限のコマンドプロンプトで実行すると、再起動後にBIOS/UEFI設定画面に入れる場合がある。

shutdown /r /fw /t 0

コマンドの説明:/r(再起動)、/fw(ファームウェアUIへ移行)、/t 0(即時実行)

CPUの仮想化機能サポート状況確認(Windows)

Windows上でCPUが仮想化機能をサポートし、有効になっているかを確認するには、管理者権限のコマンドプロンプトで以下のPowerShellコマンドを実行する。

powershell -c "Get-CimInstance -ClassName Win32_Processor | Select-Object Name, VirtualizationFirmwareEnabled, SecondLevelAddressTranslationExtensions"

実行結果例:

仮想化機能の確認結果

確認ポイント:

WSLおよびディストリビューション関連の問題

bashコマンド関連の問題