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
に必要な変更/追加を行います。
以下は私の好みの設定なので、好みに合わせて変更してください。
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
してください。
enable-bracketed-paste
の行を有効にします[!NOTE] WindowsTerminalではブラケットペーストモードを無効にすると確認ダイアログでチェックできるようになりますが、 ブラケットペーストモードを有効にすると確認ダイアログは出ず入力欄で確認できるようになります。
Teraterm のように二重チェックにならないので有効にしてもストレスは少ないと思い無効にしていません。
sudo tee -a /etc/inputrc << '__EOF__'
set bell-style visible
# set enable-bracketed-paste off
__EOF__
[!NOTE] WindowsTerminalの場合、beepを鳴らさない設定は
設定→各仮想環境の設定画面→詳細設定→ベル通知スタイル
からも変更できる。
私はシンプルな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
なんとなくいつも変更してるので。
pushd /usr/bin && \
sudo ln -sf bash sh && \
popd
ifconfig
とかroute
とかを使いたいので。
sudo apt install net-tools
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
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のバージョンはそのシチュエーションで変わるので、
インストールするのはマスタからクローンした環境で行う方がいいかも。
pyenv install --list | less
インストールが終わったらpip他をアップデートしておく。
(「pip 古いでぇ~」とうるさいので言われる前にやっとく)
pyenv install 3.12.4
pyenv shell 3.12.4
pip install --upgrade pip setuptools wheel
それまでの状態を保持した状態で新しい仮想環境を作成できます。
今までは一旦tarファイルにエクスポートしてからインポートしていましたが、
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
参考:Linuxがほぼそのまま動くようになった「WSL2」のネットワーク機能
向き | 可否 |
---|---|
HOST → WSL2 | localhost でアクセスできる |
WSL2 → HOST | localhost でアクセスできない。 IPアドレス指定ならアクセスできる。 |
Windows11の場合は、ネットワークをミラーモードに設定するとどちらもlocalhostでアクセスできます。
それどころか、外部PCからWSLの仮想環境内に直接アクセスできます。
ただし、ポート番号はWindows、各仮想環境で共通で使用されるので、
他で使用していないポート番号を使用しなければなりません。
ミラーモードに設定するには、%HOMEPATH%\.wslconfig
に以下のように設定します。
[wsl2]
networkingMode=mirrored
参考:WSL を使用したネットワーク アプリケーションへのアクセス/ミラー モードのネットワーク
参考:【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 ← 終了