WSL(Windows Subsystem for Linux)のターミナル比較とcygwin/Dockerとのベンチマーク
こんにちは。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やMSYS2(MinGW)などがありましたが、WSL はMicrosoftが公式に対応しているところが違います。
Windowsのバージョンの関係で、WSL 2 ではなく今回はWSL 1 をインストールして試してみます(Windows 10のバージョン確認は、設定>システム>バージョン情報)。
WSLのインストール
はじめはこちらの記事を参考にインストールしてみました。
手元の環境では、「Linux Subsystemを有効化」、「開発者モードの有効化」まではすんなりいったのですが、ポリシーの設定上Microsoft StoreからUbuntuなどディストリビューションのダウンロードはできませんでしたので、各ディストリビューションは以下を参考にコマンドライン、または手動でダウンロード、インストールしました。
- WSL (Windows Subsystem for Linux) をコマンドラインでインストールする – Qiita
- Manually download Windows Subsystem for Linux (WSL) Distros | Microsoft Docs
- CentOSはこちらの方法でインストールできました
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: true
やquickEdit: true
など。cursorBlink: true
はバグがあるようで効きませんでした) - 参考:Windows Subsystem for Linux + Hyper を使う – Qiita
cmder(ConEmu)
- ConEmuというターミナルから枝分かれして出来た
- ウィンドウ分割できる
- cygwinも扱える(WSLと同時に別ウィンドウで開ける)
- 設定で中身のターミナルアプリケーションをデフォルトのものから変更できる
- フォルダやファイルをドラッグ・アンド・ドロップでパス展開してくれる
- 😟ウィンドウの位置を入れ替えられない
- 😟設定が色々必要でごちゃごちゃしている印象
- 😟コピペがおかしくなるなど動作が少し不安定
- 参考:
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_dir
にsshd_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
) に入れておけばログオン時に起動できます。
この方法で問題がある場合は、OpenSSHやopenssh-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のベンチマーク
今回はざっくり、
- WSL
- cygwin
- Docker (jupyter/all-spark-notebook)
- Windows 10
- Google Colaboratory(Windows上ではないですが比較のため)
でどのくらい速いのか/遅いのかを調べるために、
- bash
- bash+ls
- python (2, 3)
- Apache Spark(local mode)
の簡単なベンチマークを取ってみました。
(バージョンはなるべく揃えましたが、普通にインストールするものを比較したいため多少差があります。)
Linux系環境ではtime $command
のreal[s]
、Windows 10ではpowershell
のMeasure-Command { %command% }
のTotalSeconds
の値です。
Google Colaboratory上でのSparkセットアップはこちらの手順を参考にしています。
この結果からは以下が言えるかと思います。
- 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ユーザーがいるかわかりませんが、この記事が一助になれば幸いです。
参考
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitter機械学習、ビッグデータ(Hadoop/Spark)関連のシステム開発やデータ分析などをしています。 音楽(クラシック、チェロ、HR/HM)と健康関連(筋トレ、糖質制限)と開発全般と機械学習・ビッグデータなどに興味があります。
Recommends
こちらもおすすめ
-
Airflowのクラス設計のTips
2023.2.3
-
DockerCon EU 2015 Catch up!潜入レポート
2015.12.16
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28
AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16