◆ fedora が出ないから Ubuntu で使い始めた
◆ msys2 のほうがいいところも WSL のほうがいいところもある
  ◆ WSL でジャンクションが効かないのは不便
  ◆ wsltty を使えば msys2 に感じでターミナル操作ができる

いつ見ても debut はデビューって読めません
デブっと ですよこれ

それはさておき とうとう WSL デビューしました
fedora が来たら使うと決めてたのに もう fedora が対応すると発表して 2 年近くなります
一応 fedora はあるにはありますが 公式ではなく全くのサードパーティが出してるのもので 有料です
さすがにこれは対象外なので 本家が来るのを待っていたのに全く来る気配もないです
WSL あったほうが便利だなぁと思うことも増えたので Ubuntu で使うことにしました

shell が使いたい時

Linux コマンドを動かしてみたいときがあります
基本は VM ですが 最近はたまにしか使わないので VM を起動してなくて ちょっとコマンド試すだけにわざわざ起動するのも面倒です

こことか shellscript を実行するところはありますが できることが制限されてるのが多いです
ファイル書き込みできないとかがあると試したいことができないこともあります
それに shellscript を書いて 1 回実行のタイプだとエディタやインタラクティブなコマンドが使えません

REPL もあってこっちは良さげです
ただ nano は入ってないですし vi/vim は起動すると固まります
emacs は動くものの画面表示が少しおかしいです

やっぱり手元に環境ある方がいいなと思います

msys2

msys2 があれば すごく手軽に shell を使えます
コマンドプロンプトを開く感じでウィンドウを開くだけなのですごく楽です

git が入ってれば git bash が基本入ってると思いますが あれも msys2 です
git 用なのでパッケージマネージャの pacman がなかったりなど 多少使いづらいのでしっかり使うならちゃんと msys2 を入れた方ができることも多いです

とはいえ 入れるのも面倒なんですよね
新規にインストールするなら msys2 にしなくても Windows が公式サポートしてる WSL でいい気もします
基本的なコマンドや一般的なものなら pacman で入れられますが 少しマイナーどころになると パッケージがみつからないのもありますから Ubuntu のパッケージが使えるのは魅力です

インストール

そういうわけで 今から新しく入れるなら msys2 より WSL でいいかな と思ったので Ubuntu をいれることにしました
あと RHEL 系ではバイナリが用意されてなくて Ubuntu 系では用意されてる HHVM を入れたかったというのもあります
自分でビルドすればいいのですが VM のスペックだとメモリやストレージが足りなくなるほどなんですよね

インストール方法ですが BoW 時代はいろいろ設定とかもあったようですが 今はもう正式版 WSL ですBoW など古い情報は捨てて WSL のインストール方法を調べるとすごく簡単でした

WSL の有効化

まずは 「Windows の機能の有効化または無効化」 のウィンドウを出して 「Windows Subsystem for Linux」 にチェックを入れて再起動します
「Windows の機能の有効化または無効化」 はコントロールパネルから出してもいいですが Windows ボタンを押して 「optionalfeatures」 と入力して起動すると楽です
最近の Windows はコントロールパネル出すのすら面倒になってますからね

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

WSL で実行する Linux ディストリビューションはストアアプリになっています
Microsoft Store からインストールします

Ubuntu だと Ubuntu と Ubuntu 16.04 LTS と Ubuntu 18.04 LTS があります
バージョンなしの Ubuntu はその時点の最新版の LTS がインストールされるようです

インストールが終わったら通知が出てくるので起動します
初回起動のみセットアップで数分待たされます
終わるとユーザ名とパスワードの設定をして完了です

起動

それ以降は Ubuntu アプリを起動するとコマンドプロンプトのような感じで起動して Ubuntu の bash が使えます
昔は BoW という名前でしたが別に bash である必要はなくて fish をインストールすれば fish にできます

コマンドプロンプトから ubuntu コマンドや wsl コマンドを実行しても起動できます
別ウィンドウにはならずコマンドプロンプト上で実行されます

設定

wslconfig コマンドを使ってインストールされてるディストリビューションのリストを見たりデフォルトディストリビューションを設定できます
このコマンドはコマンドプロンプトで実行するもので オプションはコマンドプロンプト風の / 指定です

wslconfig /?

で使い方が見れます
/l で一覧表示
/s でデフォルトディストリビューションの切り替えです

Ubuntu のデフォルトユーザを切り替えたいときは

ubuntu config --default-user <username>

で設定できます
ubuntu コマンドはコマンドプロンプトで実行しますが Linux 風です

Linux のファイル

Linux の環境が Windows 上にあるわけですので どうにか見れないかなと探したら

C:\Users\USERNAME\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs

が Ubuntu のルートフォルダになっていました

AppData\Local\Packages はストアアプリのデータがある場所です
ストアアプリなのでその中のひとつという扱いです
Suse とか Debian とか別のディストリビューションを入れるとこのフォルダの中に別の名前でフォルダが作られるはずです

VirtualBox などのようにストレージ全体が 1 ファイルにまとめられてるかとも思いましたが 普通に各ファイルやフォルダが Windows でもファイルやフォルダとして認識されてます

ただ 注意するところがあって ファイルが見れますがここを編集しても WSL 側へ即時に反映されません
ファイル作った後に ls してもでてきません
ウィンドウを閉じて再起動後に反映されています
新しく作ったファイルは権限がない状態なので chmod で設定する必要あります

一応これでコピーなどができるのですが Windows から直接触るのは推奨されてない方法らしく最悪再インストールが必要になるかもしれません
まぁ数分でできるので Windows の通常のフォルダで全部管理していて Ubuntu のデータがいつ全部消えても困らないくらいなら気にせずやってもよさそうですけど

GUI

X server をインストールすれば GUI アプリケーションも使えます

