Bash on Ubuntu on Windowsを試してみる

Windows 10 Insider Preview Build 14316でBash on Ubuntu on Windows (Beta)を試すことができるようになってます。

Windows 10 Insider Previewは不安定なのでWindowsの再インストールが必要になる場合があります。

普段使うマシンでは実行しないでください。

 

1 Windows 10 Insider Preview Build 14316の入手

WindowsのホームページでWindows Insider Programに参加します。

Windowsのアカウントでサインインした後、Windows Insider Programへ参加します。

後ほど、メールが送信されてきます。

 

Insider Previewビルドの入手で開始するを選択します。

Windowsアカウントでログインします。

開始するを選択するとWindows 10が再起動されます。

設定 -> 更新とセキュリティ-> Windows Update -> 詳細オプション

0002_WindowsInsiderProgram.png

すぐさまダウンロードできる訳ではないようです。私は半日後に以下のようになりました。

0003_Download-InsiderPreview14316.png

ダウンロード後に再起動するとアップデートが適用されます。

0004_Apply-InsiderPreview14316.png

2 Windows Subsystem for Linux (Beta)を有効にする

Windows Subsystem for Linux (Beta)を使えるようにする為に、開発者モードを有効にします。

0001_Enable-DeveloperMode.png

Windowsスタートボタンを右クリックをクリックして、コントロールパネルを起動します。

プログラム、Windowsの機能の有効化または無効化からWindowsの機能ダイアログを起動します。

0005_Enable-WindowsSubsystemForLinux.png

3 Bash on Ubuntu on Windowsの起動

cmd.exeからbashとタイプします。

Ubuntu on Windowsをインストールするかと尋ねられるのでyとタイプします。

Microsoft Windows [Version 10.0.14316]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Users\hiroom2>bash
-- Beta feature --
This will install Ubuntu on Windows, distributed by Canonical
and licensed under its terms available here:
https://aka.ms/uowterms

Type "y" to continue: y
Downloading from the Windows Store... 100%
Extracting filesystem, this will take a few minutes...
??????????????????????????...
root@localhost:/mnt/c/Users/hiroom2#

2回目以降はBash on Ubuntu on Windowsプログラムからも起動できます。

0006_Run-UbuntuOnWindows.png

4 特徴

いくつか分かった特徴を記載します。

4.1 Cドライブは/mnt/c

cygwinのcygdriveと似てますね。

# ls /mnt/c/
ls: cannot access /mnt/c/Documents and Settings: Input/output error
ls: cannot access /mnt/c/pagefile.sys: Permission denied
ls: cannot access /mnt/c/swapfile.sys: Permission denied
777fa58238d5be4dd24ee1b7ac0530d4  Data                    PerfLogs
swapfile.sys               $WINDOWS.~BT
7e0ee13458c086d905f1b757d2549b    Documents and Settings  ProgramData
$SysReset                  Windows.old
990a498c7b5935f8bc09              Logs                    Program
Files        System Volume Information  $Windows.~WS
...

これはマウントとは別扱いのようです。

root@localhost:/mnt/c/Users/hiroom2# mount
rootfs on / type rootfs (ro,relatime)
tmpfs on /dev type tmpfs (rw,seclabel,nosuid,relatime,mode=755)
devpts on /dev/pts type devpts (rw,seclabel,relatime,mode=600)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,seclabel,relatime)

dfは現状動かないようです(/etc/mtabがない)。

root@localhost:/mnt/c/Users/hiroom2# df -h
df: cannot read table of mounted file systems: No such file or directory

4.2 pstreeの結果

プロセスは全然起動してないです。このinitはbashを呼び出してるだけなのでしょうか。

カーネル起動パラメータにinit=/bin/bashを渡した場合と似てます。

root@localhost:/mnt/c/Users/hiroom2# pstree
init───bash───pstree
root@localhost:/mnt/c/Users/hiroom2# cat /proc/cmdline
BOOT_IMAGE=/kernel ro

Bash on Ubuntu on WindowsからWindowsのプロセスは見えないようです。

WindowsのタスクマネージャからはBash on Ubuntu on Windowsのプロセスは見えないようです。

4.3 作成したファイルのpermission

NTFS特徴というか、rootで0777がデフォルトのようです。

root@localhost:/mnt/c/Users/hiroom2/Documents/workspace# echo hello > hello.txt
root@localhost:/mnt/c/Users/hiroom2/Documents/workspace# ls -lh hello.txt
-rwxrwxrwx 1 root root 6 Apr 11 16:03 hello.txt

4.4 性能

フィボナッチ数列を愚直に再帰的に求めるpythonコードを同じスペックの仮想マシン環境で測定してみました。

#!/usr/bin/env python

def fib(n):
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)

if __name__ == '__main__':
    print('fib(36) = %d' % fib(36))

以下はUbuntu 14.04上の結果です。

hiroom2@ubuntu-14:~/src/py$ time python fib.py
fib(36) = 14930352

real    0m4.437s
user    0m4.398s
sys     0m0.026s

以下はUbuntu on Windows上の結果です。

root@localhost:/mnt/c/Users/hiroom2/Documents/workspace# time python fib.py
fib(36) = 14930352

real    0m4.437s
user    0m4.406s
sys     0m0.031s

CPUとメモリのみの処理だと、性能はほぼ変わらないようです。

これはC言語で作成したバイナリでも同様でした。

5 まとめ

開発者が言うにはBetaというよりAlpha的なレベルだそうです。

/procや/devの対応はこれからで、簡単なコマンドが動くという感じです。

GitHubにてバグ報告ができるようになっています。