Windows 10標準Linux環境WSLを始めよう

Windows 10 Fall Creators Updateから標準搭載されているWSLは、Windows 10からLinuxを利用するための仕組み。上手に活用することで、文書処理などを格段に効率よくできる。まず、インストールから始めてみよう。

WSLとは

Windows 10(Fall Creators Update、バージョン1709以降)で利用可能になった「Windows Subsystem for Linux」(以下WSLと略す)は、Windows 10からLinuxを利用するための仕組みだ。

Linuxは、ほぼ通常のディストリビューションが利用でき、各ディストリビューション用のパッケージシステムがそのまま利用できる。このWSLを使うことで、Windows 10のコマンドライン環境が「劇的」に強化される。

そもそもWindows 10のコマンドライン(cmd.exe)やコンソールコマンドは、MS-DOS(Microsoft Windowsの前に使われていたOS)に由来を持つ。特にMS-DOS 2.0は当時流行していたUNIXを参考にしている。Microsoftは、かつて、上位ユーザー向けにはUNIX(ブランド名としてはXENIX)、一般ユーザー向けにMS-DOSというラインアップを計画していたこともあり、MS-DOS 2.0に階層ディレクトリなどの機能を組み込んだ。

しかし、当時のMS-DOSは、仮想記憶もなければ実行保護もない16bitの8086/8088というCPU上で動作していたため、かなり簡略化されたコマンドしか使うことができなかった(当時の主力の外部記憶装置は320KBのフロッピーディスクや、数MBのHDDである)。このため、MS-DOSは、「UNIXもどき」などと言われたこともある。そして、その「もどき」以来、大きく機能が変わらないコマンドが大半を占める。

こうしたコマンドライン環境に対して、Microsoftが出した1つの解決策がPowerShellだ。PowerShellは豊富な機能を備えつつ、オブジェクト指向を採用するなど、UNIXなどから見るとかなり「とんがった」部分もあるものの、広く普及しているわけでもない。

これに対してWSLは、さまざまな参考書なども多いUNIX実行環境をほぼ引き継いでおり、現在では、「UNIX/Linux系」と呼ばれるほどになった。いまや、Linuxはソフトウェア開発やWebサーバなどのインターネットを支えるインフラの一部であり、さまざまな書籍やインターネットサイトなどから多くの情報を得ることができる。

WSLは、簡単にいえば、Windows OSとLinuxの「いいとこ取り」である。特に、コマンドラインでさまざまな作業をする人や、GUIよりもキーボードを打った方が早いといった人に、Linuxのパワーをもたらすものだ。

WSLの利点はその構造にあり

その理由はWSLの構造にある。従来、Windows OSでLinuxを使おうとすれば、仮想マシン環境として導入する必要があった。しかし、仮想マシン環境は動作のためのオーバーヘッドがあり、また起動にも時間がかかる。

CPUを仮想マシンモードという特別な状態に切り替え、Linux側はカーネルを含めOSをほぼそのまま動かしているからだ。また、形式的には仮想マシンは、別のPCと同じで、ネットワークなどを介さないとホストOS側のアプリケーションとはデータの交換ができない。

そのため、どちらかというと起動したらずっとLinuxの中で作業を行い続ける使い方に向いている。これに対してWSLはLinuxのプロセス起動のコストはWin32のそれとほとんど違わない。タスクマネージャーでは見ることはできないが、プロセスエクスプローラーなどを使うと、他のWin32のプロセスと同じように見える。仮想マシンとは違って、同じWindows OSの中のプロセスなので、コマンドをパイプでつなぐといった処理が可能な他、WSL内からWin32アプリケーションの起動もできる。

WSL自体の起動負荷がわずかで、起動時間も極めて短い。ユーザーから見ればWin32のアプリケーションを起動するのとほとんど変わらない。このためコマンドラインのパイプ処理で、Win32とLinuxのプログラムをつないで実行させてもローカルアプリケーションとの違いを感じない。単純に見ると、WSLにより、本格的なUNIX/LinuxのコマンドがそのままWindows 10のコマンドラインでも利用できるように見える。

WSLを利用するメリットとは

cmd.exeではなくLinuxのシェルであるbashなどでずっと作業を続けることもできる。WSL側からは、Windows OS側の全てのファイル(もちろんWindowsがアクセスを禁止しているものを除く)やフォルダにアクセスができる。このため、LinuxのコマンドでWindows 10側のファイルを処理したり、Linuxで処理した結果をExcelやWordで読み込んだりすることが可能だ。

