WSLでWindowsの中にLinuxの開発環境を作ろう

個人PCを新しくしてから、WSL(Windows Subsystem for Linux)をいれてなかったので改めていれてみました。
基本的には参考記事通りに進めましたが、追加でインストールするものも含めて備忘録として手順を書いておきます。

※この記事はQiitaからの転載です。

WSL #

WSLとは? #

wikipediaより

Windows Subsystem for Linux (WSL) とは、Linuxの(ELFフォーマット形式の)バイナリ実行ファイルをWindows 10およびWindows Server上でネイティブ実行するための互換レイヤーである。

ざっくりいえば、その名の通り、WindowsのサブシステムとしてLinuxを動かす仕組みという解釈でいいかなと思っています。
WSLでは完全なLinuxを動かすことはできませんが、5月に発表された強化版のWSL2では100%互換が実現されてるみたいですね。まだこちらはベータ版のみの提供のようなので、今回は素直にWSLを使うことにしました。

自分はなるべくWindowsに直接言語をいれたりしたくない派なので、Docker環境を作ったり、WSL側に言語をいれたりしてます。

有効化 #

  1. 左下のWindowsボタンを右クリックし
    、「アプリと機能」を選択
  2. 下部の方にある関連設定の「プログラムと機能」を選択
  3. 左メニューの「Windowsの機能の有効化または無効化」を選択
  4. 機能一覧の中から「Windows Subsystem for Linux」にチェックをつけて「OK」
    Windowsの機能一覧
  5. 設定の変更が行われた後、Windowsを再起動するよう促されるので、再起動する

Ubuntuのインストール #

  1. Microsoft Storeを開く
  2. 「Ubuntu」で検索する
    3つの種類(Ubuntu、Ubuntu 18.04 LTS、Ubuntu 16.04 LTS)がありますがお好みで。
  3. Ubuntuをインストール
  4. Ubuntuを起動して、初回起動時の設定としてusernameとpasswordを設定する(ここで決めたパスワードがsudoコマンド使用時に必要になります)
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: h-yoshikawa
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

これでWSLが利用できるようになりました。
ちなみにバージョンはcat /etc/os-releaseで確認できます。

~$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

初期設定 #

パッケージリストの更新 #

$ sudo apt update

日本語化対応とタイムゾーン #

1.日本語言語パックのインストールとロケールの設定

$ sudo apt install -y language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8

これでlocaleが変更されます。

$ 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=

2.タイムゾーンの設定、日本語のmanpageをインストール
タイムゾーンに関してはアジア→東京を選択してください。

$ sudo dpkg-reconfigure tzdata
$ sudo apt install -y manpages-ja manpages-ja-dev

これでタイムゾーンがJSTになります。

$ date
2019年 9月 22日 日曜日 12:13:56 JST

Windows・WSLそれぞれから見た互いのパス #

Windowsから見たWSL #

C:\Users\ballk\AppData\Local\Packages\CanonicalGroupLimited.{ディストリビューション固有の文字列}

このパスからさらに\LocalState\rootfsbindevetcmntoptなどがあります。

以前はWindows側からWSL側のファイルを触るとファイルが壊れる可能性があったため推奨されていなかったようですが、現在は大丈夫になったみたいです。
参考:WindowsからLinuxファイルへのアクセスが可能に ~「Windows 10 19H1」におけるWSLの改善

WSLから見たWindows #

/mnt/c

/mntからCドライブが参照できます。

追加でインストールするもの #

Linuxbrew #

Macではおなじみのパッケージ管理ツールであるHomebrewのLinux版です。
Homebrew 2.0.0からは、正式にLinuxをサポートするようになったそうです。

1.事前に必要なもののインストール
中にはすでに入っているものもあるかと思います。

$ sudo apt install build-essential curl file git

2.Linuxbrewのインストール

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

インストールが終わると次のステップに関する記述が表示されますので、その通りに進めていきます。
build-essentialのインストールは先に済ませているのでスキップ。

==> Next steps:
- Install the Homebrew dependencies if you have sudo access:
  Debian, Ubuntu, etc.
    sudo apt-get install build-essential
  Fedora, Red Hat, CentOS, etc.
    sudo yum groupinstall 'Development Tools'
  See https://docs.brew.sh/linux for more information.
- Configure Homebrew in your ~/.profile by running
    echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >>~/.profile
- Add Homebrew to your PATH
    eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
- We recommend that you install GCC by running:
    brew install gcc
