4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WSL2環境構築 個人用メモ(2021年9月版)

Last updated at Posted at 2021-09-05

(追記 2023-03-25)Windows10 / Windows11両方でWSLgが使えるようになり、X11を使うハードルが激下がりしたので当時頑張って書いた「WSL2側とWindows側でのclipboardの共有」の手順は大幅にカット出来ると思います。

WSL周りは現在進行系で開発が進んでおり、検索しても古い情報が入り混じったりして意外と混乱する(気がする)。

今回、改めてWSL2の環境構築をし直す機会があったので自分用にメモ。
特に、以下の点にフォーカスしている:

  • 同一ディストリビューションの環境を複数所有、切り替え
  • WSL2側とWindows側でのclipboardの共有
    • X11(VcXsrv)を使うパターン
    • X11を使わずに何とかする(win32yankなどを使う)パターン
  • ターミナルUIの整備(特にWindows Terminalを使うパターン)

※注意

  • WSLそのもののインストールの話はあまり書いてなくて、どちらかというとインストールした後の細々とした話が中心です
  • あと力尽きて参照リンク貼って終わりみたいなところも多いです(所詮自分用メモなので)
  • 時間経つと状況はすぐ変わると思うのでご注意ください。(Windows Insider ProgramではWSLgなどが出ていたりしますし。←正式版が待ち遠しいですね。)

0. 実行環境

  • Windows10Pro バージョン21H1(OSビルド 19043.1165)
    • winverで確認出来る
  • 入れたディストリビューション: Ubuntu(20.04)
    • WindowsストアではUbuntuUbuntu20.04LTSが独立に存在する(どちらも執筆時点では20.04LTS)
    • どうでも良いが今回は前者の方を使って作業

1. WSL2のインストール

公式ガイドなどを参考に入れる。(手動インストールの手順を順次実行していく)

とりあえずUbuntuあたりをインストールする

※今回WSL自体は入っている状態から作業しているのでこの辺の記憶は曖昧。。。ここが詳しく知りたい人は別の記事を漁ってください。

2. 環境の複製

Windowsストアで入れたディストリビューションについて、複数使い分けられると便利(例えばWindowsストアで入手したばかりプラスαくらいの環境をexportしておけば、それをベースにして用途に応じた環境の使い分けが出来る)
のでやり方を確認しておく。

WindowsPowerShellからwslコマンドを使い、環境のexportとimportを行うことで環境が複製可能。
使うオプションはwsl --helpを実行するかコマンドリファレンスのWindows Subsystem for Linux を管理するための引数などから確認出来る。
今回参照するのは以下の3つ:

  • --export
  • --import
  • --unregister

2-1. 環境のexport

  • wsl --export <Distro> <FileName>

で環境をtarファイルとしてexport出来る

例えば、以下のように環境Ubuntuが存在する場合:

PS C:\Users\username> wsl -l -q
Ubuntu

以下のようにしてtarファイルにexport出来る:

PS C:\Users\username> wsl --export Ubuntu .\WSL_IMAGES\BASE\ubuntu-20.04.tar

上の例では<ユーザーのホームディレクトリ>\WSL_IMAGES\BASEに事前に格納用のフォルダを作っていて、その中にubuntu-20.04.tarの名前で保存している。(深い意味は無く、割と何でも良いと思われる)

ユーザーを作っただけのほぼまっさらなUbuntuの場合、上記のexportは10数秒~数10秒くらいで終わった。
tarのファイルサイズは1GB強といった感じ。

2-2. 環境のimport

  • wsl --import <Distro> <InstallLocation> <FileName>

のようにしてtarファイルから環境を作成出来る。

このとき、作成した環境のイメージファイルをどこに置くのかも指定しないといけない。

例えば、

PS C:\Users\username> wsl --import Ubuntu20.04-Base .\WSL_IMAGES\DISTRO\Ubuntu20.04-Base .\WSL_IMAGES\BASE\ubuntu-20.04.tar

のようにすると、Ubuntu20.04-Baseという名前で先ほど作ったtarファイルをもとにした環境が作成出来る。

image.png

なお、上記のパス: .\WSL_IMAGES\DISTRO\Ubuntu20.04-BaseについてDISTROにあたるところまでは事前にフォルダを作成する必要がある。
(ここのパスも深い意味は無く、自分で管理しやすいところに作れば良いと思われる)
ちなみに、ここで指定したパスにはext4.vhdxというハードディスクイメージのファイルが作成される。

image.png

