WSL2 メモ(改訂版)

WSL2のディストリビューションインストール~初期設定に関するメモ

インストール

WSL自体はインストール済みとします。
(インストール方法はぐぐってちょ)

ディストリビューションのインストールはコマンドプロンプト等で行います。

インストール可能なディストリビューション

オンラインでインストールできるディストリビューションの一覧は以下で表示できます。

wsl --list --online

新しいディストリビューションのインストール

表示されたディストリビューションからインストールしたいディストリビューションを選んでインストールします。
以下は Ubuntu-24.04 をインストールする例。

wsl --install Ubuntu-24.04

インストールが終了したら自動的にディストリビューションが起動してユーザアカウントとパスワードの設定が行われますので、 使用したいユーザ名とパスワードを設定してください。

セットアップ

引き続きセットアップを行います。

アップデート

まずはアップデート

sudo apt update
sudo apt upgrade 

[!TIP] ubuntu 24.04以降ならsudo apt -U upgrade でもOK。

日本語化

日本語化のため、以下のインストール/設定を行います。

sudo apt -y install language-pack-ja && \
sudo update-locale LANG=ja_JP.UTF8 && \
sudo apt -y install manpages-ja manpages-ja-dev 

クローンしたあとのデフォルトユーザを設定

クローンした環境ではデフォルトでrootでログインしてしまうので、
現在のユーザをデフォルトユーザに設定しておきます。
(マスタで設定しておけば、クローンする毎に設定しなくて済むので)

sudo tee -a  /etc/wsl.conf << __EOF__

[user]
default=$USER
__EOF__

[!NOTE] PATHにWindowsのPATHを引き継がせない設定
仮想マシン起動語、PATHにWindows環境のPATHが引き継がれます。
Windows環境のPATHを引き継がせないようにすることもできます。

設定方法は /etc/wsl.conf に 以下の設定を追加します。

[interop]
appendWindowsPath = false

参考: WSL2でWindowsのPATH設定が引き継がれるのを解除する

なお、下の .bashrcの設定 ではWindowsのPATHを引き継いだうえで、 WINDOWSディレクトリ下、VS Code格納ディレクトリ下以外のPATHを削除して不要なPATHを残さないようにしています。

ミニミニスクリプト

ちょっとした不便を解消するミニミニスクリプトを作成しておきます。

以下はExplorerと秀丸をシンボリックリンクでも実体を追いかけて開いてくれるスクリプト

[!NOTE] たとえば、explorer.exe /libと実行するとエクスプローラでは/libを開けません。
以下のスクリプトを作成した後、explorer /libと実行すると /libの実体である/usr/libが開かれます。

[!TIP] ~/binにpathを通すには、作成後再ログイン必要。

mkdir ~/bin

tee -a  ~/bin/explorer << '__EOF__'
#!/usr/bin/env bash
/mnt/c/WINDOWS/explorer.exe $(wslpath -w "${1}")
__EOF__

tee -a  ~/bin/hidemaru << '__EOF__'
#!/usr/bin/env bash
EDITOR="/mnt/c/Program Files (x86)/Hidemaru/Hidemaru.exe"
"${EDITOR}" $(wslpath -w "${1}")&
__EOF__