- Run `brew help` to get started
- Further documentation:
    https://docs.brew.sh

3.パスを通す

$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >>~/.profile
$ eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)

4.gccのインストール

$ brew install gcc

依存関係のあるものも一緒にインストールされます。(patchelfzlibgmpmpfrlibmpcisl@0.18
なお、isl@0.18に関して、インストール時に以下のような表示が出ます。

For compilers to find isl@0.18 you may need to set:
  export LDFLAGS="-L/home/linuxbrew/.linuxbrew/opt/isl@0.18/lib"
  export CPPFLAGS="-I/home/linuxbrew/.linuxbrew/opt/isl@0.18/include"

5.各種profileのいずれかにisl@0.18に関する変数を追記
(自分は~/.profileに追記しました)

export LDFLAGS="-L/home/linuxbrew/.linuxbrew/opt/isl@0.18/lib"
export CPPFLAGS="-I/home/linuxbrew/.linuxbrew/opt/isl@0.18/include"

6.brewが正常に動作するか確認

$ brew doctor

以下のような表示が出ます。特に問題はないようですがWarningが出ます。

~$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: umask is currently set to 000. Directories created by Homebrew cannot
be world-writable. This issue can be resolved by adding "umask 002" to
your ~/.bash_profile:
   echo 'umask 002' >> ~/.bash_profile

7.各種profileのいずれかにumaskに関する記述を追記
案内上は~/.bash_profileに追記と書いていますが、自分は~/.profileの方に記述をしているのでこちらにしています。

$ echo 'umask 002' >> ~/.profile

8.再度、brewの動作確認

$ brew doctor

以下のような表示が出ればOKです。

Your system is ready to brew.

anyenv #

言語を複数バージョンで管理できる、〇〇envを一元管理できるものです。
今回はLinuxbrewを使用してインストールしていきます。

本体のインストール #

1.インストール

$ brew install anyenv

2.anyenvのセットアップ

$ anyenv init

こちらを実行すると以下のように、~/.bash_profileに追記するように表示が出ます。

$ anyenv init
# Load anyenv automatically by adding
# the following to ~/.bash_profile:

eval "$(anyenv init -)"

3.各種profileのいずれかに追記
自分は~/.profileに追記しました。

$ echo 'eval "$(anyenv init -)"' >> ~/.profile

この段階でUbuntuを再起動すると以下のような警告が出ますが、次の手順で解消できます。

ANYENV_DEFINITION_ROOT(/home/h-yoshikawa/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
> anyenv install --init

4.マニフェストディレクトリの用意
チェックアウトしますか?と聞かれるので、yで進みます。

$ anyenv install --init

これでanyenvで各種envがインストールできるようになりました。
なお、インストールできる各種envは以下のコマンドで確認できます。

$ anyenv install -l
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  luaenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
  tfenv

nodenvのインストール #

ここでは試しにnodenvをインストールしてみます。

1.インストール

$ anyenv install nodenv

インストールが終わると各種profileをリロードするか、Ubuntuを再起動するように言われます。

Install nodenv succeeded!
Please reload your profile (exec $SHELL -l) or open a new session.

2.各種profileをリロード

$ exec $SHELL -l

これでnodenvが使えるようになりました。

$ nodenv
nodenv 1.3.0+5.ae0f24a
Usage: nodenv <command> [<args>]

Some useful nodenv commands are:
   commands    List all available nodenv commands
   local       Set or show the local application-specific Node version
   global      Set or show the global Node version
   shell       Set or show the shell-specific Node version
   install     Install a Node version using node-build
   uninstall   Uninstall a specific Node version
   rehash      Rehash nodenv shims (run this after installing executables)
   version     Show the current Node version and its origin
   versions    List all Node versions available to nodenv
   which       Display the full path to an executable
   whence      List all Node versions that contain the given executable

See `nodenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/nodenv/nodenv#readme

インストールできるnodeのバージョン一覧は以下で確認できます。

$ nodenv install --list

3.nodeをインストール

$ nodenv install (バージョン)

4.使用するnodeのバージョンを指定

# グローバルの場合
$ nodenv global (バージョン)

# ローカルの場合
$ nodenv local (バージョン)

インストールしているバージョンの一覧は以下で確認できます。
なお、ここで*がついているのが使用しているバージョンです。

$ nodenv versions
* 10.16.3 (set by /home/h-yoshikawa/.anyenv/envs/nodenv/version)

参考リンクまとめ #