西川和久の不定期コラム

Windows 10 Anniversary Updateで搭載した「Bash」を使ってみた!

~UbuntuがWindows 10で動く!?

 Windows 10 Anniversary Updateのローリングアウトが8月2日に始まった。10のユーザーであればほぼアップデート済みではないだろうか。いろいろ機能追加された中、今回はBash(バッシュ)に焦点を当ててご紹介したい。

 基本的に開発者向けの機能ということもあり、開発者以外の方々にはつまらない、もしくは分かりにくい内容であり、また既にBashを試しているユーザーには既知の内容になることを予めご了承頂きたい。

筆者最近の開発環境

 Windows 10 Anniversary UpdateのBashをご紹介する前に、筆者最近の開発環境の話を書いてみたい。実はこのBashの登場によって、今後大きく変わる可能性があるからだ。

 昔はWin32やiOS/Androidアプリの開発を行なっていたが、最近はApache、PHP、Perl、MySQLなどを主に使った、つまり古典的なLAMP(Linux、Apache、MySQL、PHPの略)によるサイト系の開発が多くなっている。個人が扱える内容なので小規模だが、新規サイトの構築、古いサイトのリニューアル、企業の社内システム、開発元が居なくなり手の付けられなくなったシステムの解析/機能追加……などが主要どころだ。

 これらの開発を行なう場合、新規以外、作動中のオリジナル環境をそのまま触るわけにも行かず、別途サーバーを構築し、その上で開発/デバッグ/テスト、そしてそれを終えてからリリースという手順になる。

 この時、別途構築するサーバーは、大きく分けて2パターンに分かれ、1つは仮想マシン上にほぼ同じ環境を構築するケース。これはメールシステムやcron、シェルスクリプトなど、作動環境も密接に関係している場合だろうか。

 もう1つはXAMPP(Windows上での簡易LAMP環境)的なものやOS Xを使うケース。これはApache+MySQL+PHP(+Perl)だけで完結し、環境依存しない場合となる。Windows上の疑似LAMP環境としてXAMPPより更にLinuxに近いCygwinやcoLinuxもあるが、これは(最新版は分からないが)初期版の印象がピンとこなかったこともあり、実務レベルでは使ったことがない。

 手掛けるシステムは後者が多く、通常OS Xをそのままサーバーにして(ベースがUnixなので、Linux系と相性が良い上、専用のパッケージなども用意され環境が整っている)、Parallels DesktopでWindowsを作動させ、その上で開発することがほとんど。全てをOS X上で行なわないのは単に慣れの問題だ(笑)。一時、素のWindowsでXAMPPを動かしていたが、互換性などいろいろ問題もあり、今では使わなくなってしまった。

 ただこれはOS Xありきなので、Windows単独で……とした場合、仮想PC上でLinuxを動かすか、XAMPP的なものを使うかの2択となり、メモリとストレージが少ないノートPCなどでは前者は不利。しかし後者だと互換性の問題が……と、悩ましい話となる。もちろんクラウドを使う手もあるが、今度はネットありきとなり、デモなどをしにくかったりする場合もある。

 そんなところに登場したのが、Windows 10 Anniversary Updateで搭載したBashだ。当初は「Bash on Ubuntu on Windows」と言うネーミングから、PowerShell的にBashが動くだけかと思っていたが、実は“ほぼ”Ubuntuに近い≒「Ubuntu on Windows」である。

Windows 10 Anniversary UpdateでBashの動かし方

 BashはWindows 10 HomeでもProでも対応しているが、標準では入っておらず、セットアップする必要がある。手順は以下の画面キャプチャを参考にして欲しい。再起動が2回あるがインストール方法自体は簡単だ。途中でユーザー名とパスワードを設定する部分があるが、これはWindowsと独立しているので、同じにする必要はない。

設定/更新とセキュリティ/開発者向けで”開発者モード”を選択(再起動)
コントロールパネル/Windowsの機能で”Windows Subsystem for Linux(Beta)”をインストール(再起動)
コマンドプロンプトで“bash”を起動
yを入力するとWindowsストアからモジュールをダウンロード、ファイルシステムが構築される
Linux上でのユーザー名とパスワードを設定する
Bashが起動。一旦exitで終了する
スタートメニューに「Bash on Ubuntu on Windows」が追加された
アイコンをクリックしてBashを起動。Bashしか動いてないのが分かる。プロパティ/画面の色で背景を半透明にすることも可能

 作動ロジック自体は、ここを参照して欲しいが(特にビデオ)、WindowsのカーネルにLinuxのサブシステムが入り、それを通じてUbuntuとやり取りしているイメージとなる。

