16
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL2でLinux開発環境を構築する

Last updated at Posted at 2020-10-28

はじめに

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を起動して以下のコマンドを実行する。

powershell
wsl --install -d Ubuntu-20.04

PCの再起動を促されるので再起動する。

Linux ディストリビューションのインストール

再起動するとOSのインストール作業が始まる。
しばらくすると、ユーザーを作成するプロンプトが表示されるので、適当なユーザー名とパスワードを入力する。
2020-09-16_11h55_30.png

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

Ubuntu
$ sudo tee /etc/wsl.conf <<EOF >/dev/null
[automount]
options = "metadata,uid=1000,gid=1000"
EOF

上記の設定を行うと /mnt/c 以下がsudo権限なしで削除できてしまうため注意!(自己責任で)

ネットワークドライブの割り当て

batファイルの実行(コマンドプロンプト)はUNCパスはサポートしていないため、\\wsl$\Ubuntu をネットワークドライブに割り当てておく必要がある。

Zドライブに割り当てる例

powershell
net use z: \\wsl$\Ubuntu [パスワード] /user:[ユーザー名] # ユーザー名とパスワードはWSLセットアップ時に決めたユーザー

2. Windows側の作業

開発に必要なアプリケーションをインストールする。

Windows Terminal

  1. Microsoft Storeからインストールする。
    https://www.microsoft.com/store/apps/9N0DX20HK701

  2. Ubuntuのターミナル設定のデフォルトでは起動時のパスが %USERPROFILE% となっているため、設定メニューから WSL の開始ディレクトリを(ホームディレクトリが一番使うと思うので) \\wsl$\Ubuntu\home\[ユーザー名] に設定する。

Visual Studio Code

  1. Microsoft Storeからインストールする。
    https://apps.microsoft.com/store/detail/XP9KHM4BK9FZ7Q

  2. Windows 側にインストールされた VSCode から WSL上のディレクトリを開くための設定をする。

  3. VSCodeの拡張機能で Remote Development をインストールする。

  4. WSL ターミナルで code を実行する。
    VSCodeが起動し、左下のステータスが「WSL: Ubuntu」と表示されていれば成功。
    image.png

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を自動起動するよう設定する手順は以下の記事を参照。

:warning: Windows 11の場合、デフォルトで systemd が有効になっているためserviceと競合してDockerデーモンが起動しなくなる。解決するには /etc/wsl.conf の以下の定義を削除すればOK。

/etc/wsl.conf
[boot]
systemd=true

以上、お疲れ様でした!🎉

16
19
2

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
16
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?