chmod +x ~/bin/*

.bashrcの設定

~/.bashrcに必要な変更/追加を行います。
以下は私の好みの設定なので、好みに合わせて変更してください。

tee -a ~/.bashrc << '__EOF__'


# プロンプトの設定
# PS1="\w\$ "
PS1="\[\e[36m\]$WSL_DISTRO_NAME\[\e[0m\]:\w\$ "

# キーバインドの設定
bind '"\C-n": history-search-forward'
bind '"\C-p": history-search-backward'

# ディレクトリスタックの表示改善
function pushd() {
    command pushd $* > /dev/null
    command dirs -v
}
function popd() {
    command popd $* > /dev/null
    command dirs -v
}
function dirs() {
    command dirs -v
}

# 表示色変更
export LS_COLORS='di=01;32:ln=01;36:ex=01;31:'
export GREP_COLORS='mt=01;31:ml=:cx=:fn=01;32:ln=32:bn=32:se=36'

# lessのオプション
export LESS="-iMRq"

# grepのオプション指定(GREP_OPTIONS)は廃止されたのでaliasで設定
# export GREP_OPTIONS="--exclude-dir .git"
alias grep='grep --exclude-dir .git'

# WindowsのPATHのうち、"WINDOWS"を含むディレクトリ、"VS Code"を含むディレクトリ以外を削除
export PATH=$(echo $PATH | python3 -c 'import re,sys;PPP=sys.stdin.readline();print(":".join([a for a in PPP.split(":") if re.match(r"^(?!\/mnt)", a) or re.match(r"(^/mnt.*WINDOWS.*$|^/mnt.*VS Code.*$)", a)]))')

# for pyenv
export PYENV_ROOT=/proj/.pyenv    #環境に合わせて修正してね
if [ -e $PYENV_ROOT ]; then
    export PATH=$PYENV_ROOT/bin:$PATH
    # 仮想環境名をプロンプトに表示しない場合は以下を有効化
    # export VIRTUAL_ENV_DISABLE_PROMPT=1
    eval "$(pyenv init --path)"          # pyenv 2.0以降で必要
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
    export PYTHON_CONFIGURE_OPTS="\
     --enable-shared\
    "
fi

# for nodenv
export NODENV_ROOT=/proj/.nodenv    # 環境に合わせて修正してね
if [ -e $NODENV_ROOT ]; then
    export PATH=$NODENV_ROOT/bin:$PATH
    eval "$(nodenv init -)"
fi

# __pycache__ディレクトリの生成を抑制する
export PYTHONDONTWRITEBYTECODE=1

<< '__COMMENT__'
# この部分はミラーモードでは使えないし、WSLgサポートされたので特に必要ないのでコメントアウト
# NATモードでは使えるが、hostコマンドインストール必要。(sudo apt install bind9-host)
# HOSTのIPアドレス取得
# export HOST_IP_ADDR=$(host `hostname`.mshome.net | sed -r 's/.*address (.*)$/\1/')
# HOSTのIPアドレス取得(アドレスが2つ以上返ってきたときは1個目だけ取り出す)
export HOST_IP_ADDR=$(host `hostname`.mshome.net | sed -r 's/.*address (.*)$/\1/' | sed -n 1p)

# DISPLAY変数が未定義(SSHログイン等)ならDISPLAYを設定する
if [ -v $DISPLAY ]; then
    export DISPLAY=${HOST_IP_ADDR}:0.0
fi
echo DISPLAY="$DISPLAY"
__COMMENT__

__EOF__

変更した内容を有効にするには、再ログインするか、source ~/.bashrcしてください。

readline(bash等)の設定

[!NOTE] WindowsTerminalではブラケットペーストモードを無効にすると確認ダイアログでチェックできるようになりますが、 ブラケットペーストモードを有効にすると確認ダイアログは出ず入力欄で確認できるようになります。
Teraterm のように二重チェックにならないので有効にしてもストレスは少ないと思い無効にしていません。

sudo tee -a  /etc/inputrc << '__EOF__'
set bell-style visible
# set enable-bracketed-paste off
__EOF__

[!NOTE] WindowsTerminalの場合、beepを鳴らさない設定は
設定→各仮想環境の設定画面→詳細設定→ベル通知スタイル
からも変更できる。

vimの設定

私はシンプルな1色表示が好きなのでsyntax highlightを無効にしておきます。
また、sudo vi実行時にも同じように動作するように、/rootにもコピーしておきます。

[!NOTE] /etc/vim/vimrcまたは/etc/vim/vimrc.localに記述するとシステム全体で有効なはずですが、 なぜかうまくいかないので自分とrootの設定を書き換えておきます。

tee -a ~/.vimrc << '__EOF__'
syntax off
__EOF__

sudo cp ~/.vimrc /root/

一旦リブート

ここまでの設定を反映するため、念のためリブートしておきます。

まず、ディストリビューションを停止します。
exitコマンドやCTRL-Dでシェルを終了します。
これだけではディストリビューションは終了していません。
(wsl -l -vで「Running」になっている)
コマンドプロンプト等から以下のコマンドでディストリビューションを終了します。

wsl --terminate Ubuntu-24.04

wsl -l -vで「Stopped」になっていることを確認し、再度ディストリビューションを起動します。
このとき、既に実行中のWindowsTerminalのドロップダウンメニューには新しいディストリビューションは表示されません。
あたらしくWindowsTerminalを開くとそのウィンドウのドロップダウンメニューには表示されますので、そこから実行します。

引き続きセットアップを行います。

ワークディレクトリの作成

ホームに色々置くのが嫌いなので。

sudo mkdir /proj /work && \
sudo chown $USER:$USER /proj /work

デフォルトshをbashに変更

なんとなくいつも変更してるので。

pushd /usr/bin && \
sudo ln -sf bash sh && \
popd

ツール類インストール

ifconfigとかrouteとかを使いたいので。

sudo apt install net-tools

pyenvのインストール

必要なツール類をインストール

sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
                    libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
                    xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git

pyenvのインストール

export PYENV_ROOT=/proj/.pyenv && \
git clone https://github.com/yyuu/pyenv.git ${PYENV_ROOT} && \
git clone https://github.com/yyuu/pyenv-virtualenv.git ${PYENV_ROOT}/plugins/pyenv-virtualenv  && \
git clone https://github.com/pyenv/pyenv-update.git ${PYENV_ROOT}/plugins/pyenv-update

pyenvを有効にするため、再ログイン(.bashrcに必要な処理は記載済み)。

pythonのインストール

使いたいpythonのバージョンはそのシチュエーションで変わるので、
インストールするのはマスタからクローンした環境で行う方がいいかも。

インストール可能なバージョンを確認

pyenv install --list | less

インストール

インストールが終わったらpip他をアップデートしておく。
(「pip 古いでぇ~」とうるさいので言われる前にやっとく)

pyenv install 3.12.4
pyenv shell 3.12.4
pip install --upgrade pip setuptools wheel

仮想環境の複製

それまでの状態を保持した状態で新しい仮想環境を作成できます。
今までは一旦tarファイルにエクスポートしてからインポートしていましたが、 vhdxファイルから直接インポートできるようになりました。

仮想HDDファイル(.vhdx)を探す

インストールしたディストリビューションを含む各仮想環境の名前とパスの一覧は 以下をコマンドプロンプト等で実行すると表示できる。

reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss /s ^
| findstr "BasePath DistributionName HKEY_CURRENT_USER"

[!TIP] 1行目末の^は次行に続くことを示す。linuxの\と同じ

[!NOTE] HKEY_CURRENT_USERを検索しているのは区切り位置を見やすくするため

仮想環境をクローンする

クローンする仮想環境を停止する

wsl --terminate Ubuntu-24.04

確認(Stoppedになっていることを確認)

 wsl -l -v
・・・・・

仮想環境をクローンする

クローン先に移動しておく

cd F:\WSL_VMs

クローンを作成するには以下のコマンドを実行する。

wsl --import ≪クローンの名前≫ ≪クローンの保存先≫ ≪クローン元のvhdxファイル≫ --vhd

例えば、

wsl --import Ubuntu-24.04-temp1 .\Ubuntu-24.04-temp1 %LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu24.04LTS_79rhkp1fndgsc\LocalState\\ext4.vhdx --vhd

クローンが完了したらクローンした仮想環境を実行します。

削除

不要になった仮想環境は削除する。

wsl --unregister «削除する仮想環境名»
wsl --unregister Ubuntu-24.04-2

WSL2上のサーバプログラムへのアクセス

参考:Linuxがほぼそのまま動くようになった「WSL2」のネットワーク機能

向き 可否
HOST → WSL2 localhost でアクセスできる
WSL2 → HOST localhost でアクセスできない。
IPアドレス指定ならアクセスできる。

Windows11の場合は、ネットワークをミラーモードに設定するとどちらもlocalhostでアクセスできます。
それどころか、外部PCからWSLの仮想環境内に直接アクセスできます。
ただし、ポート番号はWindows、各仮想環境で共通で使用されるので、 他で使用していないポート番号を使用しなければなりません。
ミラーモードに設定するには、%HOMEPATH%\.wslconfig に以下のように設定します。

[wsl2]
networkingMode=mirrored

参考:WSL を使用したネットワーク アプリケーションへのアクセス/ミラー モードのネットワーク

Virtualboxとの共存

参考:【REPORT】Ubuntu Desktop on VirtualBox と wsl2 の共存

要は「Windows ハイパーバイザープラットフォームを有効化する」だけど、設定箇所にたどり着くのがメンドクサイので 上の参考サイトを見てね。

なんかのときに使うかも

仮想ディスクが肥大化した場合の対処方法

WSL2を使っているパソコンのディスク容量が枯渇したときにやってみるべきこと
こっちの方が分かりやすかった。
仮想ディスクをコマンドラインから拡大/縮小する

PS: XXXX> diskpart                                                 ← コマンド起動

Microsoft DiskPart バージョン 10.0.19041.964

Copyright (C) Microsoft Corporation.
コンピューター: XXXXXX

DISKPART> select vdisk file="f:\WSL_VMs\openvino_2021_3\ext4.vhdx" ← 圧縮したいvhdxファイル

DiskPart により、仮想ディスク ファイルが選択されました。

DISKPART> detail vdisk                                             ← 縮小前の状態確認

デバイスの種類 ID: 0 (不明)
ベンダー ID: {00000000-0000-0000-0000-000000000000} (不明)
状態: 追加済み
仮想サイズ:  256 GB
物理サイズ:   20 GB
ファイル名: f:\WSL_VMs\openvino_2021_3\ext4.vhdx
子: いいえ
親ファイル名:
関連付けられたディスク番号: 見つかりません。

DISKPART> compact vdisk                                            ← 縮小の実行

  100% 完了しました                       ← ちょっと時間がかかる

DiskPart により、仮想ディスク ファイルは正常に圧縮されました。

DISKPART> detail vdisk                                             ← 縮小前の状態確認

デバイスの種類 ID: 0 (不明)
ベンダー ID: {00000000-0000-0000-0000-000000000000} (不明)
状態: 追加済み
仮想サイズ:  256 GB
物理サイズ:   12 GB                      ← 小さくなった
ファイル名: f:\WSL_VMs\openvino_2021_3\ext4.vhdx
子: いいえ
親ファイル名:
関連付けられたディスク番号: 見つかりません。

DISKPART>exit                                                      ← 終了