WSL(Windows Subsystem for Linux)のターミナル比較とcygwin/Dockerとのベンチマーク

Tech

2020.2.6

Topics

こんにちは。tocci3です。
Windows 7のサポート終了に伴い、会社のデスクトップマシンをWindows 10に移行しました。
最近移行された方も多いのではないでしょうか?

いままでは手元のUNIX系OSの実行環境としてcygwinを使ってきたのですが、Windows 10で対応したWSL(Windows Subsystem for Linux)をインストールしてみました。

導入に関し、少し悩んで試してみたこと、

  • WSL(とcygwin)を使うにはどのターミナルが使いやすいか?
  • Windows上のCUI・UNIX系OSの実行環境として、WSL/cygwin/docker(とWindows 10ネイティブも) のどれを使えばいいか?
    (bash/python/Apache Spark についての簡単なベンチマーク)

などを簡単にまとめておきます。

WSLとは

WSL(Windows Subsystem for Linux)とは、以前 “Bash on Windows” とも呼ばれた、Windows 10から対応したWindows上でLinux環境を扱える仕組みです。
今までは似たようなものとしてcygwinやMSYS2MinGW)などがありましたが、WSL はMicrosoftが公式に対応しているところが違います。
Windowsのバージョンの関係で、WSL 2 ではなく今回はWSL 1 をインストールして試してみます(Windows 10のバージョン確認は、設定>システム>バージョン情報)。

WSLのインストール

はじめはこちらの記事を参考にインストールしてみました。

手元の環境では、「Linux Subsystemを有効化」、「開発者モードの有効化」まではすんなりいったのですが、ポリシーの設定上Microsoft StoreからUbuntuなどディストリビューションのダウンロードはできませんでしたので、各ディストリビューションは以下を参考にコマンドライン、または手動でダウンロード、インストールしました。

Fedoraについてはダウンロードしてスムーズに行ったのですが、debianやubuntuについては同様に行うと起動時にエラーになるため、拡張子をzipに変えて解凍する方法で動きました。
同様になんらかの理由でMicrosoft Storeが使えない場合はこの方法でインストールできるかもしれません。

ディストリビューション初回起動時にデフォルトのユーザーを聞かれるのですが、debianとubuntuについては設定したいユーザー名がポリシーに合わず、Ctrl-Cで強制終了して再度起動するとrootで起動できるといったことがありました(ubuntuについてはデフォルトユーザーをrootに戻せず再インストールしたりしました・・・)。

他にも不安定な点があり、何度かアンインストール&再インストールしました(特にWindowsからファイルアクセスしようとするとおかしくなることがありました)。
上記のサイト等にも記述がありますが、しばらくは不安定なので温かい目で見守る必要があるかもしれません。
重要なファイルはWSLで扱わないか、WSLの外側にバックアップした方が良いでしょう。

WSLのターミナル

デフォルトのターミナルはコマンドプロンプトと同じで使いにくいため(Windows 7 からは少し改善されてましたが)、いくつかのターミナルを試してみました。
できればターミナルアプリ側で(tmux等ではなく)ウィンドウ分割ができ、WSLとcygwinを(ウィンドウ分割で)併用できるものがいいと思っていました。
結論としては、今はWSLからsshdを起動して、以前から使い慣れた rloginというターミナルから接続するのがいいと思いました(cygwinも同様)。
ちょっとした用途にはcmder、またはWSLはHyper、cygwinは昔ながらのminttyを使うのもいいと思います。

いくつか試してみたので、少し主観も交えた感想や特徴などをまとめておきます。

Hyper

  • 美しい(フォントなどの設定は必要)
  • プラグインがたくさんある
  • ウィンドウ分割できる(左上3本線の設定>File>Split Horizontaly/Verticaly)
  • URLをクリックしてブラウザで開ける
  • 😟ウィンドウの位置を入れ替えられない(ように見えます(v3.0.2))
  • 😟WSLのウィンドウを開いて、別にcygwinのウィンドウを開く、ようなことが難しそう(開いてからコマンドを打ったりすればできるが、直接WSLを開くようにしているとできない)
  • 設定ファイルにコメントがあるので、よく読むといろいろ設定できます(copyOnSelect: truequickEdit: trueなど。cursorBlink: true はバグがあるようで効きませんでした)
  • 参考:Windows Subsystem for Linux + Hyper を使う – Qiita

