西川和久の不定期コラム

Windows 10 Creators Updateで「Bash」がバージョンアップ【前編】

~Ubuntu 14.04.5 LTSから16.04.2 LTSへ。WindowsのEXEも実行可能

Windows 10 Creators UpdateでBashもバージョンアップ

 Windows UpdateによるCreators Updateへのアップデートは未だ始まっていないが、日本時間の4月6日未明から「Update Assistant」を使うことによって、Creators Updateにアップデートできるようになったのはご存知のとおりだ。

 Creators Updateによる機能追加・拡張部分はほかの記事に譲るとして、今回はBashに的を絞ってご紹介したい。

 まず、Windows 10 Anniversary UpdateですでにBashがインストール済みの場合は、Creators Update直後は何も変化せず、Ubuntu 14.04.5 LTSの環境が維持される。このため、新しいBashをインストールするには、いったん旧環境を削除しなければならない。この時、Linuxファイルシステムごとなくなるので、何か環境を構築している場合はバックアップが必要となる。

Windows 10 Creators Update直後は、Windows 10 Anniversary UpdateのBashのまま。Ubuntu 14.04.5 LTS

 Bashを削除する方法は、Windows PowerShell(管理者)を起動し、

PS C:\WINDOWS\system32> lxrun /uninstall /full

これで綺麗に消えてなくなる。またBashをインストールしていない場合は、Windowsのプログラムと機能 > Windowsの機能の有効化または無効化で「Windows Subsystem for Linux (Beta)」へチェックを入れ、再起動後、設定 > 開発者向け機能を使う > 開発者モードにチェックを入れる(再起動)。

 これで、これまでBashを使っていた人も、使っていなかった人も同じ状態になる。そしてWindows PowerShell(管理者)から、

PS C:\WINDOWS\system32> bash

と入力。以降、メッセージに従って必要な項目を入力する。

続行するには、"y"を入力してください: y
Windowsストアからダウンロード開始
ファイルシステム展開
UbuntuのロケールをWindowsのロケール(ja-JP)と一致するように設定しますか? 既定のロケールはen_USです。続行するには、"y"を入力してください: y
新しいUNIXユーザー名を入力してください: xxxxxxxxx
新しいUNIXパスワードを入力してください: xxxxxxxxx
新しいUNIXパスワードを再入力してください: xxxxxxxxx

以上で設定が完了する。

 そのあと、いったんexitでWindows PowerShellから抜ける。Bashを起動するのは、スタートメニューの「Bash on Ubuntu on Windows」をクリックすればOKだ(もしくはWindows PowerShellからbash)。またrootユーザーでコマンドを実行するsudoを使用する時は、先に入力したパスワードを使う。

 Bashを起動した状態でUbuntuバージョンを確認すると、

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

と、Ubuntu 16.04.2 LTS(xenial)になっているのがわかる。加えて念のため、

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

で、パッケージを更新する。以上でBashを使用する準備が完了する。

古いBashを削除してからの一連のインストール。Windows 10 Creators UpdateのBashはUbuntu 16.04.2 LTS
本家Server/Desktop版ともに同じUbuntu 16.04.2 LTS

新Bashのパワーアップ内容

 Ubuntu 14.04.5 LTSから16.04.2 LTSになったので、パッケージ内容が違うのは当然として、Bash on Ubuntu on Windowsとしてのパワーアップ部分がいくつかある。

1) 日本語表示が良くなった
2) BashからWindowsのEXEを実行できる(逆も可能)
3) /sbin/ifconfigなどネットワーク系のコマンド対応

1)は、旧Bashは日本語が混ざるとフォントの半分が被ったり妙なことになっていたが、新Bashではうまく表示できるようになった。Bashと言うよりターミナル側の修正だが、嬉しい改善ポイントと言えよう。加えてカラーも表現できるようになった。

旧Bashでの日本語表示(日本語が崩れている)
新Bashでの日本語表示(日本語を正常に表示)

 2)はBashからWindowsのEXEを実行したり、WindowsからLinuxのコマンドを呼べるようになった点だ。たとえば、

$ df | Hidemaru.exe
※dfコマンドの実行結果をWindowsの秀丸へ渡す(Hidemaru.exeへの PATH=/mnt/c/Program Files (x86)/Hidemaru を通す、もしくはフルPATHでコマンド指定)

PS C:\Users\knish> dir | bash -c "grep 2015"
※dirコマンドの実行結果をBashのgrepに渡し、(おもに)タイムスタンプが2015のファイルだけ抽出
dfの結果を秀丸へ渡す
Windowsに設定しているPATHが自動的に入っている。カラー対応

こんなことが可能になったわけだ。BashからWindowsのEXEを実行するときに必要(あったほうが便利)な、PATHに関しては、Windowsの環境変数PATHは自動的にBashへセットされるが、秀丸など通常Program Files(x86)下の各アプリケーションはPATHが通っていないので、使うものだけ別途通さなければならない。

 この双方のコマンドを呼べる機能は、標準入出力を使い結果をダイレクトに渡せるので、便利なケースもあるだろう。ただし、Windows側のコマンドが標準入力に対応している必要があり、notepad.exeではうまく行かなかった。

旧Bashでは/sbin/ifconfigコマンド自体はあったものの作動しなかった
新Bashでは/sbin/ifconfigコマンドは作動する

 3)は旧Bashではまったく機能しなかったが、新Bashではpingコマンドも含め動作する。 /proc/net/devも存在する。また直接は関係ないが、旧Bashでは「ホスト xxxx の名前解決ができません」……と表示され、Windows側で設定しているホスト名とIPアドレスを/etc/hostsへ手動で追加する必要があったが、新Bashでは自動的に登録され、このメッセージは表示されなくなった。

 そのほか、対応するsyscall(API)も増えたようだが、ピックアップするのは大変なので省略する。MSDNのこの辺りにいろいろ書かれているので、興味のある人はぜひご覧いただきたい。

 以上、簡単であるが、Windows 10 Creators UpdateのBashインストール方法と、パワーアップした内容などをご紹介した。旧Bashでもそれなりに使えたものの、新Bashは大技小技混合の気の利いたアップデートとなっている。

 一点、変わらないのが、Ubuntu側のファイルシステムは、Windowsから参照はできるものの(C:\Users\[Username]\AppData\Local\lxss)、追加/変更/削除を行なえないことだ(一見できそうだが、ファイルシステムが壊れてしまう)。

 WindowsからもUbuntuからもアクセスしたい場合には、Windowsのファイルシステムが /mnt/cにマウントされているので、Windowsから普通に扱えるフォルダで作業する必要がある。これさえうまく動くようになれば、もっと便利なのだが……。

Bashを使ってプログラミング

 以前、Windows 10 Anniversary UpdateのBashでは、LAMP環境を構築、WordPressを動かしたが、今回も同じでは面白くないので、「Raspberry Pi 3 Model B」の時にも軽く遊んだプログラミングをしてみたい。

 ただ、一言でプログラミングと言っても、PHP、Perl、Ruby、Pythonなど言語はさまざま。またデータベースもMySQL、PostgreSQL、そしてNoSQLのMongoDB……何をどう扱うか悩みどころだ。

 最近、個人的には、WordPressのREST APIを使っていろいろ試していたので(Node.js+Express+EJS+MongoDB)、そのネタでもいいのだが、「本サイトには少し重い内容かな!?」と思いつつも、後編で紹介することとしたい。