ここから更に

PS C:\Users\username> wsl --import Ubuntu20.04-Test .\WSL_IMAGES\DISTRO\Ubuntu20.04-Test .\WSL_IMAGES\BASE\ubuntu-20.04.tar

などとすることで、、同じtarファイルから異なる複数の環境を作成出来る。

注意:importで作った環境のログインユーザーについて

何故かデフォルトではrootでログインするようになってしまうのが難点。

などを参考にpowershellからレジストリを編集して変えることが出来るらしい。
後述のように、例えばWindows Terminalを使う場合なら起動オプションを編集することでも対処可能)

(追記)

後述するwslconfによっても対処出来る模様。

2-3. 環境の削除

  • wsl --unregister <Distro>

とすることで不要な環境を削除出来る。

例えば、

PS C:\Users\username> wsl --unregister Ubuntu20.04-Test

のようにして先ほど作った環境Ubuntu20.04-Testを削除出来る。

(参考)

また、

によると、WSLから作ったtarファイル以外からでも環境を作成することが可能らしい。
(リンク先の例だとDockerで作ったCentOSコンテナのtarファイルを使うことで、WSL2にCentOSを入れている模様)

Windowsストアで入手出来ない、あるいは有料になってしまうディストリビューションも上記のようにして入れられる可能性がある。
(それこそDockerやその他仮想マシンなどで事足りるケースも多そうなので、そこまでしてWSL2で使いたいのかというところはあるが。。。)

3. clipboardの共有

可能ならWSL2のLinuxとホスト側のWindowsでclipboardを共有したいところ。
ターミナルから右クリックだったりCtrl + C/Vなどでなんとなくごまかせることもあるが、やはり機能としては弱くて不自由になる。
(個人的にはvimを使っているときにclipboard機能が使えないとかなり支障が出る)

X11を使うものと使わないものとで大きく2通りの対処方があるのでそれぞれまとめる。

3-1. VcXsrvを使ったclipboardの共有

※自分でやったのが半年以上前になるので詳しくは書いていない

Windowsで使えるフリーのX11サーバーソフトであるVcXsrvを使ってGUI機能をONにすることが1つ目の解となる。
WSL2を使う場合、WSL1のときよりも設定が数段面倒だったりするので注意。

(ちなみにWSLgが一般リリースされたら、ここの手順が無くなって非常に楽になるんじゃないかと期待している)
(追記 2023-03-23) 今ではWSLgがほとんどの環境で使えるため、わざわざサードパーティーのツールを入れるメリットは無いと思われる。WSLgは何もしなくてもデフォルトで有効なため、あとはaptなどのパッケージ管理ツールでxclipやwl-clipboardをインストールしてそれでおしまいだと思われる。

この方法は先行記事として

などがあり、この辺りを参考にして設定すれば良い。GitHubのissue: Can't use X-Server in WSL2も参照のこと。

注意点として、WSL2を実行する仮想マシンとホストのWindowsをネットワークでつなぐ関係上、FireWallを開ける設定が必要になることが挙げられる(例えばパブリックでアクセスを許可する、などの必要)。WSL1よりも設定をゆるくしないと動かないので、状況次第では注意が必要かもしれない。

例えば以下:

などを参考に設定を行う。

上記X11周りの設定が出来ていれば、例えばxclipなどを使ってLinux側のclipboardとWindows側のclipboardを接続・共有することが出来る。

3-2. win32yank

今回個人的に行ったケースだとclipboard共有だけできれば良くて(他のGUIソフトを使う訳じゃないので必ずしもX11は不要)、あとはあまりファイアーウォールの設定を変えたくない事情があったので代替策を検討した。

一番無難そうなのだとWindows側のclip.exeを呼び出すようにする方法があるらしい。

が、

の「追記」などにあるように遅かったりするらしいのと、個人的にWSL2でWindowsの実行パスは引き継がないようにしたい(つまり普通にはclip.exeを呼び出せない)ので、別の方法を検討した。

結果として、(あまり外部ツールは入れたくなかったが)win32yankを入れる形で妥協することにした。

インストールはWSL2側でリリースページから最新版(執筆時点で0.0.4)のx64あたりをダウンロードしてunzipし、chmod +xなどで実行権限を付与してから環境変数PATHの通った場所に置く。

ここで、自分の場合はtmuxとNeoVimを使っているので

を参考に設定を行った。すなわち、.tmux.conf

