Windows上のBashシェル入門【Windows 10 Creators Updateリリース直前】

Windows上のBashシェル入門【Windows 10 Creators Updateリリース直前】

Bash on Ubuntu on Windowsの、Creators Updateでの強化点&新機能【Insiders Preview版】

2017年3月7日

あと1~2カ月でリリースされると見られるWindows 10 Creators Updateで、Bash on Windowsはどう進化するのか? 最新Insider Previewの内容で強化点と新機能をいち早く知っておこう。

亀川 和史
  • このエントリーをはてなブックマークに追加

 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にインストールされるアプリケーションに依存するので注意してほしい。

図1 改善されたターミナル上の日本語表示問題(上:Anniversary UpdateのBoW、下:Creators UpdateのBoW)

上の画面では「カスタム テ」のように途切れたりしている。両者で一部のフォルダー名やファイル名が異なっているが、スクリーンキャプチャした時期が違っており、実際にフォルダーとファイルの構成が違うからである。

 また、BoWのターミナルが24bitカラーに対応したため、図2のようにターミナルに好きな色を使えるようになった。ディレクトリやユーザー名などに好きな色を指定して好みの配色にしてみてほしい。

図2 ターミナルに24bitカラーを表示するテスト

 色の指定方法は、通常のBashシェルと同じである。BoWの機能というわけではないので説明を割愛する。下記の参考資料を参考にしてほしい。

Windowsアプリケーションとの相互運用

 Anniversary Updateではできなかった、BoWのターミナルからのWindowsアプリケーションの起動が可能になった。さらにBoWインストール時に既定で図3のように、Windowsの現在のログオンユーザーに設定されている環境変数PATHの値がBoWターミナルの環境変数PATHにも追加されるため、フルパスを指定することなく、Windowsアプリケーションの起動が可能だ。

図3 環境変数PATHの値がBoW側にも登録される
図3 環境変数PATHの値がBoW側にも登録される

 ただし、BoWから起動したWindowsアプリケーションの作業フォルダーを、BoWのフォルダーに指定することはできない。例えば、Windowsのコマンドプロンプトからcode .と入力すると、現在のフォルダーを作業フォルダーにして、Visual Studio Codeが起動する(もちろんインストールしていた場合)。同様に、Bashシェルからcode .と実行した場合には、BoW側の作業フォルダーは使用できないため、図4のようにWindows側のC:\WINDOWS\System32フォルダーが作業フォルダーに設定される。

図4 BashシェルでWindowsアプリケーションの作業フォルダーを現在のフォルダーにした結果

 このような仕様になっているのは、BoWで管理されているフォルダーがWindowsアプリケーションから操作されることを想定していないためだ。BoWのTeam Blogでも“DO NOT create / modify Linux files from Windows apps, tools, scripts or consoles”と厳しい口調で禁止している。

 仮に、エクスプローラーなどで/homeのユーザーフォルダー配下に何かファイルを作成したとしても、BoWからは認識されず、lsコマンドなどで表示されない。

 「grepawksedなどLinuxのコマンドと同じ仕様のものを、Windowsでも使いたい」という要望は昔から多くあった。今回の機能強化で、パイプ(パイプライン、<標準出力するコマンド> | <出力結果を処理するコマンド>)を使って、Windows上のアプリケーションからの標準出力をBoW上のアプリケーションに渡せるようになった。例えば、コマンドプロンプトに以下のコマンドラインを入力すれば、図5のようにWindowsのdirコマンドの標準出力の結果を、bashシェルのgrepコマンドで処理できる。

  dir /s | bash -c "grep 検索文字列"

図5 Windowsのdirコマンドの出力結果をBoWのパイプで処理する(コマンドプロンプトの場合)

 もちろんPowerShellの標準出力も、図6のようにパイプを使ってBoWで処理できる。

図6 Windowsのdirコマンドの出力結果をBoWのパイプで処理する(PowerShellの場合)

 パイプを使うことで、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コマンドでファイルの更新内容をターミナルに逐次出力できる。

図7 Creators Updateのtailコマンドでhello.txtの変更内容を逐次表示する

ネットワーク接続のエミュレーション

 Anniversary Updateでは、ネットワーク関連機能が提供されていなかったこともあり、ifconfigをはじめとするネットワーク系のコマンドが使用できなかった。Creators Updateでは、Windowsのネットワーク設定をBoWと共有するようになった。もちろん、図8のように、ifconfigコマンドや、ネットワークデバイスの状態確認ができる/proc/net/dev疑似ファイルの他、新しいネットワークコマンドであるipコマンドも実行可能だ。

図8 ネットワーク系コマンドの実行例(ifconfigコマンド)
図8 ネットワーク系コマンドの実行例(ipコマンド)
図8 ネットワーク系コマンドの実行例(/proc/net/dev疑似ファイル)
図8 ネットワーク系コマンドの実行例(上:ifconfigコマンド、中:ipコマンド、下:/proc/net/dev疑似ファイル)

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で動作させるためのPALPlatform Abstraction Layer)であるSQLPALが用意されることになった。

 とはいっても実はそのPALには前身がある。そもそも、SQL Server 2005以降、図9のような仕組みでSOS(もしくはSQLOS、SQL Operating System)という、SQL Server内でメモリやI/Oを管理するためのOSのような機能を用意していたのだ。

図9 SOS(SQLOS)の構成

SQL Server on Linux: How? Introduction」から引用(本稿用に制作しなおして加工している)。

 SQL Server for Linuxでは、このSOSを一段進化させ、SQLPALという仕組みに組み替えて、以下の図10のような構成に変更した。

図10 SQLPALの構成

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はまだ正式版がリリースされていないが、そのリリース後も互換性の向上や機能強化は行われるだろう。

 さらに、「WindowsでLinuxのバイナリを動かす」ためと思われていたWSLだが、逆に「LinuxでWindowsのバイナリを実行する」という可能性も新たに見えてきた。今後、WSLを使用して、マイクロソフト製ソフトウェアをLinux向けにリリースしていくかどうかは不明だが、まずはその最初の製品となるSQL Server for Linuxがどのくらい広く使用されるかに注目したい。

1. Bash on Ubuntu on Windowsとは? そのインストールと使い方

Windows 10上で動作するBashシェルの基礎を理解・マスターすることをゴールとして、Bash on Windowsの概要から、インストール、開発での活用方法までを解説。また、よくある疑問をQ&A形式で短くまとめる。

2. 【現在、表示中】≫ Bash on Ubuntu on Windowsの、Creators Updateでの強化点&新機能【Insiders Preview版】

あと1~2カ月でリリースされると見られるWindows 10 Creators Updateで、Bash on Windowsはどう進化するのか? 最新Insider Previewの内容で強化点と新機能をいち早く知っておこう。

イベント情報(メディアスポンサーです)

Azure Central の記事内容の紹介

GrapeCity Garage 記事内容の紹介

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • グレープシティ株式会社
  • 日本マイクロソフト株式会社