Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
Windows上のBashシェル入門【Windows 10 Creators Update対応】

Windows上のBashシェル入門【Windows 10 Creators Update対応】

Bash on Ubuntu on Windowsの、Creators Updateでの強化点&新機能

2017年3月7日 (2017/05/09 更新)

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

図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後もInsider Previewがリリースされており、今後も互換性の向上や機能強化は行われるだろう。

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

Windows上のBashシェル入門【Windows 10 Creators Update対応】
1. Windows Subsystem for Linuxとは? そのインストールと使い方

Fall Creators Updateで正式版として提供されることになった「Windows 10上で動作するLinuxサブシステム」によるBashシェルの基礎を理解・マスターすることをゴールとして、Windows Subsystem for Linux(WSL、旧称:Bash on Ubuntu on Windows)の概要から、インストール方法までを解説。また、よくある疑問をQ&A形式で短くまとめる。

Windows上のBashシェル入門【Windows 10 Creators Update対応】
2. Windows Subsystem for Linuxを使って「開発」をしてみよう

WindowsとWSL(Windows Subsystem for Linux)の間でファイルシステムを上手に相互運用するためのヒントや、WSLを活用してクロスプラットフォームな開発を行う方法を説明する。

Windows上のBashシェル入門【Windows 10 Creators Update対応】
3. 【現在、表示中】≫ Bash on Ubuntu on Windowsの、Creators Updateでの強化点&新機能

正式リリースされたWindows 10 Creators Updateで、Bash on Windowsはどう進化するのか? その強化点と新機能を紹介する。

サイトからのお知らせ

Twitterでつぶやこう!