Windows10のbash
だんなです。日本時間8月3日にマイクロソフトはWindows10 Anniversary Update (バージョン1607)を提供しました。昨年10月の大規模更新の2回目に当たります。
さっそく1607に更新しました。見た目はほとんど変わった印象はありません。追加された機能もあるようですがそれらを紹介する記事は多いと思いますので割愛します。
このバージョンからLinuxの1つであるUbuntuがWindows上で利用できるようになりました。 この記事ではUbuntuのbashを利用するための手順を紹介します。
開発者モード
bashを利用するためにはまずWindowsを開発者モードにします。
画面左隅にあるWindowsロゴを左クリックして表示されるスタートメニューにある歯車のアイコン「設定」をクリックします。
表示されたメニューの「更新とセキュリティ」をクリックします。
左側にある「開発者向け」をクリックします。
表示されたメニューで、標準では「サイドロードアプリ」が選択されています。これを「開発者モード」に変更します。すると開発者向けパッケージのインストールが始まります。 終了すると「PCを再起動するまで、一部の機能は動作しない可能性があります。」と表示されるので、再起動をします。
Ubuntuのインストール
次にUbuntuをインストールします。
画面左隅のWindowsロゴを右クリックして表示されたメニューの中から「コントロールパネル」をクリックします。
表示されたメニューの「プログラム」をクリックします。
表示されたメニューの「Windowsの機能の有効化または無効化」をクリックします。
表示されたメニューをスクロールして「Windows Subsystem for Linux (Beta)」にチェックを付けて「OK」します。 すると必要なパッケージがインストールされて、終了すると「今すぐ再起動」を促す画面が表示されるので再起動をします。
bashの起動
再起動されたら画面左隅のWindowsロゴを右クリックして「ファイル名を指定して実行」をクリックして“bash”と入力して実行します。
背景が黒いコマンドプロンプトの画面が表示されます。初回だけ、Ubuntuの利用規約を確認するように促され、同意する場合は“y”とEnterを入力します。 するとWindowsストアからUbuntuがダウンロードされてインストールされます。この作業には少々時間がかかります。
インストールが終了するとUbuntuを利用するためのログインアカウントの作成を求められます。 ユーザー名とパスワード、パスワードの再確認を入力するとすべて作業は終了して、bashのプロンプトが表示されます。日本語のメッセージが途中で切れちゃってるみたいですね(笑)。
Linuxではおなじみのlsコマンドなども普通に利用できます。 また、/mnt/cにはWindowsのCドライブがマウントされているのでbashからWindowsのファイルに簡単にアクセスできます。 Linuxに慣れている人にはとても便利な機能です。
標準ではUbuntuのcoreutilsだけがインストールされているのでその他のコマンドを利用したい場合は、別途インストールが必要です。 sudo apt-get install などを利用するとよいでしょう。
SSH
開発者モードに設定をするとSSHサーバーが標準で動作するようになっています。 外部からSSHを通じてログインできる状態になっていますから、不都合を感じる場合は、コントロールパネルの「システム」→「管理ツール」→「サービス」にて起動されているサービスを確認してSSHを停止しましょう。 またWindowsファイアウォールでもSSHサービスに対してアクセス許可が行われていますので併せて禁止にするとよいでしょう。
どうやって動いてるの?
Windows Subsystem for Linux (WSL)は、Windows上でUbuntuそのものが動作しているわけではありません。 あくまでLinux用の実行プログラムがWindows上で動作できるようにエミュレーションをしています。 その1つのプログラムがbashなのです。
WSLを導入するとLinuxアプリが実行するシステムコールをトラップして、WindowsカーネルでLinuxカーネルのエミュレーションを行います。 エミュレーションでは、あたかもLinuxカーネルが動作しているかのごとく振る舞うのでシステムコールを呼び出したbashなどのプログラムでは自分がLinuxで動作していると思い込んでいるわけです。 従ってVMwareなどの仮想マシンとは根本的に異なります。
Ubuntuの更新
WSLはWindows Updateで更新されるが、Ubuntuはどうするのだろうと思っていた。どうもスタートアップなどの際に更新を適用しているみたい。 apt-get dist-upgradeか何かを実行しているように思える。