Windows上のBashシェル入門【Windows 10 Creators Update対応】
Bash on Ubuntu on Windowsの、Creators Updateでの強化点&新機能
正式リリースされたWindows 10 Creators Updateで、Bash on Windowsはどう進化するのか? その強化点と新機能を紹介する。
2016年8月にリリースされたWindows 10 Anniversary Update(ビルド14393)に続く、大型アップデートのWindows 10 Creators Updateのリリースが2017年春ごろとうわさされている。Anniversary Update登場以降、Windows 10の新機能をいち早く試せるInsider Previewで小規模なリリースは継続されてきており、Bash on Ubuntu on Windows(以下BoW)も同様に機能強化が行われてきている。本稿では、Anniversary Update以降で追加され、Creators Update正式リリース版で使用可能となった新機能を紹介する。
Creators Updateでの、Bash on Ubuntu on Windows強化点
Bash on Ubuntu on WindowsとWindows Subsystem for Linux
最近、マイクロソフトのブログなどを読むと、Bash on Ubuntu on Windowsという呼び方に加え、LinuxとWindowsの相互運用の仕組みであるWindows Subsystem for Linux(以下WSL)での記述を多く見かける。後述するが、Windows上でLinuxを実行させるだけではなく、SQL Server for Linuxのように、Linux上でWindowsのアプリケーション(現在はSQL Serverのみ)を最小の変更で実行するための仕組みになっているためだ。
つまり、BoWとWSLの両方の表記が可能であるわけだが、本稿では特別な事情がない限り、BoWという表記で統一する。
Ubuntu 16.04(コードネーム:Xenial Xerus)への更新
BoWで使用されるUbuntuが、14.04 LTS(“Trusty Tahr”)から16.04 LTS(“Xenial Xerus”)に変更された。Ubuntu自体の変更点は、下記のリンク先のUbuntuのリリースノートを見てほしい。BoW自身には大きな影響はないが、14.04でプライベートパッケージの参照先を設定していた場合は注意が必要だ。
また、Anniversary UpdateからCreators Updateへ更新する際、一度、BoWをアンインストールする必要がある。BoWのホームディレクトリにあるファイルも消えるため、必ずバックアップを取っておいてほしい。なお、BoWをアンインストールしても、Windowsのユーザーフォルダー(C:\Users
配下)のファイルが削除されることはない。
【ヒント】BoWの再インストール方法
BoW環境をアンインストールしてから再構築したい場合は、PowerShellもしくはコマンドプロンプトで下記のコマンドを順に実行するとよい。
- (1)BoWをアンインストール:
lxrun /uninstall /full
- (2)BoWを再インストール:
lxrun /install
ターミナルの強化
改善されたターミナルの日本語表示問題
Anniversary UpdateのBoWのターミナル(コンソール、厳密には「Bash on Ubuntu on Windows」というデスクトップアプリ)では、日本語フォルダーやファイル名が切れてしまい、正しく表示されないという現象が発生していたが、Creators Updateでは問題ないレベルで表示されるようになった(図1)。ただし、これはターミナルの機能改善であって、ターミナル以外のBoW上のアプリケーションがアルファベット以外(日本語を含む)のファイル名に対応しているかどうかは、引き続き、BoWにインストールされるアプリケーションに依存するので注意してほしい。
上の画面では「カスタム テ」のように途切れたりしている。※両者で一部のフォルダー名やファイル名が異なっているが、スクリーンキャプチャした時期が違っており、実際にフォルダーとファイルの構成が違うからである。
また、BoWのターミナルが24bitカラーに対応したため、図2のようにターミナルに好きな色を使えるようになった。ディレクトリやユーザー名などに好きな色を指定して好みの配色にしてみてほしい。
色の指定方法は、通常のBashシェルと同じである。BoWの機能というわけではないので説明を割愛する。下記の参考資料を参考にしてほしい。
Windowsアプリケーションとの相互運用
Anniversary Updateではできなかった、BoWのターミナルからのWindowsアプリケーションの起動が可能になった。さらにBoWインストール時に既定で図3のように、Windowsの現在のログオンユーザーに設定されている環境変数PATH
の値がBoWターミナルの環境変数PATH
にも追加されるため、フルパスを指定することなく、Windowsアプリケーションの起動が可能だ。
ただし、BoWから起動したWindowsアプリケーションの作業フォルダーを、BoWのフォルダーに指定することはできない。例えば、Windowsのコマンドプロンプトからcode .
と入力すると、現在のフォルダーを作業フォルダーにして、Visual Studio Codeが起動する(※もちろんインストールしていた場合)。同様に、Bashシェルからcode .
と実行した場合には、BoW側の作業フォルダーは使用できないため、図4のようにWindows側のC:\WINDOWS\System32
フォルダーが作業フォルダーに設定される。
このような仕様になっているのは、BoWで管理されているフォルダーがWindowsアプリケーションから操作されることを想定していないためだ。BoWのTeam Blogでも“DO NOT create / modify Linux files from Windows apps, tools, scripts or consoles”と厳しい口調で禁止している。
仮に、エクスプローラーなどで/home
のユーザーフォルダー配下に何かファイルを作成したとしても、BoWからは認識されず、ls
コマンドなどで表示されない。
「grep
/awk
/sed
などLinuxのコマンドと同じ仕様のものを、Windowsでも使いたい」という要望は昔から多くあった。今回の機能強化で、パイプ(パイプライン、<標準出力するコマンド> | <出力結果を処理するコマンド>
)を使って、Windows上のアプリケーションからの標準出力をBoW上のアプリケーションに渡せるようになった。例えば、コマンドプロンプトに以下のコマンドラインを入力すれば、図5のようにWindowsのdir
コマンドの標準出力の結果を、bash
シェルのgrep
コマンドで処理できる。
dir /s | bash -c "grep 検索文字列"
もちろんPowerShellの標準出力も、図6のようにパイプを使ってBoWで処理できる。
パイプを使うことで、Linuxのコマンドに慣れた技術者でもWindowsの標準出力を慣れたツールで処理できるようになるだろう。
Linuxのsyscallのサポート強化
syscallの最新サポート状況
Insider PreviewのバージョンアップとともにLinuxのsyscall(システムコール:WindowsでいうAPIのようなもの)のサポートが徐々に強化されており、動作するアプリケーションも増えてきた(※細かな情報になるが、具体的にどのようなsyscallがサポートされているかは、BoWのリリースノートに記載されている。また、使用しているsyscallのテストが成功もしくは失敗しているかという一覧は、GitHubで公開されている。いずれも下記のリンク先を参照してほしい)。
サポート対象のsyscallの増加により、Haskellも動作可能になった。詳しくは下記のリンク先を参照してほしい。
あるアプリケーションが今日動かなかったとしても、Haskellのように、新しいInsider Previewでは動作可能になっているかもしれないので、最新のサポート状況を知りたい人は、下記リンク先のリリースノートやBoW公式ブログでチェックしてほしい。
Linuxファイルシステム変更通知のサポート
筆者自身の経験でも、Linuxに慣れた人から「ログの更新状況をターミナルで逐次見たいのだが、Windowsにはtail
コマンドがないのか?」と聞かれることがしばしばあった。PowerShellのGet-Content
コマンドレットの-tail
オプションでもtail
コマンドと同様の結果にはなるが、PowerShellの場合、「ファイルを一度メモリに読み込んでから末尾の行を返却する」という実装のため、大きいファイルを参照する場合、パフォーマンス上で不利になる。
しかし、BoWで変更通知機能が新たにサポートされたことにより、Bashシェルのtail
コマンドでのファイル変更監視が可能になった。Creators Updateでは図7のように、tail
コマンドでファイルの更新内容をターミナルに逐次出力できる。
ネットワーク接続のエミュレーション
Anniversary Updateでは、ネットワーク関連機能が提供されていなかったこともあり、ifconfig
をはじめとするネットワーク系のコマンドが使用できなかった。Creators Updateでは、Windowsのネットワーク設定をBoWと共有するようになった。もちろん、図8のように、ifconfig
コマンドや、ネットワークデバイスの状態確認ができる/proc/net/dev
疑似ファイルの他、新しいネットワークコマンドであるip
コマンドも実行可能だ。
SQL Server for LinuxにおけるWindows Subsystem for Linux
SQL Server for Linux
BoWの公開はかなり大きな驚きをもってニュースで伝えられたが、「Linux版SQL Serverを提供する」という話も筆者は同じくらい驚いた。SQL Serverといえば、Windowsに極めて強く依存しているソフトウェアであり、他のプラットフォームへの移植はほぼ不可能だろうと考えていたからだ。
しかし、その不可能を「WSLが可能にしてしまった」といっても過言ではない。「LinuxにWindows Subsystemを搭載することで、Linuxへの移行コストが大幅に低減できた」と、その内容を詳しく説明する記事がSQL Server公式ブログ(英語)で公開されている。以下ではその内容をかいつまんで紹介していこう。
SQL Serverを他のプラットフォームに移植する際に問題となっていたのは、SQL ServerがWindows OSの多くのライブラリに依存していたことだ。その依存関係は以下のように大きく3つのカテゴリに分類できるが、これらの間でもさらに複雑に依存している。
- Win32:
user32.dll
ファイルなど - NT Kernel:
ntdll.dll
ファイルなど - Windowsアプリケーション固有のライブラリ: MSXMLなど
これらを一からLinuxに移行することは、コストの面からも現実的ではない。そこで、SQL ServerをLinuxで動作させるためのPAL(Platform Abstraction Layer)であるSQLPALが用意されることになった。
とはいっても実はそのPALには前身がある。そもそも、SQL Server 2005以降、図9のような仕組みでSOS(もしくはSQLOS、SQL Operating System)という、SQL Server内でメモリやI/Oを管理するためのOSのような機能を用意していたのだ。
「SQL Server on Linux: How? Introduction」から引用(※本稿用に制作しなおして加工している)。
SQL Server for Linuxでは、このSOSを一段進化させ、SQLPALという仕組みに組み替えて、以下の図10のような構成に変更した。
「SQL Server on Linux: How? Introduction」から引用(※本稿用に制作しなおして加工している)。
BoWの動作の仕組みと同様にWindows固有のAPIは、SQLPALを通じてLinuxのシステムコール(syscall)にリアルタイムに変換、もしくは同梱されるWindowsのライブラリで実行されることになる。ちなみに、同梱されるWindowsのライブラリ(図10のHosted Windows APIs)は、現時点で81MB(非圧縮状態)と極めて小さくなっている。
SQL Server for Linuxは、SQL Serverの次期(vNext)メジャーリリース(2017年半ばが目標)で提供される予定となっている。現在、CTP 1.3がDockerイメージで提供されているため、試用も容易だ。ぜひ試してみてほしい。下記のリンク先に詳しい使い方の情報がある。
まとめ
BoWは、コミュニティのフィードバックを得ながら着実に進んでおり、Linuxのための仮想環境を用意する必要がだんだんなくなってきている。Creators Update後もInsider Previewがリリースされており、今後も互換性の向上や機能強化は行われるだろう。
さらに、「WindowsでLinuxのバイナリを動かす」ためと思われていたWSLだが、逆に「LinuxでWindowsのバイナリを実行する」という可能性も新たに見えてきた。今後、WSLを使用して、マイクロソフト製ソフトウェアをLinux向けにリリースしていくかどうかは不明だが、まずはその最初の製品となるSQL Server for Linuxがどのくらい広く使用されるかに注目したい。
1. Windows Subsystem for Linuxとは? そのインストールと使い方
Fall Creators Updateで正式版として提供されることになった「Windows 10上で動作するLinuxサブシステム」によるBashシェルの基礎を理解・マスターすることをゴールとして、Windows Subsystem for Linux(WSL、旧称:Bash on Ubuntu on Windows)の概要から、インストール方法までを解説。また、よくある疑問をQ&A形式で短くまとめる。
2. Windows Subsystem for Linuxを使って「開発」をしてみよう
WindowsとWSL(Windows Subsystem for Linux)の間でファイルシステムを上手に相互運用するためのヒントや、WSLを活用してクロスプラットフォームな開発を行う方法を説明する。