cmder(ConEmu)

Wsltty

  • cygwinでよく使われる minttyをベースにWSL用に開発されたもの
  • おそらくcygwinユーザーには使い慣れたインターフェース
  • フォルダやファイルをドラッグ・アンド・ドロップでパス展開してくれる
  • URLをCtrl+クリックしてブラウザで開ける
  • 😟ウィンドウ分割できない
  • 😟少しバグが多い?(私の環境(v3.0.6)ではディストリビューション別のターミナルはエラーで起動できず、「WSL Terminal %」だけ使えました)
  • 参考:WSLのコンソールを便利で高機能な「wsltty」に置き換える:Tech TIPS – @IT

sshd +rlogin

  • sshd (sshデーモン) を起動すればあとは使い慣れた好きなターミナルソフト(rloginなど)を使えるのでおすすめ
  • rloginはウィンドウ分割やウィンドウの入れ替えが自由にできる
  • 設定すればURLをコピーしたときにブラウザで開ける(オプション設定>クリップボード>http:で始まる…をチェック)
  • 😟デフォルトではフォルダやファイルをドラッグ・アンド・ドロップでパス展開しない(アップロードしようとする)

sshdをWindowsログオン時に自動起動するには

WSL はfedoraをメインで使っているのですが、サービスを登録する機構がないようなので、startupから.batファイル経由でWSLのデフォルトユーザー権限でsshdを起動するようにしてみます。
(fedora以外のディストリビューションでは確認できていません。)
例えば、デフォルトユーザーの~/some_dirsshd_config, ssh_host_rsa_key, sshd.pid, sshd.logを置き、起動したいポートを9999とすると、
WSLのシェルから、

dir=~/some_dir
mkdir $dir
ls -l /etc/ssh/ssh_host_*key{,.pub}
# sudo ssh-keygen -A # 上記が無ければホストの鍵ファイルを生成
sudo cp -p /etc/ssh/ssh_host_*key $dir/
sudo chown $USER $dir/ssh_host_*key
echo "PidFile $dir/sshd.pid" >> $dir/ssh_config

などと実行し、

wsl /sbin/sshd -f ~/some_dir/ssh_config -h ~/some_dir/ssh_host_rsa_key -E ~/some_dir/sshd.log -p 9999

というような内容の.batファイルをWindows側で作って、そのファイルかショートカットをstartupフォルダ (%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup) に入れておけばログオン時に起動できます。

この方法で問題がある場合は、OpenSSHopenssh-portableなどをソースからmakeして実行する方法もあると思います。

ちなみにcygwin は普通にsshdをサービス起動できます。

ただし、Windowsデスクトップアプリやcygstartなどはssh経由ではうまく動かないようですので、それらを使いたい場合はminttyを使っています。

デーモンに関しては、WSL 1よりはcygwinの方が安定しているのでいいかもしれません。
WSL 2では、バックグラウンドタスクについて改善されているという記事もあるようです。

sshに関して、他にも必要な設定があれば適宜行ってください(セキュアではない環境では、特に注意して設定するか、sshdは使用しない方がいいかもしれません)。

ターミナルとは直接関係はありませんが、X Window(Linux上のGUI)アプリケーションを使う場合は、Xサーバーとして VcXsrv のショートカットも Startup に入れると楽かもしれません。

WSLのターミナルまとめ

ターミナル ウィンドウ分割 ウィンドウ入れ替え ファイルのドラッグ・アンド・ドロップパス展開
Hyper
cmder
Wsltty
sshd + rlogin

 

WSL/cygwin/Docker/Windows 10のベンチマーク

今回はざっくり、

でどのくらい速いのか/遅いのかを調べるために、

の簡単なベンチマークを取ってみました。
(バージョンはなるべく揃えましたが、普通にインストールするものを比較したいため多少差があります。)

Linux系環境ではtime $commandreal[s]、Windows 10ではpowershellMeasure-Command { %command% }TotalSecondsの値です。

Google Colaboratory上でのSparkセットアップはこちらの手順を参考にしています。

