はじめに
Windows でWSL2を使ったLinux開発環境を構築してみる。(所要時間: 60分)
追記: 2021/12/18
WSL2がコマンド一発で入れられるようになったり、Windows Terminalの設定画面がGUIになったりしたので、古い手順を一新した。
修正: 2024/04/18
GPGキーのインポートでapt-key
は非推奨になったため、代替の手段に修正。
修正: 2024/07/05
Windows 11だとデフォルトで systemd
が有効になり、Dockerが起動しなくなるため回避策を追加。
必要環境
-
Windows 10
- Version 1903 (OS Build 18362.1049以降)
- Version 1909 (OS Build 18363.1049以降)
- Version 2004以降
-
Windows 11
1. WSL2 環境のセットアップ
WSL の詳細は Microsoft の公式ドキュメントを参照。
管理者権限でPowerShellを起動して以下のコマンドを実行する。
wsl --install -d Ubuntu-20.04
PCの再起動を促されるので再起動する。
Linux ディストリビューションのインストール
再起動するとOSのインストール作業が始まる。
しばらくすると、ユーザーを作成するプロンプトが表示されるので、適当なユーザー名とパスワードを入力する。
Windows → WSL へのアクセス
エクスプローラーで \\wsl$\Ubuntu
を表示するとルートディレクトリ /
が表示される。
WSL → Windows へのアクセス
WSL ターミナルで /mnt/c
でCドライブの内容が表示できる。
デフォルトではマウントされたCドライブはLinux側から見るとパーミッションはrootユーザーになっている。
エクスプローラーなどで \\wsl$\Ubuntu
以下にファイルをコピーした場合、パーミッションはrootユーザーでコピーされるため、削除時にsudo権限が必要になり使い勝手が悪い。
そこで以下のコマンドを実行して、WSLの規定のユーザーでマウントされるように設定を変更する (Ubuntu ディストリビューションでは、既定のユーザーは uid = 1000、gid = 1000 で作成される)
https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config#configure-per-distro-launch-settings-with-wslconf
$ sudo tee /etc/wsl.conf <<EOF >/dev/null
[automount]
options = "metadata,uid=1000,gid=1000"
EOF
上記の設定を行うと /mnt/c 以下がsudo権限なしで削除できてしまうため注意!(自己責任で)
ネットワークドライブの割り当て
batファイルの実行(コマンドプロンプト)はUNCパスはサポートしていないため、\\wsl$\Ubuntu
をネットワークドライブに割り当てておく必要がある。
Zドライブに割り当てる例
net use z: \\wsl$\Ubuntu [パスワード] /user:[ユーザー名] # ユーザー名とパスワードはWSLセットアップ時に決めたユーザー
2. Windows側の作業
開発に必要なアプリケーションをインストールする。
Windows Terminal
-
Microsoft Storeからインストールする。
https://www.microsoft.com/store/apps/9N0DX20HK701 -
Ubuntuのターミナル設定のデフォルトでは起動時のパスが
%USERPROFILE%
となっているため、設定メニューから WSL の開始ディレクトリを(ホームディレクトリが一番使うと思うので)\\wsl$\Ubuntu\home\[ユーザー名]
に設定する。
Visual Studio Code
-
Microsoft Storeからインストールする。
https://apps.microsoft.com/store/detail/XP9KHM4BK9FZ7Q -
Windows 側にインストールされた VSCode から WSL上のディレクトリを開くための設定をする。
-
VSCodeの拡張機能で Remote Development をインストールする。
-
WSL ターミナルで
code
を実行する。
VSCodeが起動し、左下のステータスが「WSL: Ubuntu」と表示されていれば成功。
3. Linux(WSL) 側の設定
日本語ロケールの設定
パッケージを最新にする
$ sudo apt update && sudo apt upgrade -y
日本語言語パックのインストール
$ sudo apt install -y language-pack-ja
ロケールを日本語に設定
$ sudo update-locale LANG=ja_JP.UTF-8
日本語マニュアルのインストール
$ sudo apt install -y manpages-ja manpages-ja-dev
日本語フォントのインストール
$ sudo apt install -y fonts-noto
Ctrl + D でターミナルを終了し、再起動する。
ロケールが日本語に設定されていることを確認する。
$ date
2020年 9月 15日 火曜日 15:59:05 JST
$ locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
Gitの設定
ユーザー名とメールアドレスを設定する(スペースを含む場合はダブルクォーテーションで囲む)
$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"
その他Gitのオススメ設定
$ git config --global core.autocrlf input # コミット時に改行コードをCRLFからLFに変換する
$ git config --global core.quotepath false # 日本語ファイル名をエスケープする
$ git config --global color.ui true # コマンドに色をつける
$ git config --global url."https://".insteadOf git:// # gitプロトコルの代わりにhttpsプロトコルを使用する
$ git config --global credential.helper store # Gitの認証情報をファイルに保存する
$ git config --global fetch.prune true # git pull時に常にpruneする
$ git config --global grep.lineNumber true # git grep時に行番号を表示する
$ git config --global color.grep.filename cyan # git grepの結果のファイル名の色をcyanに設定する
$ git config --global color.grep.lineNumber magenta # git grepの結果の行番号の色をmagentaに設定する
$ git config --global init.defaultBranch main # git init時に作成されるデフォルトブランチをmainにする
Linuxパッケージのインストール
gccやg++等C関連のコンパイラを含むパッケージをインストールする (RubyやPythonなどでCネイティブの拡張ライブラリをビルドする際に必要となる)
$ sudo apt install -y build-essential
Homebrewのインストール
Homebrewのインストール
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
シェルにパスを通す
$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.profile
ターミナルを再起動する
バージョンを表示してみる
$ brew -v
Homebrew 3.4.9
Homebrew/homebrew-core (git revision d1e63709706; last commit 2022-04-28)
anyenvのインストール
プロジェクト毎のプログラムのバージョンの競合を避けるために異なるバージョンをインストールし、管理できる **env (Rubyならrbenv、Pythonならpyenvなど) というツールがあるが、扱う言語自体が増えてくると **env 自体の管理が煩雑になるため、さらにそれをまとめて管理できる anyenv をインストールする。
GitHubからリポジトリをクローンする
$ git clone https://github.com/anyenv/anyenv ~/.anyenv
シェルにパスを通す
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(anyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
インストールマニフェストディレクトリを初期化する
ANYENV_DEFINITION_ROOT(/home/user/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
anyenv install --init
と表示されるので、その通り実行する。
$ anyenv install --init
プラグインのインストール
すべての **env を横断してアップデートできるanyenv-updateをインストールする
$ git clone https://github.com/znz/anyenv-update.git ~/.anyenv/plugins/anyenv-update
**env のインストール
anyenv がサポートしている言語は以下のとおり。
**env | 対応言語 |
---|---|
Renv | R |
crenv | Crystal |
denv | D |
erlenv | Erlang |
exenv | Elixir |
goenv | Go |
hsenv | Haskell |
jenv | Java |
jlenv | Julia |
luaenv | Lua |
nodenv | Node.js |
phpenv | PHP |
plenv | Perl |
pyenv | Python |
rbenv | Ruby |
sbtenv | sbt |
scalaenv | Scala |
swiftenv | Swift |
tfenv | Terraform |
**env のコマンドはほとんど同じ体系で使うことができる。
# インストール可能なバージョンを表示する
$ **env install -l
# インストールされているバージョンを表示する
$ **env versions
# 特定のバージョンをインストールする
$ **env install ...
# 特定のバージョンをアンインストールする
$ **env uninstall ...
# グローバル(システム全体)で利用するバージョンを指定する
$ **env global ...
# 実行したディレクトリ以下で利用するバージョンを指定する(.**-versionファイルが生成される)
$ **env local ...
# **env自身のバージョンを表示する
$ **env -v
以下はRuby, Python, Node.jsをインストールする場合
$ anyenv install rbenv
$ anyenv install pyenv
$ anyenv install nodenv
$ exec $SHELL -l # シェルを再起動する
各 **env -v
でインストールされたことを確認した後で、実際のプログラム環境をインストールする。
DBクライアント、開発パッケージのインストール
開発に利用するDBに合わせてインストールする。
MySQL
$ sudo apt install -y mysql-client # mysqlコマンドが利用できるようになる
$ sudo apt install -y libmysqlclient-dev # RubyのGemをビルドする際に必要
バージョン情報を表示してみる。
$ mysql --version
mysql Ver 8.0.28-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))
PostgreSQL
$ sudo apt install -y postgresql-client # psqlコマンドが利用できるようになる
$ sudo apt install -y libpq-dev # RubyのGemをビルドする際に必要
バージョン情報を表示してみる。
$ psql --version
psql (PostgreSQL) 12.9 (Ubuntu 12.9-0ubuntu0.20.04.1)
Microsoft SQL Server
パブリック リポジトリの GPG キーをインポートする。
$ curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
リポジトリを追加する。
$ curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
ソース一覧を更新し、パッケージをインストールする。
$ sudo apt update
$ sudo ACCEPT_EULA=Y apt install -y mssql-tools unixodbc-dev # sqlcmd, bcpコマンドが利用できるようになる
$ sudo apt install -y freetds-dev # RubyのGemをビルドする際に必要
シェルにパスを通す。
$ echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
$ source ~/.bashrc
バージョン情報を表示してみる。
$ sqlcmd -?
Microsoft (R) SQL Server Command Line Tool
Version 17.9.0001.1 Linux
Copyright (C) 2017 Microsoft Corporation. All rights reserved.
usage: sqlcmd [-U login id] [-P password]
[-S server or Dsn if -D is provided]
[-H hostname] [-E trusted connection]
[-N Encrypt Connection][-C Trust Server Certificate]
[-d use database name] [-l login timeout] [-t query timeout]
[-h headers] [-s colseparator] [-w screen width]
[-a packetsize] [-e echo input] [-I Enable Quoted Identifiers]
[-c cmdend]
[-q "cmdline query"] [-Q "cmdline query" and exit]
[-m errorlevel] [-V severitylevel] [-W remove trailing spaces]
[-u unicode output] [-r[0|1] msgs to stderr]
[-i inputfile] [-o outputfile]
[-k[1|2] remove[replace] control characters]
[-y variable length type display width]
[-Y fixed length type display width]
[-p[1] print statistics[colon format]]
[-R use client regional setting]
[-K application intent]
[-M multisubnet failover]
[-b On error batch abort]
[-D Dsn flag, indicate -S is Dsn]
[-X[1] disable commands, startup script, environment variables [and exit]]
[-x disable variable substitution]
[-g enable column encryption]
[-G use Azure Active Directory for authentication]
[-? show syntax summary]
SQLite
$ sudo apt install -y sqlite3
バージョン情報を表示してみる。
$ sqlite3 --version
3.31.1 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837balt1
パブリッククラウドの CLI のインストール
AWS CLI
$ sudo apt install -y unzip # zipファイルを解凍するために必要
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ rm -r aws awscliv2.zip
バージョン情報を表示してみる。
$ aws --version
aws-cli/2.6.0 Python/3.9.11 Linux/5.10.102.1-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off
Azure CLI
$ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
バージョン情報を表示してみる。
$ az --version
azure-cli 2.36.0
core 2.36.0
telemetry 1.0.6
Dependencies:
msal 1.17.0
azure-mgmt-resource 20.0.0
Python location '/opt/az/bin/python3'
Extensions directory '/home/xxxxx/.azure/cliextensions'
Python (Linux) 3.8.13 (default, Apr 22 2022, 04:53:09)
[GCC 9.4.0]
Legal docs and information: aka.ms/AzureCliLegal
Your CLI is up-to-date.
Please let us know how we are doing: https://aka.ms/azureclihats
and let us know if you're interested in trying out our newest features: https://aka.ms/CLIUXstudy
gcloud CLI
$ echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
$ sudo apt-get install apt-transport-https ca-certificates gnupg
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg
$ sudo apt-get update && sudo apt-get install google-cloud-sdk
バージョン情報を表示してみる
$ gcloud --version
Google Cloud SDK 383.0.1
alpha 2022.04.26
beta 2022.04.26
bq 2.0.74
bundled-python3-unix 3.8.11
core 2022.04.26
gsutil 5.9
Dockerのインストール
aptパッケージインデックスを更新し、パッケージをインストールするためにaptがHTTPS経由でリポジトリを使用できるようにする。
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
Dockerの公式のGPGキーを追加する。
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
stable リポジトリを使うよう設定する。
$ echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
aptパッケージインデックスを更新し、Docker Engineとcontainerdの最新バージョンをインストールする。
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Docker Engineを起動する。
$ sudo service docker start
このままだとdockerコマンド実行にsudo権限が必要になるため、dockerグループにユーザー権限を付与する。
$ sudo usermod -aG docker $USER
バージョン情報を表示してみる。
$ docker version
Client: Docker Engine - Community
Version: 20.10.14
API version: 1.41
Go version: go1.16.15
Git commit: a224086
Built: Thu Mar 24 01:48:02 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.14
API version: 1.41 (minimum version 1.12)
Go version: go1.16.15
Git commit: 87a90dc
Built: Thu Mar 24 01:45:53 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.5.11
GitCommit: 3df54a852345ae127d1fa3092b95168e4a88e2f8
runc:
Version: 1.0.3
GitCommit: v1.0.3-0-gf46b6ba
docker-init:
Version: 0.19.0
GitCommit: de40ad0
WSL起動時にDocker Engineを自動起動するよう設定する手順は以下の記事を参照。
Windows 11の場合、デフォルトで systemd
が有効になっているためserviceと競合してDockerデーモンが起動しなくなる。解決するには /etc/wsl.conf
の以下の定義を削除すればOK。
[boot]
systemd=true
以上、お疲れ様でした!🎉