Bash on Windows の仕組み

Basho on Windows (以下 BoW) の仕組み、及びファイル構成に関して説明します。BoWは(今までの Windows 上で動作する Linuxコマンドと異なり)、Linux Ubuntu バイナリがほぼそのまま動作する環境が提供されます。Windowsではバッチ、Powershell、WSH などの言語が存在しますが、Bash を使用する利点も多くあるため仕組みをしっかりと理解し活用しましょう。

スポンサード リンク

2016年9月

(本ページは調査中の内容です。誤りが含まれている可能性が高いです。)

1.仕組み

以下の図が仕組みの概要です。
(1)コマンドプロンプトから bash を実行すると bash ランチャーが起動されます。このファイル名は bash.exe でありWindowsのアプリです。Ubuntu の bash (バイナリ)ではありません。
bashランチャーは LX セッションマネージャーサービスと通信します。
(2)LX セッションマネージャーサービスは Ubuntu バイナリである init とサブシステムを経由して会話します。このサブシステムは Pico プロバイダドライバーと呼びます。
(3)Pico プロバイダドライバーサービスは 主に system call を処理します。Ubuntu のシステムコールはWindows NT のシステムコールに変換され実行されます。
(4)init はUbuntu のバイナリです。Ubuntu のバイナリがWindows 上で動作するのは不思議な感じがしますが、専用のサブシステムの上で実行することにより実現しています。
(5)bash はUbuntu のバイナリです。Ubuntu のバイナリがWindows 上で動作するのは不思議な感じがしますが、専用のサブシステムの上で実行することにより実現しています。

スポンサード リンク

2.プロセスとファイル

(1)bash と init
コマンドプロンプトから bashランチャーを起動すると様々なプログラムが実行されます。
コマンドプロンプトより確認してみます。bash 関連のプログラムが2個起動していることが分かります。
C:\ tasklist | findstr bash
bash.exe 1720 Console 1 1,340 K
bash 1552 Console 1 1,688 K
bash ランチャーは Windows のプログラムであり、C:\Windows\System32\bash.exe に存在します。
initで検索すると以下のプログラムが1個起動していることが分かります。
C:\ tasklist | findstr /c:"init "
init 7372 Console 1 572 K


(2)Ubuntu インスタンス
Ubuntu のファイルは以下の場所に保管されています。
C:\Users\<ユーザ名>\AppData\Local\lxss\rootfs
ubuntu ルートファイルシステム
存在するフォルダは以下の通りです。
acct,bin,boot,cache,data,dev,etc,home,init,lib,lib64,media,mnt,opt,proc,root,run,sbin,srv,sys,tmp,usr,var
bash は以下のフォルダに存在します。

C:\Users\<ユーザ名>\AppData\Local\lxss\rootfs\bin\bash

・このファイルをtype しても Windows バイナリの特徴である "MZ" という文字列は表示されません。Windowsバイナリではないためです。
・Ubuntu の展開ディレクトリである「C:\Users\<ユーザ名>\AppData\Local\lxss\rootfs」はユーザごとに展開されます。ユーザごとに、初めてbashをインストールしたとき、ユーザごとにアプリストアからダウンロードされます。これはユーザごとに環境を独立(パッケージのアップデート)可能なための考慮とおもわれます。
(3)Pico プロバイダドライバ
Pico プロバイダドライバは以下の場所に存在します。
C:\Windows\System32\drivers\lxss.sys
C:\Windows\System32\drivers\lxcore.sys

スポンサード リンク

[Bash on Windowsまとめに戻る]