Bashだけでなく、Ubuntuで作動するコマンドやパッケージも利用可能

 さてBashが起動して、psやtopなどありがちなコマンドを打ったところ普通に動く。以下、簡単なコマンドの結果だ。Ubuntu自体のバージョンは“14.04.5 LTS”となっている。

$ lsb_release  -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty


$ bash --version
GNU bash, バージョン 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降


This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


$ mount
rootfs on / type rootfs (rw,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204320k,mode=755)
none on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
none on /run/shm type tmpfs (rw,nosuid,nodev,relatime)
none on /run/user type tmpfs
(rw,nosuid,nodev,noexec,relatime,size=102400k,mode=755)


$ ls -l /mnt/c
ls: /mnt/c/pagefile.sys にアクセスできません: 許可がありません
ls: /mnt/c/swapfile.sys にアクセスできません: 許可がありません
合計 448
drwxrwxrwx 2 root root 0 4月 30 2015 $Recycle.Bin
-r-xr-xr-x 1 root root 0 5月 30 2015 $WINRE_BACKUP_PARTITION.MARKER
d--------- 2 root root 0 7月 26 2015 6289ac6b947c143bc82026
-r-xr-xr-x 1 root root 1 10月 30 2015 BOOTNXT
drwxrwxrwx 2 root root 0 5月 14 2015 Data
drwxrwxrwx 2 root root 0 5月 23 2015 EFI
drwxrwxrwx 2 root root 0 8月 20 2015 OneDriveTemp
d--------- 2 root root 0 7月 16 20:47 PerfLogs
dr-xr-xr-x 2 root root 0 8月 1 19:13 Program Files
dr-xr-xr-x 2 root root 0 8月 1 19:13 Program Files (x86)
drwxrwxrwx 2 root root 0 8月 29 11:56 ProgramData
dr-xr-xr-x 2 root root 0 8月 1 19:20 Recovery
d--------- 2 root root 0 5月 29 07:17 System Volume Information
dr-xr-xr-x 2 root root 0 8月 1 19:13 Users
dr-xr-xr-x 2 root root 0 8月 29 11:52 Windows
-r-xr-xr-x 1 root root 393718 4月 25 2015 bootmgr
-????????? ? ? ? ? ? pagefile.sys
-????????? ? ? ? ? ? swapfile.sys
※Windowsのドライブには/mnt/cでアクセスできる


$ id
uid=1000(knishika) gid=1000(knishika) groups=1000(knishika),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev)


$ df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 49050620 21150480 27900140 44% /
tmpfs 49050620 21150480 27900140 44% /run
none 49050620 21150480 27900140 44% /run/lock
none 49050620 21150480 27900140 44% /run/shm
none 49050620 21150480 27900140 44% /run/user

 sshを使って外部サーバーへの接続も問題なくでき、これなら長年愛用していたPuTTYも必要なくなりそうだ。

 いろいろ操作してLinuxとして特に違和感なく、しかも仮想PCと違って速いので、ならばと、「sudo apt-get update」(aptライブラリインデックスを更新)を動かしたところ、更新が始まり、「sudo apt upgrade」でインストール済のパッケージが最新版にアップデートされた。つまりUbuntuのパッケージ管理ソフトが使える上、バイナリ互換ということになる。

sudo apt-get update / aptライブラリインデックスを更新
sudo apt upgrade / インストールしているパッケージを最新版にアップデート

 とすれば、冒頭で書いた筆者が使うLAMP環境を構築できるだろうと、まず「sudo apt-get install apache2」でapacheをインストール、「sudo service apache2 start」でapacheを起動、Windows上のWebブラウザでURLにlocalhostを指定すると……Apacheの初期画面が表示された。

 「これは!」と、続いてMySQLとPHPをインストール(「sudo apt-get install mysql-server」と「sudo apt-get install php5 php-pear php5-mysql」)。PHPの作動確認は/var/www/htmlにindex.php(中は<?php phpinfo(); ?>)を作り、Apacheをリスタート。Webブラウザでlocalhost/index.phpにアクセスすると、MySQL対応のPHPが作動していることが確認できた。

 ここまで動けば最後の仕上げとして、phpMyAdminを「sudo apt-get install phpmyadmin」でインストール。Webブラウザでlocalhost/phpmyadminにアクセスすると、ログイン画面が表示された。ここにMySQLインストール時に設定したID/PWで管理画面へ入ることができた。