例えば、Linuxには、テキストの重複行を削除してくれる「uniq」というコマンドがある。

また、sortにも同様の機能がある。Windows OSにもsort.exeはあるが、Linuxのsortコマンドに比べると機能が貧弱だ。sort.exeは、数値の入ったテキストの並べ替えでは数値順にすることができず、1の次に10が来てしまう(数値順ではなく文字コード順になる)。しかし、Linuxのsortでは、テキスト中の数値の大小で並べ替えができ、さらに重複行も削除できる。

sort.exeは、ソート時の比較の開始位置を文字で指定することしかできないが、Linuxのsortは、タブなどで区切られたテキストをフィールドと認識してそれを並べ替えキーとして使うことができる。機能的にはExcelの並べ替えと同等だ。

WSLを使うと、コマンドラインでこのようなコマンドが簡単に利用できるようになる。Webページでは、実行時間などを見せることはできないが、WSL側のコマンドを実行してもそこで待たされることがない。あたかも新しいコマンドが使えるように利用できる。

WSLには幾つか制限もある

例えば、Windows OS用にLinuxなどと同じsortなどのコマンドを移植して使うことはできるし、実際にフリーソフトウェアとしてそういうプログラムも流通している。しかし決定的に違うのは、WSLがいまやWindows 10の標準機能であり、Windows 10と同時にアップデートされていくものである点だ。

またオープンソースソフトウェアを移植したものとは異なり、WSL上で動作しているコマンドは、Windows OSに移植したプログラムではなく、普通のLinuxのプログラムである点だ。WSLは、Linuxの標準バイナリ形式をそのままWindowsのプロセスとして実行できる。このため、普通のLinuxディストリビューションにちょっと手を加えるだけで、WSLの中で動作させることができる。

ただしWSLは、Linuxそのものではないので、幾つかの制限もある。例えば、直接ハードウェアの上で動作していないため、ハードウェアを操作するようなアプリケーションは動作できない。また、コンテナなどの特殊なソフトウェアも動作しない。一番の違いは、カーネルがLinuxのカーネルそのままではなく、Microsoftが開発したソフトウェアモジュール(lxcore.sys)であり、これがカーネルの機能をWindowsカーネルの機能に変換して実行している点だ。

大部分のLinuxカーネル機能が動作するが、全ての機能が動作するわけではない。例えば、デバイスドライバを組み込むようなことはできない。また、Linux系には、システム管理やシステム状態を表示するようなツールがあるが、WSL内の情報しか得られないため、素のPCの上でLinuxを動かした場合のようにシステム全体を管理するというわけにもいかない。ただし、Win32の管理用ツールを起動することは可能だ。

もう一つ、Linuxのデーモンを起動する仕組みがない。Windows OSのサービスは、システムの起動時などに自動的に起動してさまざま処理をバックグラウンドで行う。これに似たのがデーモンだ。デーモンは、やはりLinuxの起動時に自動的に起動する仕組みがあるが、WSLでは、こうした仕組みが用意されない。

逆にデーモンの自動起動といった機能を省いているため、WSLはゼロから高速に起動できる。なおWSLは、バックグラウンドで起動された処理がある間は、完全に終了しないようになっているため、起動後に手動などでデーモンを動作させることは可能だ。起動時にデーモンを自動起動する仕組みが存在しないのみで、デーモンを動作させることは問題がない。

WSLは、例えばWebサーバなどを動作させてWebページをホストするようなことを想定したものではないため、WSLをHTTPサーバにするといった使い方は不可能ではないが、向いていない。

WSL内で動作するLinuxのプロセスは、Windows OSのプロセスと同じである。そのため、Windows OSでも負荷の高いプロセスを起動すると、システム全体が重くなってしまうのと同様、WSL内で過大な負荷のかかるプロセスを実行すれば、当然Windows OS自体にも負荷がかかる。このあたりは、CPUの実行時間などを制御できる仮想マシン環境とは違う点だ。

Linux入門でも、bash入門でもない

この連載では、主にWSLの使い方とWin32とWSLの連携について解説する。Linuxやbashに堪能でない人向けに基本的な解説は行うが、それが主目的ではないため、Linuxを全般的に説明するには至らない。また、一般的なコマンドライン(パスやオプション指定など)やOSに関する知識があることを前提にしている。