.tmux.conf(追記分)
# vimのキーバインドを使う場合
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "win32yank.exe -i"
bind p run-shell 'win32yank.exe -o | xargs -0 -I{} tmux set-buffer -- {} && tmux paste-buffer'

を追記した。
なお、NeoVimを使う際は自分で"+"レジスタを指定してclipboardを使っているが、そのような使い方であれば特にinit.vimなどを変更する必要は無く、普通に動いた。
(NeoVimはClipboard toolとしてwin32yankを自動で認識するため。←:checkhealthなどで確認出来る。Vim8.1などでは設定が必要と思われる。)

4. ターミナル環境の整備

デフォルトのコンソールは何かと使い勝手が良くないので、代替のツールを導入していく

4-1. Windows Terminal

Windowsストアからインストールして使える。
なお、記事作成時のバージョンは1.9.1942.0である。(今後開発が進んでいくと設定がより便利になるかもしれない)

ここでは主に以下の設定を行う:

  1. WSL2におけるログイン設定の変更
  2. キーバインドの変更

4-1-1. ログイン設定の変更

Windows TerminalでWSLを開くと、デフォルトだとLinux側のホームディレクトリではなくWindows側のホームディレクトリで起動して鬱陶しいことが多い。
また、importして作ったユーザーだと設定を変えないとrootユーザーでログインするのもあまり気分が良くなかったりする。

この辺りはWindows Terminalで各環境(プロファイル)の設定を編集することで回避出来る。

まずはキーボードからCtrl + ,を押すか、新しいタブを開くところのオプションから普通に「設定」を押して設定画面を新しいタブで開く。
image.png

PowerShellやコマンドプロンプトなどと並び、作成済みの環境が左側の「プロファイル」に一覧として出ているので、適宜選択する。

起動の設定は「全般」から行うことができる。

ログインユーザーの設定は「コマンドライン」のコマンド編集により、
開始ディレクトリは「ディレクトリの開始」のパスを編集することで適宜変更出来る。

image.png設定内容before

image.png設定内容after

コマンドラインのところは

# before
wsl.exe -d <Distro>

# after
wsl.exe -d <Distro> -u <username>

のように変更する。(つまり、wslコマンドのオプションにユーザー指定を追加する)

「ディレクトリの開始」については、

# before
%USERPROFILE% # ←Windowsでのホームディレクトリを表す環境変数

# after
\\wsl$\<Distro>\home\<username>

のように変更する。WSL2は\\wsl$\下にディスクがマウントされているので、そこの下にあるログインしたいユーザーのホームディレクトリのWindows上における絶対パスを指定している、といった感じ。

結果として、起動した直後の状態は以下のスクショのような感じで変化する:

image.png起動後の状態before

image.png起動後の状態after
マシン名やユーザー名などを隠しているので分かりづらいが、とにかく起動直後に指定してユーザーでログインし、開始ディレクトリもそのユーザーのホームディレクトリ~になっている。

特に、importして作ったプロファイルのログインユーザーに関して、先ほど書いたように基本的にはPowerShellからレジストリ操作をして変更を行う必要があったが、Windows Terminalでの使用に限れば不要な操作となる。

4-1-2. キーバインドの変更

個人的にはshell上からvimなどを呼び出して使うことが多いのだが、デフォルトだとWindows TerminalのキーバインドでCtrl + vは「貼り付け」が当てられている。
すなわち、vimで矩形選択が出来ないなどといった状況になり、非常に困ったことになる。

キーバインド設定だが、設定画面の左から「操作」(2つあるが、キーボードっぽいアイコンの方)を開くと確認が出来る。

image.png
が、確認出来るだけでGUI上からの変更は執筆時点で未対応である。(将来的には出来るようになっているかもしれない)

現時点では上の方に説明が出ているように、JSONファイルを直接編集してキーバインドを変える必要がある。
今回は例として「貼り付け」に関して、Ctrl + vからCtrl + Shift + vに変えることにする。

上のスクショの"JSONファイルを開く"をクリックすると設定のjsonが開く:

image.png

今回はactionsの要素を編集する。
具体的には、commandがpasteになっているものについて、keysctrl+vからctrl+shift+vに変更する。

image.png(編集後)

すると、めでたくキーバインドが以下のように変化する:

image.pngbefore

image.pngafter

これでめでたくvimで矩形選択を行う事ができる。
使用するツールなどによって他にも干渉するキーバインドがあるかもしれないが、大抵は上のようなやり方で適宜回避出来ると思う。

補足 fontの変更