Windows 側で VcXsrv などの X サーバを起動しておきます
Ubuntu では GUI アプリケーションをインストールして 環境変数に

DISPLAY=localhost:0.0

を設定します
あとは普通に起動すれば Windows のウィンドウと並んで Linux のウィンドウが表示できます

とりあえず Nautilus を入れてみた感じ普通に動いてました
ただ 設定を変更できなくて dbus-x11 をインストールすることで設定も変えられるようになりました

Nautilus は デザインは エクスプローラに比べるといまいちですが そこそこ好きなファイラーなんですよね
▶ アイコンをクリックすればその場にフォルダの中身を表示できるのが良いです
Windows でもこれができるようになってくれればいいのですけど

msys2 との比較

exe

msys2 は Windows のパスでいけます

"C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\MSBuild\15.0\Bin\Roslyn\csi.exe"
cd C:\\Windows

また実行するときの拡張子の exe は省略できます

WSL ではマウントポイントからパスを書く必要があって C:\\ はできません
また拡張子も必要です

最初 notepad を起動してみようとしてダメで Windows の exe は無理なんだと思っていたのですが 拡張子までつけると起動できました
ちょっと面倒ですが csi などで文字化けしなかったりと良いところもあるので ちゃんと Linux の動きに準拠してると考えれば こっちでいい気もします

Windows 上のマウント

Windows でも Linux のようにフォルダにパーティションをマウントできます
C:\disk に外付けディスクをマウントしたりしていて msys2 では問題なく扱えています
普通のフォルダのような扱いです
しかし WSL 上ではこういう部分を認識してくれません

Ubuntu でみてみると

lrwxrwxrwx 1 user user   0 Jan  8 12:31  disk

こういう表示で 画面上は赤色(エラーがあって開けないもの)です
アクセスすると

ls: cannot access 'disk': Input/output error

とエラーになります

cifs マウントだとジャンクションを設定すれば 公開フォルダ外もアクセスできるので
C:\link → C:\disk のようにシンボリックやジャンクションを設定してみましたがダメでした
そもそも Windows のフォルダへのマウント機能自体が \??\Volume{...}\ へのジャンクションのようです

2019/01/08  12:31    <JUNCTION>     disk [\??\Volume{feca3030-4d75-297c-b124-99a69b056ecd}\]

Ubuntu 側で df コマンドでみてみると /mnt に C ドライブや E ドライブなどドライブレターが設定されたパーティションがマウントされていますが C:\disk のようにフォルダにマウントしたパーティションは見つかりません

> df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
rootfs lxfs 975762576 329846744 645915832 34% /
none tmpfs 975762576 329846744 645915832 34% /dev
none tmpfs 975762576 329846744 645915832 34% /run
none tmpfs 975762576 329846744 645915832 34% /run/lock
none tmpfs 975762576 329846744 645915832 34% /run/shm
none tmpfs 975762576 329846744 645915832 34% /run/user
C: drvfs 975762576 329846744 645915832 34% /mnt/c
E: drvfs 3907000316 352728 3906647588 1% /mnt/e

Windows の設定をそのまま使うのは無理そうだったので Ubuntu 側で mount することで対処しました

sudo mount -t drvfs C:\\disk /mnt/disk

Windows 上のフォルダの場所とそれをマウントする Ubuntu 上のフォルダを指定します
フォルダへのマウントを扱えはするものの 一手間必要なのと Windows と同じパスでアクセスできないところが少し不便です
これに限らずジャンクション系は全滅してそうです

スクロール

msys2 では mintty を使っていて それだとインストールやビルドみたいな画面がほぼ常に更新され続けている状態でも 上にスクロールしたらその場所を維持できます
それが WSL だと コマンドプロンプトのようになにか更新されるとすぐ一番下に戻されて過去ログを見づらいです

さらに less や nano などツール内でスクロールが行えるツールで マウスのホイールでスクロールできません
msys2 ではマウスでも操作できる部分が使いやすくてよかったのでこのあたりは 地味なようで重要なんですよね

これは WSL というよりそれを表示するターミナルソフトの問題なので 標準のターミナルではなく mintty の WSL 版である wsltty を使えば同じように使えます
インストーラでインストールして起動すると自動でインストール済みのディストリビューションで起動します
使い勝手は mintty と同じなので msys2 に慣れている人はいつもどおり扱えます

wsltty

ポートフォワード

msys2 で一番つかってたのが ssh でその 2, 3 割はポートフォワードです

ssh -f -N -L 10000:localhost:80 root@fedora

と設定して

http://localhost:10000/

にアクセスするというようなのが多いです

WSL でも ssh コマンドは使えるのでそのまま使えます
どちらもウィンドウを閉じてもバックグラウンドで実行され続けます

ただ msys2 では bind 済みのポートに再 bind しようとすると

bind [127.0.0.1]:10000: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 10000
Could not request local forwarding.

とエラーメッセージが出るのに WSL では出ませんでした
原因はわかりませんが 解除を忘れて再 bind してしまうことはけっこうあるので 何も出ないのは少し不便です

HHVM

入れた理由の一つである HHVM をインストールして起動してみると

$ hhvm
-bash: /usr/bin/hhvm: cannot execute binary file: Exec format error

起動できませんでした
Ubuntu のはずですがバイナリファイルのフォーマットがおかしくて実行できないようです

バージョンは

(4.0.2-1~bionic)

です

ビット数の問題かなと思いましたが

$ file /usr/bin/hhvm
/usr/bin/hhvm: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c1a36ec29ed20350238243e196dc76cf82ba70d8, stripped

$ lscpu
...
CPU op-mode(s): 32-bit, 64-bit
...

64 bit なんですよね
結局あきらめて docker にしたのですが それはまた別のお話