bash bash+ls python3 python2 spark
cygwin 5.683 5.517 0.4930000 0.9180000
WSL (debian) 2.707 1.798 0.3860000 1.0040000 8.1930000
WSL (ubuntu) 2.759 1.785 0.3640000 1.0970000 8.1610000
WSL (fedora) 2.294 2.652 0.4250000 1.4280000 10.9720000
WSL (CentOS) 2.016 4.807 0.4620000 1.1980000 9.8630000
Docker 1.615 0.177 0.6140000 0.9100000 16.8450000
Windows 10 0.6423244 0.8619975 16.5458936
Google Colab 1.811 0.295 0.4460000 1.9020000 6.3460000
command for i in {1..1000000};do : ;done for i in {1..100};do ls / > /dev/null ;done python3 -c "for i in range(10000000):pass" python2 -c "for i in range(10000000):pass" run-example SparkPi 10

 

この結果からは以下が言えるかと思います。

  • python2以外は全体的にGoogle Colaboratoryが速い
  • cygwin はbash, bash+lsで遅い
  • Windows10 はpython3は少し遅く、Sparkは遅め
  • ファイルアクセス(bash+ls)はDockerとGoogle Colaboratoryがかなり速い
  • WSLはいろいろできて中間的な速さ(ファイルアクセス(bash+ls)は少し遅い)
  • python3はpython2より速い
  • pythonの各環境の差はそれほどは無さそう(Google Colaboratoryのpython2はなぜか遅かった)
  • Apache SparkはWindows 10とdockerが遅かった

使用バージョン

bash python3 python2 run-example (Apache Spark) その他
cygwin 4.4.12(3) 3.6.9 2.7.16 cygwin 3.0.7-1 x86_64
WSL (debian) 4.4.12(1) 3.5.3 2.7.13 2.4.4 Scala: 2.11.12, OpenJDK 64-Bit Server VM, 1.8.0_232 Debian GNU/Linux 9.5
WSL (ubuntu) 4.3.48(1) 3.5.2 2.7.12 2.4.4 Scala: 2.11.12, OpenJDK 64-Bit Server VM, 1.8.0_232 Ubuntu 16.04.6 LTS
WSL (fedora) 5.0.7(1) 3.7.3 2.7.17 2.4.4 Scala: 2.11.12, OpenJDK 64-Bit Server VM, 1.8.0_232 Fedora Remix for WSL release 30
Docker 4.4.19(1) 3.7.3 2.7.15+ 2.4.4 Scala: 2.11.12, OpenJDK 64-Bit Server VM, 1.8.0_222 Docker version 19.03.5
jupyter/all-spark-notebook Ubuntu 18.04.2 LTS
Windows 10 3.7.5 2.7.17 2.4.4 Scala: 2.11.12, OpenJDK 64-Bit Server VM, 1.8.0_232 Microsoft Windows [Version 10.0.17134.1006]
Google Colab 4.4.20(1) 3.6.9 2.7.17 2.4.4 Scala: 2.11.12, OpenJDK 64-Bit Server VM, 1.8.0_232 Ubuntu 18.04.2 LTS (ハードウェア アクセラレータなし)

 

WSLについて

WSLについての感想をまとめておきます(インストールして約1ヶ月時点の)。

良い点

  • まあまあ速い(cygwinと比較して)
  • Linuxの環境として、だいたいのデーモン以外のコマンドは動く(cygwinが苦手なjava(Apache Spark等)やjupyterなども)

悪い点

  • DockerやGoogle Colaboratoryよりはファイルアクセスが遅そう
  • デーモン起動しようとすると大変(WSL 1 は)
  • まだ不安定なところがある
  • Windowsとのファイルのやりとりがしにくい、あるいは不安

ターミナルのおすすめ

  • sshdを起動して好きなターミナルを使う(rlogin等)
  • 上記が使えない場合はcmderかHyperを使う(cygwinはmintty)

まとめ

今回はWSLをインストールし、いくつかのターミナルを比較し、cygwinやdockerなどの環境とbashやpyhonなどの実行速度を比較してみました。
WSL 1 はデーモン起動に難がありますが、Apache Sparkが動いたりjupyterも動くため、私はしばらくはcygwinと併用して使うことになると思います。
どのくらいのcygwin、WSLユーザーがいるかわかりませんが、この記事が一助になれば幸いです。

参考

 

tocci3

機械学習、ビッグデータ(Hadoop/Spark)関連のシステム開発やデータ分析などをしています。 音楽(クラシック、チェロ、HR/HM)と健康関連(筋トレ、糖質制限)と開発全般と機械学習・ビッグデータなどに興味があります。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら