気まぐれ備忘録

WSL2ハンズオン!

WSL2&Ubuntu導入

導入したのは Ubuntu 18.04 LTSです。

最新LTSは20.04なんですけど、Cのなんかのモジュールにうまくいかないところがあるとかないとか(曖昧すぎる記憶)で、とりあえず18.04に。

ちなみに、WSL2を導入するにはWindows 10 May 2020 Updateにアップデートする必要があります。全世界のユーザーへ順にアップデートを配信されていくため、設定から更新できない場合があります。そんなときは下記からアシスタントを導入しましょう。

https://www.microsoft.com/ja-jp/software-download/windows10

 

早速起動!と思ったんですけど


Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x8007019e
The Windows Subsystem for Linux optional component is not enabled. Please enable it and try again.
See https://aka.ms/wslinstall for details.
Press any key to continue...

WSLコンポーネントがなくて怒られる。https://aka.ms/wslinstallを読んでほしいらしい。

Windows 上に Linux ディストリビューションをインストールする前に、”Linux 用 Windows サブシステム” オプション機能を有効にする必要があります。

管理者として PowerShell を開き、以下を実行します。

ごめんて。


PS C:\WINDOWS\system32> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
展開イメージのサービスと管理ツール
バージョン: 10.0.19041.1
イメージのバージョン: 10.0.19041.264
機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。

Ubuntu起動

指示に従ってコマンドを実行後、PCを再起動していよいよUbuntuを起動。

5分くらいでインストールは完了します。インストール後はshellで下記を実行。


$ sudo apt-get upgrade
$ sudo apt-get update

普段はmacbookでzshユーザーなので、WSL2のUbuntuにもzshを導入してみます。


$ sudo apt-get install zsh

インストールできたかは which zsh で確認。インストールできたら、次にpreztoを導入。


$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"  
$ chsh -s $(which zsh)

ここまで完了したら、一度Ubuntuのコンソールを閉じ、再度開きます。

再度開くとなんか聞かれるので qを押して抜けます。すると、下記のようなコンソールになっていると思います。

このままだとダサい&zshの恩恵をあまり受けられないので

  • シンタックスハイライト
  • コマンドの推測
  • 良い感じのテーマ

を導入します。vi .zpreztorcで、設定ファイルを編集します。


zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'syntax-highlighting' \  <-- 追加
  'autosuggestions' \       <-- 追加
  'prompt'
 
 
zstyle ':prezto:module:prompt' theme 'sorin'
↓
zstyle ':prezto:module:prompt' theme 'pure'

ここまで完了したらもう1回Ubuntuのコンソール開きなします。するとデザインが変わっているはず…。

現在のディレクトリ名が表示されたり、pwTabキーを押すとpwdをはじめいくつかのコマンドを推測してくれます。(cdコマンドでTabを入力したときのディレクトリ候補も、矢印キーで選択できるようになってます。)

これ以降はお好みでカスタマイズしてみてください。

各開発環境の導入

その前に

WSL2のパッケージインストールは、アーカイブミラーからダウンロードされているようで、これが遅い。(詳しくはここ)これを変えます。

https://launchpad.net/ubuntu/+archivemirrorsに世界中のミラーサイト一覧があるので、Japanのところで生きてそうなミラーを探します。今回は山形大のミラーにします。


sudo sed -i "s/archive.ubuntu.com/linux.yz.yamagata-u.ac.jp/" /etc/apt/sources.list

上記を実行後、sudo apt update でリソースを更新。これで爆速apt-get が実行できます。

C++

まず、clang派のみなさんむけ。

普通に sudo apt-get install clang すると6.0.0とかいう古いものが入るので、LLVM経由でインストール。先人の知恵を借りました。


❯ clang --version
clang version 9.0.0-2~ubuntu18.04.2 (tags/RELEASE_900/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

c++コマンドでも可。

次に、gcc派のみなさんはこちら。


sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt install gcc-10

結果はこちら。


❯ gcc-10 --version
gcc-10 (Ubuntu 10.1.0-2ubuntu1~18.04) 10.1.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gcc-10 が冗長に感じる場合は .zshrcでエイリアス張ります。


alias gcc="gcc-10"
alias g++="g++-10"

Python3

なんと標準で最新版がバンドルされているではないか!嘘こきました、sudo apt install python3.8で3.8系がちゃんと入ります。指摘してくれた後輩ありがとう。


❯ python3.8 --version
zsh: correct 'python3.8' to 'python2.7' [nyae]? n
Python 3.8.0

Node.js

Node.jsの場合は複数のバージョンを導入したいこともあるでしょう。ということでmacではおなじみのnodebrewを使います。


curl -L git.io/nodebrew | perl - setup

...
========================================
Export a path to nodebrew:
export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

パスを通せと言われるので、.zshrcに通し、source .zshrcでリロード。

そこまで行けば、あとは nodebrew install v12.16.3とかして、nodebrew use v12.16.3 とかすると


❯ node --version
zsh: correct 'node' to 'od' [nyae]? n
v12.16.3

と、いい感じ。

Java

8系を入れる場合は sudo apt install openjdk-8-jdk で入ります。


❯ javac -version
javac 1.8.0_252

ベンチマーク

他環境との差。そのうち書きます→

VSCodeとの連動

VSCodeには公式のWSL拡張機能があります。

インストール後、リモートエクスプローラー欄にあるUbuntu-18.04を選びます。

※Node.jsをインストールしている場合はセキュリティ警告が表示されます、許可を押してください。

ちょっと待つと、別ウインドウで立ち上がるはずです!

ターミナルもちゃんとWSL2のUbuntuになっていて、完璧。

コーディングしてみる

WSL2のコンソール上で任意のリポジトリをクローン後、code . とすると、さっきの拡張機能のおかげなのか知らないですがカレントディレクトリでVSCodeが開いてくれるw 神ww


~/development/up-tri
❯ git clone git@github.com:up-tri/rndstr.git
Cloning into 'rndstr'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.
~/development/up-tri
❯ cd rndstr
~/development/up-tri/rndstr master
❯ code .

Git操作もソース管理タブからいけます。

所感

  •  WSL2になってmacその他と遜色ない開発が実現できそう。
    • ただし、書体がいまいち(相変わらずTTFしか使えない)
    • 4Kモニターだとまだ使えるけど2Kモニターだとコンソール自体が見にくいかな
  • 本格的な開発をしてみないとわからないけど、CPUやRAMの消費もぼちぼちという印象
    (上で紹介したRemote-WSLでVSCodeで開発する場合。他はわからん。)

code . でVSCodeのリモートが直接開くので、WSLであることをそんなに意識する必要もなくなりそう!

おまけ、WSL2で変わったところ

WSL2はWSL1の完全な上位互換、という訳ではないようです。

https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions

公式ブログでもOS ファイル システム間でのパフォーマンスにXがついてたりします。
現に僕のフォロワーさんが、WindowsからLinuxファイルを呼ぶと一部プロセス(COM Surrogate)が暴走する現象を確認しています。