shellのプロンプトやCUIベースのエディタをプラグインでリッチにしていたりすると特殊なフォントを入れたくなったりする。

こうした場合、Windows側で適当なフォントをインストールし、Windows Terminalの設定をいじることでフォントを入れられる。

日本語と様々な特殊記号をカバーしているフォントは例えばNerd fontsなどが使える。

リリースページから適当なものを選んでダウンロードして開き、その中からまた適当そうなものを選んで入れれば良い。(やたらたくさんあるが、全部を入れる必要は全く無い。zip内にあるファイルも最悪、例えば"Regular"とか書いてある普通っぽい1つを選ぶので問題無い)
zip内のotfファイルやttfファイルを開くと下のスクショのようになり、左上の「インストール」ボタンを押せば完了。
image.png

Windows Terminalにおけるフォント設定だが、
フォントは環境(プロファイル)毎に設定するので、変更したいプロファイルを設定画面の左から選択し、「外観」を選択することでフォントの設定画面を開ける。
image.png

「フォント フェイス」とあるところで使いたいフォントを選ぶことが出来る。
スクショではデフォルトのCascadia MonoからDejaVuSansMono Nerd Font Monoに変えている。

余談だが、ここで選ぶフォントをDroidSansMono Nerd Font Monoにしたらtmuxの垂直pane分割時に縦線がうまく表示されない問題が起きた。
どのフォントでも正しく表示される保証は無いようなので、表示が崩れることがあればフォントを変えてみるとうまくいくかもしれない。

4-2. wsltty

昔CygWinを使ってたり、Git for Windowsのgit bashを使ったりしていた関係でminttyに馴染みがあり、今までデフォルトで使っていた。こちらも参考として紹介しておく。

リリースページからインストーラーの.exeファイルを落として普通にインストールする。
(scoopからもインストールできるが、自分はうまく動いたことが無い。。。)

実行するとおそらくwslのデフォルトになっているものを開くようになっている。

なお、インストーラーをダウンロード・実行するときにWindows Defenderやアンチウイルスソフトが悪意のあるソフトとして警告を出してくるのですごく気持ち悪いが、このissueなどを見ると"I see no generic way to handle this problem."などとあるので結構どうしようも無いらしい?
気分は悪いが信用してインストールする。

ちなみに複数環境を使い分けるには、スタートメニューに<Distro> Terminalのような感じで登録されるのでそれを選んで起動するようにする。(参考
ちなみに%がつく方はWindowsのホームディレクトリで起動し、%がつかない方はLinux側のホームディレクトリで起動する。

image.png

補足 fontの変更

フォントを入れる理由やWindows本体にフォントを追加する部分はさっき書いた通り。

フォントをインストールした後は、wslttyを起動してから左上にいるTuxくんのアイコンをクリックし、Options...のTextを開くとFontの設定が出てくるので、Select...から使いたいものを選ぶ。

image.png

5. その他Tips(追記)

思いついたものを追記していく。

5-1. wsl.conf

/etc/wsl.confを作成し、編集することでwsl周りの設定が出来る。
詳細はMicrosoftの公式ドキュメント「wslconf を使用してディストリビューションごとの起動設定を構成する」を参照すると良い。

個人的にはwsl側にWindowsの実行パスを混ぜたくないことが多かったりするので、

wsl.conf
[interop]
appendWindowsPath = false

などと書いていたりする。

また、先にwsl --importで作成した環境ではデフォルトのログインユーザーがrootになる旨を書いたが、
PowerShellから設定を変更したり、Windows Terminalを使う以外にも

wsl.conf
[user]
default = <username>

のようにして、<username>部分に作成したユーザーを書いておくことでも対処出来る。
(再起動すると反映される)

PowerShellでレジストリをいじるのは気が引ける場合や、Windows Terminalから以外にも呼び出すという人には 1つの選択肢になると思われる。

感想など

  • Windows Terminal、以前はうまく設定できなくて使っていなかったが、うまく設定出来るとかなり便利だった。
    今後の進化に期待。
  • クリップボード周り、大したことがしたい訳でも無いのに現状だと非常に手間がかかる印象。WSLgに期待。
  • CPUやメモリを動的に割り当ててくれるWSL2は従来の仮想マシンなどと比べて一般的にかなり快適(改善の余地や色々と課題はあると思うが)。
    細かい設定などは割と面倒で疲れたが、それに十分見合うくらいにWSL2は便利だと再認識した。今後より使いやすくなっていくことに期待したい。
4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?