apache起動/バージョン2.4.7
MySQL起動/バージョン5.5.50
PHPも動いた/バージョン5.5.9
仕上げはphpMyAdmin

 つまり、WindowsにおけるBashは、GUIなしのUbuntuと何ら変わらないのだ。1つだけ注意したいのは、Bashを閉じるとこれらのプロセスも終了するため、恒久的なサーバー用途には向いておらず、プログラミング/デバッグ中など一時的な用途に限られる。この辺りの事情もあって、「Bash on Ubuntu on Windows」となったのだろう。

 量が多過ぎて全てのコマンドやパッケージは触れないが、少なくともLAMP環境は「Bash on Ubuntu on Windows」で作動することが確認できた。加えてaptによる管理ができるので、パッケージのアップデートなども容易。XAMPP以上で、OS Xに匹敵(?)する環境が、Windows 10だけで整うことになる。

 ここによると、優先順位が高いものとして、

1.A Bash environment for developers to run standard GNU command line tools such as grep, sed, awk
2.Provide access to the local hard drives through /mnt
3.Symlink support within the WSL environment
4.Linux user support
5.Provide the ability to run apt / apt-get for updates and package testing
6.Provide basic functionality for some languages:
NodeJS / npm
Python
Perl
Git
7.Command line editors / tools
vi
emacs
ssh

が上がっているので、開発において必要なものは概ね動くと思って良さそうだ。

 若干気になるのは、コンソール上の日本語表示が途中で切れたりすること。ただ、現状β版扱いなので、取り立てて騒ぐほどでもないだろう。

Windowsならではの使い勝手

 これで、例えばサイト構築であれば/var/www/html下へ必要なファイルを置けば動くことになるが(仮想ホスト機能も使える)、問題はそのファイルの転送方法だ。FTPサーバーやSMBサーバーをインストールしてWindowsから転送してもいいが、それではあまりにも芸がない。実は、このシステムならではのアクセス方法がある。

 実は、「Bash on Ubuntu on Windows」のファイルシステムの実態は、

C:¥Users¥[Username]¥AppData¥Local¥lxss¥rootfs

ここに配置されているのだ。また通常Linuxのファイルシステムは、所有者/所有グループ/その他とパーミッションを付けアクセス制限をしているが、Windowsからこのパスを使ってのアクセスはパーミッションを無視し、そのままオープンすることが可能だ(Windowsからはフルコントロールになっている)。

C:¥Users¥[Username]¥AppData¥Local¥lxss¥rootfsに/がある
C:¥Users¥[Username]¥AppData¥Local¥lxss¥rootfs¥var¥www¥htmlにindex.htmlとPHP作動確認用に作ったindex.phpがある
Windowsのデスクトップに/var/www/htmlへのショートカット、秀丸とVisual Studio Codeでindex.phpを編集

 従って、デスクトップ上に/var/www/htmlへのショートカットを置き、サクッとフォルダを開き、使い慣れた秀丸やVisual Studio Codeなどで編集可能。これはある意味、刺激的な開発環境と思われるがいかがだろうか。

 ただ、通常/homeにあるユーザーHomeと、/rootは、コンソールからアクセスすると、その通りなのだが、Windowsから先の方法でアクセスすると、実体は、¥lxss¥home、¥lxss¥rootとなって、一レベル上のフォルダに収められている(/mntも同様に¥lxss¥mnt)。おそらく仮想的に別パーティションとしているのだろう。

 上記したphpMyAdminまでインストールした状態でrootfs下の使用容量は約800MB。大して消費していない。またCPUとメモリの占有/使用率も何かが動かない限りBashを入れる前と変わらず。つまり、かなり軽い実装と言える。また仮想PCではないので、性能も素のWindowsと同レベル。実践的に使えそうだ。

 しかし、まさかMicrosoftがWindowsでUbuntuに対応するとは、スティーブ・バルマーCEOの頃には考えられなかったことだ。さすが開発者出身のナデラと言ったところ。デベロッパ向けのカンファレンスでも、来場者の多くがMacBookを持っていたが(見た目はともかくとして、多くは筆者と同じ理由“=開発環境に適している”だろう)、Bashの実装によって、今後徐々に減って行くかも知れない。

 以上のように、Windows 10 Anniversary Updateで搭載した「Bash」は、単にBashが作動するというレベルではなく、GUIなしのUbuntuがほぼそのまま動き、バイナリレベルで互換性が保たれるレベルにまで仕上がっている。

 WindowsにXAMPPや仮想PCへLinuxを入れ開発して来た開発者には、ちょうど中間的な存在となり、選択肢が増え嬉しい限り。筆者も既に一部実験的に使っているが、β版が取れる頃までに全面的にOS X+Windowsから乗り換えようかと考え中だ。と言うより既にOS Xに作った環境を引っ越すのが面倒なだけなのだが……。