WSL2でつくる快適なUbuntu環境
WindowsでWSL2を使ったUbuntu環境をつくってみました。
Table of Contents
はじめに
WindowsのMay 2020 Updateアップデートで、WSL2が正式版になりました。
直近でLinux環境が必要だったので、この機会にインストール/環境構築をしてみました。
前提条件
本記事は、以下の記事における環境構築がされている前提で執筆されています。
Windowsのバージョンは2004 (OSビルド 19041.329)
です。
19041より前のバージョンでは動きませんので、必要ならばMicrosoftのページから手動アップデートしてください。
また、筆者の環境ではWSL1はインストールされていません。
WSL2のインストール
公式ページを参考にまずはWSLをインストールします。
PowerShellにてコマンドを実行します。
sudoコマンドが使えない場合は、管理者権限でPowerShellを立ち上げてください。
# WSLを有効にする
sudo dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# VMを有効にする
sudo dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
PCを再起動すると、WSL2のインストールが完了します。
wslコマンドが使えない
WSL2のインストールに失敗した可能性があります。
PCの『シャットダウン』→『起動』ではインストールされません。
必ず 『再起動』 をしてください。
最後にLinuxディストリビューションがWSL2をデフォルトで使うように設定しましょう。
sudo wsl --set-default-version 2
Ubuntuのインストール
WindowsストアからUbuntuをインストールします。
バージョンは20.04 LTS
にしました。
インストール完了に起動して初期設定をします。
Ubuntuに対して、WSLのバージョンが2に設定されていることを確認しましょう。
$ wsl --list -v ⨯ 10:19:26
NAME STATE VERSION
* Ubuntu Running 2
ディストリビューションのWSL VERSIONを変更する方法
以下のコマンドで切り替えできます。
wsl --set-version Ubuntu 2
Windows TerminalからUbuntuを起動する
profiles.list[]
に以下を追加します。
source
以外のパラメータは、各自最適な値を設定してください。
{
"guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
"source": "Windows.Terminal.Wsl",
"startingDirectory": "//wsl$/Ubuntu/home/tadashi-aikawa",
"backgroundImage": "%USERPROFILE%\\git\\github.com\\tadashi-aikawa\\owl-playbook\\mnt\\windows\\wsl\\ubuntu.png",
"backgroundImageAlignment": "bottomRight",
"backgroundImageStretchMode": "none",
"backgroundImageOpacity": 0.4
}
WSL2ではWindowsからLinuxディストリビューションのファイルシステムにアクセスできます。
Ubuntuの場合、rootパスは//wsl$/Ubuntu
になります。
上記設定では、起動後のカレントディレクトリをUbuntuのホームディレクトリにしています。
PATHからWindowsの設定を除外する
デフォルトではLinuxからWindowsのコマンドを利用できます。
これはLinuxのPATHに、WindowsのPATHがデフォルトで設定されているためです。
このままでは、Windows/Linux どちらのコマンドを実行されているかが暗黙的になり、知らない間にWindows環境に依存するリスクを生じます。
それを回避するため、Linuxの/etc/wsl.conf
を作成してWindowsのPATHが追加されないようにします。
[interop]
appendWindowsPath = false
/etc/wsl.conf
では他にも様々な設定ができます。
wsl.confを変更しても設定が反映されない
Linuxが再起動されていない可能性があります。
ターミナルソフトを終了しても、Linuxはバックグラウンドでしばらく起動し続けます。
以下のコマンドで意図的に終了したあと、もう一度ターミナルを立ち上げてください。
wsl --terminate Ubuntu
秘密情報を含むドットファイルのコピー
基本的にホストの設定をそのまま使いたいのでコピーします。
以下のようなprovision.ps1
を作りました。
# .gitconfig
cp $home\.gitconfig \\wsl$\Ubuntu\tmp\
wsl -- mv /tmp/.gitconfig ~/
# .ssh
cp -r $home\.ssh \\wsl$\Ubuntu\tmp\
wsl -- rm -rf ~/.ssh
wsl -- mv /tmp/.ssh ~/
wsl -- chmod 600 ~/.ssh/*
本当は1行でコピーしたいのですが、ホストマシンからは\\wsl$\Ubuntu\~
をホームディレクトリとみなすことができません。
そのため、tmp配下に一度コピーしたあと、WSL内でそれをホームディレクトリへ移動させます。
wsl -- <コマンド>
でWindowsからUbuntu内でコマンドを直接実行することができます。
クリップボードを同期する
Windows X Serveを使います。
Scoopでインストールします。
scoop install vcxsrv
設定ファイルの作成
XLauncherを起動します。
vcxsrvではないので注意してください。
C:\Users\syoum\scoop\apps\vcxsrv\current\xlaunch.exe
設定画面が立ち上げるので、以下の画面が出るまでそのまま進みます。
Disable access control
にチェックをつけて進みます。
Save configuration
をクリックすると設定をファイルとして保存できます。
ここではconfig.xlaunch
として保存しました。
ファイルの中身は以下のような感じです。
<?xml version="1.0" encoding="UTF-8"?>
<XLaunch WindowMode="MultiWindow" ClientMode="NoClient" LocalClient="False" Display="-1" LocalProgram="xcalc"
RemoteProgram="xterm" RemotePassword="" PrivateKey="" RemoteHost="" RemoteUser="" XDMCPHost=""
XDMCPBroadcast="False" XDMCPIndirect="False" Clipboard="True" ClipboardPrimary="True" ExtraParams="" Wgl="True"
DisableAC="True" XDMCPTerminate="False"/>
Windows起動時に自動起動させる
スタートアップにショートカットを作成し、リンク先に以下を指定します。
C:\Users\syoum\scoop\apps\vcxsrv\current\xlaunch.exe -run <config.xlaunchのパス>
環境変数DISPLAYの設定
Ubuntu側の.bashrc
などで環境変数DISPLAYの値をセットします。
# クリップボード連携 (For WSL2)
LOCAL_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
export DISPLAY=$LOCAL_IP:0
これでWindowsとクリップボードが連携できるようになります😁
Vimを使っている場合
VimのyankとWindowsのクリップボードを同期したい場合は、Ubuntu側の.vimrc
で以下の設定をしてください。
set clipboard=unnamedplus
Ansibleで環境構築
Linux環境構築で使用しているAnsibleのPlaybookを実行します。
その前にAnsibleをインストールします。
sudo apt-get update
sudo apt-get install python3-pip libffi-dev libssl-dev -y
pip install ansible pywinrm
なぜこのコマンドにしたのか記憶にないので.. 公式のインストールコマンドで問題なければそちらを使った方がいいです..😅
実行したらハマリ所はなく成功しました🎉
なお、Playbookの設定は以下のリポジトリで管理しています。
総括
ポイントとハマリ所さえ抑えれば、思ったより時間をかけずに環境構築できました。
PowerShell環境やVagrantを使ったVMと比べると以下の点が良いと感じています。
- 仮想マシンを起動/終了させる必要がない (地味に面倒ですよね!)
- Gitコマンドなどの反応が速い
- Linuxで利用できる技術がほぼそのまま使える
一方、注意すべき点もいくつかあります。
- Windowsファイルシステム上ではファイルの読み書き速度が著しく落ちる
- WindowsとPATHを混同させるとカオスになる
- Intellij IDEAではDebug/Runなどに完全対応していない
『LinuxでWindowsを扱う』のではなく『Windowsの中にあるLinuxを使う』くらいがちょうどいい塩梅だと感じています。
Windowsシステム上での操作を快適にしたい方は下記の記事も是非どうぞ😄