WSLでは、複数のLinuxディストリビューションを1台のPCに同時にインストールして使うことができるが、この記事では、Ubuntuというディストリビューションを前提にする。もちろん、他のWSL用ディストリビューションでもほとんど同じではあるが、設定やアプリケーションのインストール方法(パッケージマネージャー)に若干の違いがあり、例示した通りにはいかないことがある。

すでにLinuxには堪能で、日常的に使っている人は、自分の使っているディストリビューションに合わせて必要なコマンドを実行できると思われるが、逆にそうでない場合には、後述するように、指定された方法でインストールを行っていただきたい。

また、Windows 10に関しては、現行のWindowsバージョンを利用することを想定している。ご存じのようにWindows 10は、半年ごとに機能アップデートがあり、設定やコマンドなどに違いが出ることがある。

まずはWSLとディストリビューションをインストールしよう

WSLの具体的なインストール方法については、以下の記事を参照してほしい。

要点だけを以下、画面で紹介する。また、この連載で必要な設定などについてのみ、説明していく。

WSLのインストール(1)
[コントロールパネル]-[プログラムと機能]-[Windowsの機能]ダイアログを開き、[Windowsの機能の有効化または無効化]をクリックしてダイアログを開き、そこで「Windows Subsystem for Linux」にチェックを入れる。再起動が要求されるので、再起動を実行すること。

WSLのインストール(2)
Microsoft Storeを起動し、検索ボックスに「WSL」と入力して、検索結果から「Ubuntu」を選択する。

WSLのインストール(3)
Ubuntuのページで[入手]ボタンをクリックして、インストールを行う。

WSLのインストール(4)
Ubuntuを起動すると、コマンドプロンプトのようなウィンドウが表示される。インストールが行われるため、数分間待つ(PCの性能によっては十数分かかる)。

WSLのインストール(5)
ユーザー名とパスワードを入力する。Windows 10のユーザー名とパスワードと一致させる必要はない。

本連載のためのWSLインストールのポイント

ディストリビューションは「Ubuntu」を入れていただきたい。ただ、Microsoft Storeでは、「Ubuntu」「Ubuntu 18.04 LTS」「Ubuntu 16.04 LTS」の3種類が提供されている。「Ubuntu 18.04 LTS」と「Ubuntu 16.04 LTS」は、特定のLTSリリースでなければ動作しないアプリケーションを利用、検証することを想定したものだ。原則、ずっと同じリリースを使い続ける(そもそもLTSとはLong Term Supportという意味だ)場合のディストリビューションである。

こうした条件がなければ、リリース番号のついていないUbuntuを使った方がよい。もちろん、Ubuntu-18.04 LTSをインストールして、これを20.04などにアップデートすることも可能だが、WSLのディストリビューション名は後から変更できないので、[スタート]メニューの登録名も「Ubuntu-18.04 LTS」で起動コマンドも「Ubuntu-18.04.exe」のままになる。本連載では、「Ubuntu」をインストールすることを前提として解説していくので、「Ubuntu 18.04 LTS」「Ubuntu 16.04 LTS」をインストールしている場合はコマンドの例示などで適宜読み替えていただきたい。

ユーザー名とパスワードだが、原則、ルールの範囲で何を付けても構わないが、ユーザー名は32文字以下(6~8文字以下が入力しやすい)の小文字アルファベットおよび数字(先頭は数字にできない)、アンダーバーだけが使える。パスワードは6~8文字の範囲で入力がしやすいものにしておくと、操作がラクになる。

WSLでは、ログイン時にはユーザー名、パスワード入力の必要はないが、管理者権限を使う場合の「sudo」コマンドは、パスワードが要求される。このため、パスワードは打ちやすいものにした方が便利だ。また、ユーザー名はユーザーのホームディレクトリ名に使われるため、こちらも分かりやすく、長くないものにした方がよい。ログインに使うパスワードではないので、セキュリティに関してはそれほど気にする必要はなく定期的に変更する必要もない。

また、WSL用のUbuntuは、言語設定が日本語になっていないため、オンラインマニュアルなどが英語となる。このあたりについては次回解説する。

ただし、Ubuntuでは標準で文字コードにUTF-8が使われているため、Linuxコマンドの日本語入出力は問題なく行える。システムのメッセージやマニュアル(manコマンドの表示)などが日本語にならないという問題だけである。

WSLの起動と終了方法

まずは、起動と終了の方法を確認しておく。初回は、設定のためにWSLが自動起動するが、Windows 10を使っているときにWSLを起動する方法は以下の4つある。

bash.exeによるもの

wsl.exeによるもの

ディストリビューション名のexeファイルを使う(ubuntu.exe)

エクスプローラーの拡張右クリックメニューの「Linuxシェルをここで起動」

WSLでは、Linuxディストリビューションを複数インストールできる。そのため、複数ある場合には、ディストリビューションを指定して起動する。また、ディストリビューションのどれか1つがデフォルトとなり、ディストリビューションが未指定の場合にはこれを利用する。これは、「3.」以外の方法で有効だ。

「1.」~「3.」に関しては、オプションによりWSL側で実行するコマンドを指定できる。また、Windows OS側のコマンドとパイプ「|」で接続して標準入出力をつなぐことも可能だ。動作は似ているが、それぞれのコマンドラインオプションには大きな違いがある。

bash.exeのオプションは、直接WSL側のbashに渡り、全てbash(Linuxでは実行プログラムを区別するため/bin/bashと表記する)のオプションを指定する。このため、起動するディストリビューションは、デフォルトのものに限定される。これに対して、wsl.exeは、独自のコマンドラインオプションを持ち、起動するディストリビューションやログインユーザー名などの指定が可能になっている。ディストリビューション名の指定方法は、「wslconfig.exe /l」で表示されるディストリビューション名を使って、「wsl.exe -d <ディストリビューション名>」とする。

wsl.exeでは、起動するWSL側のコマンドは、「-e」または「--exec」で指定する。なお、この2つのオプション指定は同じ意味で、ハイフンが1つの方が、UNIXからの伝統的な指定方法(ショートオプションという)で、ハイフン2つで始まるのが「(GNU)ロングオプション」だ。

UNIXのコマンドは、もともとはショートオプションしか持っていなかった。しかし、機能が増え、同じ文字の大文字小文字を使う必要が出て、分かりにくくなったため、ロングオプション形式が作られた。ロングオプションは、動作を意味する英単語の組み合わせなので、衝突する可能性はなく、間違いにくいのだが、キー入力が長くなるという欠点を持つ。伝統的なコマンドでは、ショートオプションが残され、新しいコマンドでも、一部の利用頻度が高そうなオプションはショートオプションが定義されている。

WSL関係のWindowsのコマンドは、wslconfig.exe以外は、Linux/UNIXに従うオプション指定を使う。つまり、オプション指定は、ショートオプションまたはロングオプションで行う。

このとき、コマンドの簡単な使い方は「--help」(ショート形式としては-hが多い)で表示させることが可能だ。WSL内では、「man」コマンドで詳細な情報を得ることができる。なお、wsl.exeについては、2019年3月に配布予定のバージョン1903で強化が予定されており、wslconfig.exeの機能を含むようになる。また、ubuntu.exeは、古いUNIXコマンド(tarなど)と同じく、最初のオプションにオプション指定文字を使わず、サブコマンド名を指定する。「ubuntu.exe」などのディストリビューション名のコマンドは、複数インストールされたディストリビューションのうち特定のものだけを起動するコマンドである。

最後のエクスプローラーの拡張メニューは、Windows 10 October 2018 Update(バージョン1809)からの機能で、[Shift]キーを押しながら、右クリックメニューを開いて実行する。エクスプローラーで開いているフォルダをカレントディレクトリとしてデフォルト設定されたディストリビューションが起動する。この場合、ディストリビューションも、実行コマンドも指定できない。しかし、エクスプローラーで開くことができるフォルダならどこでもそこをカレントディレクトリにできる。

起動しているWSLを取りあえず終了させるには、コンソールウィンドウを[閉じる]ボタンで終了させるか、exitコマンドを実行する。ただし、WSLでバックグラウンドタスクが動作しているとWSLのプロセスが残ることがある。1つのWindowsのセッション内で複数回、WSLを起動するのであれば、通常は問題ないが、バックグラウンドで実行したLinuxプログラムから何か結果を得るような場合には、その前にWindows 10をサインアウトしてしまわないように注意すること。

今回は、WSLの概要とその導入方法などについて説明した。次回はコマンドラインのヒストリや編集機能、日本語manなどについて見ていこう。