Ubuntu on Windowsの概要とアーキテクチャー
「BASH Running in Ubuntu on Windows」に「Ubuntu on Windows」の概要とアーキテクチャーが紹介されています。Ubuntu on Windowsのまとめ
長いので先にまとめます。- Ubuntu on WindowsはCanonicalによって提供される
- Windows Subsystem for Linux (WSL)はMicrosoftによって提供される
- BashやLinuxのコマンドはUbuntuのものがそのまま動作する
- 開発者のために提供するシステムである
- LinuxのコマンドからWindowsのファイルシステムにアクセスできる
- LinuxのGUIアプリはサポートしない
- サーバー目的での使用は推奨しない
- まだベータリリースなので、不具合がある
- 将来Ubuntu以外のディストリビューションがサポートされる可能性がある
- デスクトップ向けのWindowsで利用できる
- サーバー向けのWindowsでは利用できない
- 64bit版Windows 10(x64)でのみ利用できる
「UbuntuのユーザースペースをWindowsの開発者達へ・UbuntuのソフトウェアをWindows上で動作させる仕組み」も参考にしてください。
[概要]
Windowsは開発者達に親しみあるBash環境を提供する。
この環境では以下のことができる。
- grepやsed、awkといったコマンド群を実行できる
- コマンドからファイルシステムにアクセスし、ファイルの操作ができる
- サポートされているコマンド群を利用したBashのシェルスクリプトが実行できる
「Canonical」によって提供されるUbuntuのユーザーモードバイナリー(※1)がWindows上で動作する。
これはUbuntuの環境で動作しているコマンドライン群が、Windowsでもそのまま動作することを意味する。
このシステムはまだベータリリースである。
Ubuntuのcoreutilコマンド群(※2)の多くが動作するが、一部のコマンドは動作しないだろう。
動作しないコマンドの情報などをフィードバックして欲しい。
状況に応じて課題に適切な優先順位を付け対応するつもりだ。
※1:Ubuntuのユーザースペースで利用されているバイナリーのこと
※2:Ubuntuの「coreutil」パッケージの説明は以下のようになっています。
本パッケージは、オペレーティングシステムに入っていることが望ましい、基本的 なファイル、シェルおよびテキスト操作ユーティリティを収録しています。
Specifically, this package includes: arch base64 basename cat chcon chgrp
chmod chown chroot cksum comm cp csplit cut date dd df dir dircolors
dirname du echo env expand expr factor false flock fmt fold groups head
hostid id install join link ln logname ls md5sum mkdir mkfifo mknod mktemp
mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf
ptx pwd readlink realpath rm rmdir runcon sha*sum seq shred sleep sort
split stat stty sum sync tac tail tee test timeout touch tr true truncate
tsort tty uname unexpand uniq unlink users vdir wc who whoami yes
Specifically, this package includes: arch base64 basename cat chcon chgrp
chmod chown chroot cksum comm cp csplit cut date dd df dir dircolors
dirname du echo env expand expr factor false flock fmt fold groups head
hostid id install join link ln logname ls md5sum mkdir mkfifo mknod mktemp
mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf
ptx pwd readlink realpath rm rmdir runcon sha*sum seq shred sleep sort
split stat stty sum sync tac tail tee test timeout touch tr true truncate
tsort tty uname unexpand uniq unlink users vdir wc who whoami yes
またUbuntuの「coreutil」パッケージに含まれるコマンド群は、以下のようになっています。
/bin/cat
/bin/chgrp
/bin/chmod
/bin/chown
/bin/cp
/bin/date
/bin/dd
/bin/df
/bin/dir
/bin/echo
/bin/false
/bin/ln
/bin/ls
/bin/mkdir
/bin/mknod
/bin/mktemp
/bin/mv
/bin/pwd
/bin/readlink
/bin/rm
/bin/rmdir
/bin/sleep
/bin/stty
/bin/sync
/bin/touch
/bin/true
/bin/uname
/bin/vdir
/usr/bin
/usr/bin/[
/usr/bin/arch
/usr/bin/base64
/usr/bin/basename
/usr/bin/chcon
/usr/bin/cksum
/usr/bin/comm
/usr/bin/csplit
/usr/bin/cut
/usr/bin/dircolors
/usr/bin/dirname
/usr/bin/du
/usr/bin/env
/usr/bin/expand
/usr/bin/expr
/usr/bin/factor
/usr/bin/fmt
/usr/bin/fold
/usr/bin/groups
/usr/bin/head
/usr/bin/hostid
/usr/bin/id
/usr/bin/install
/usr/bin/join
/usr/bin/link
/usr/bin/logname
/usr/bin/md5sum
/usr/bin/md5sum.textutils
/usr/bin/mkfifo
/usr/bin/nice
/usr/bin/nl
/usr/bin/nohup
/usr/bin/nproc
/usr/bin/numfmt
/usr/bin/od
/usr/bin/paste
/usr/bin/pathchk
/usr/bin/pinky
/usr/bin/pr
/usr/bin/printenv
/usr/bin/printf
/usr/bin/ptx
/usr/bin/realpath
/usr/bin/runcon
/usr/bin/seq
/usr/bin/sha1sum
/usr/bin/sha224sum
/usr/bin/sha256sum
/usr/bin/sha384sum
/usr/bin/sha512sum
/usr/bin/shred
/usr/bin/shuf
/usr/bin/sort
/usr/bin/split
/usr/bin/stat
/usr/bin/stdbuf
/usr/bin/sum
/usr/bin/tac
/usr/bin/tail
/usr/bin/tee
/usr/bin/test
/usr/bin/timeout
/usr/bin/touch
/usr/bin/tr
/usr/bin/truncate
/usr/bin/tsort
/usr/bin/tty
/usr/bin/unexpand
/usr/bin/uniq
/usr/bin/unlink
/usr/bin/users
/usr/bin/wc
/usr/bin/who
/usr/bin/whoami
/usr/bin/yes
/bin/chgrp
/bin/chmod
/bin/chown
/bin/cp
/bin/date
/bin/dd
/bin/df
/bin/dir
/bin/echo
/bin/false
/bin/ln
/bin/ls
/bin/mkdir
/bin/mknod
/bin/mktemp
/bin/mv
/bin/pwd
/bin/readlink
/bin/rm
/bin/rmdir
/bin/sleep
/bin/stty
/bin/sync
/bin/touch
/bin/true
/bin/uname
/bin/vdir
/usr/bin
/usr/bin/[
/usr/bin/arch
/usr/bin/base64
/usr/bin/basename
/usr/bin/chcon
/usr/bin/cksum
/usr/bin/comm
/usr/bin/csplit
/usr/bin/cut
/usr/bin/dircolors
/usr/bin/dirname
/usr/bin/du
/usr/bin/env
/usr/bin/expand
/usr/bin/expr
/usr/bin/factor
/usr/bin/fmt
/usr/bin/fold
/usr/bin/groups
/usr/bin/head
/usr/bin/hostid
/usr/bin/id
/usr/bin/install
/usr/bin/join
/usr/bin/link
/usr/bin/logname
/usr/bin/md5sum
/usr/bin/md5sum.textutils
/usr/bin/mkfifo
/usr/bin/nice
/usr/bin/nl
/usr/bin/nohup
/usr/bin/nproc
/usr/bin/numfmt
/usr/bin/od
/usr/bin/paste
/usr/bin/pathchk
/usr/bin/pinky
/usr/bin/pr
/usr/bin/printenv
/usr/bin/printf
/usr/bin/ptx
/usr/bin/realpath
/usr/bin/runcon
/usr/bin/seq
/usr/bin/sha1sum
/usr/bin/sha224sum
/usr/bin/sha256sum
/usr/bin/sha384sum
/usr/bin/sha512sum
/usr/bin/shred
/usr/bin/shuf
/usr/bin/sort
/usr/bin/split
/usr/bin/stat
/usr/bin/stdbuf
/usr/bin/sum
/usr/bin/tac
/usr/bin/tail
/usr/bin/tee
/usr/bin/test
/usr/bin/timeout
/usr/bin/touch
/usr/bin/tr
/usr/bin/truncate
/usr/bin/tsort
/usr/bin/tty
/usr/bin/unexpand
/usr/bin/uniq
/usr/bin/unlink
/usr/bin/users
/usr/bin/wc
/usr/bin/who
/usr/bin/whoami
/usr/bin/yes
「grep」などのコマンドが含まれていませんが、Ubuntuの「coreutil」パッケージに含まれていないコマンドでも利用できます。
例えば「grep」コマンドは、「grep」パッケージで提供されています。
もし「grep」コマンドが「Ubuntu on Windows」に含まれていなかったら、以下のコマンドを実行して「grep」パッケージをインストールすれば、「grep」コマンドが利用できるようになるでしょう。
apt install grep
[アーキテクチャー]
このシステムは、以下の2つの要素から構成される。
1.Ubuntu on Windows
「Ubuntu on Windows」は、「Canonical」によって提供される正規のUbuntuのユーザーモードバイナリーである。(※3)
2.Window Subsystem for Linux (WSL)
「WSL」はUbuntuのバイナリーをそのまま実行するための基盤である。
「WSL」はLinuxカーネルと互換性のあるインタフェースを提供する。
「WSL」はLinuxのシステムコールを処理するMicrosoftのコンポーネントを含み、Windows NTカーネルと連携して動作する。
このサブシステムはMicrosoftによって開発され、Linuxのコードは一切含まない。
このシステムを図にすると、以下のようになる。
※3:「Ubuntu on Windows」が「Canonical」によって提供されている「Ubuntu」を指しているので、もしDebianコミュニティーが「Debian」のユーザースペースを提供すると「Debian on Windows」になるということでしょう。
上記のシステムの図の「User-mode」は、Windowsのユーザーモードを表しています。
Windowsのアプリもこの「User-mode」内で動作します。
その「User-mode」内で「Ubuntu on Windows」が動作し、さらにその「Ubuntu on Windows」内で「Bash」やLinuxのコマンド群が動作します。
「Kernel」は、Windowsのカーネルモードを表しています。
Windowsカーネルは、カーネルモード内で動作します。
このWindowsカーネル内でサブシステムである「WSL」が動作しています。
「Bash」やLinuxのコマンド群がLinuxカーネルの機能を利用しようとすると、代わりに「WSL」がLinuxカーネルの機能を提供します。
「WSL」は必要に応じてWindowsカーネルに処理を依頼します。
Ubuntu on WindowsのFAQ
「Frequently Asked Questions」にUbuntu on WindowsのFAQが紹介されています。[重要事項]
このシステムは新規に開発された技術であり、今回が初めてのリリースである。
またベータリリースであり、まだ完成していない。
機能に問題や不完全さが残っていることは承知している。
うまく動作する機能もあれば、動作しない機能もあるということを承知して欲しい。
でも皆さんにこの機能を利用してもらい、素晴らしいシステムにするために修正の必要がある問題を明らかにすることは我々の助けとなる。
(※使ってみてフィードバックしてね、ってことです。)
[BASHって何?]
BASHは人気のあるテキストベースのシェルだ。
BASHは、Ubuntuや他のLinuxディストリビューション、及びOS Xにデフォルトで含まれるシェルである。
ユーザーはコマンドをシェルに入力しスクリプトを実行したり、コマンドを実行したり、多くのタスクを完遂するためのツール群を実行できる。
[Windows Subsystem for Linux (WSL)って何?]
「Windows Subsystem for Linux (以下WSL)」はWindows 10に導入された新しい機能だ。
「WSL」はWindows上でLinuxのコマンド群をそのまま実行できるようにする。
「WSL」を利用すれば、伝統的なWindowsデスクトップやWindowsストアのモダンなアプリと同時にLinuxのコマンド群を利用できる。
[Ubuntu on Windowsって何?]
「WSL」を有効にすると、我々は正規のUbuntuのユーザーモードイメージをダウンロードする。
このイメージは「Canonical」によって提供されるイメージだ。
我々の「Bash.exe」アプリケーションを起動すると、UbuntuのBashやコマンド群を読み込み起動する。
[誰のためにあるシステムなの?]
これらのシステムは、開発者のためにある。
特にWeb開発者や、オープンソースのプロジェクトで開発を行っている開発者たちのためにある。
これらのシステムは、UbuntuのBashやLinuxのコマンド群(sedやawkなど)を使用可能にする。
さらにRubyやPythonといったLinuxのツール群も利用可能だ。
[WSLで何ができるの?]
「WSL」は、「Bash.exe」と呼ばれるアプリケーションを提供する。
「Bash.exe」を起動するとWindowsのコンソールが開き、UbuntuのBashが起動する。
あなたはLinuxのコマンド群やツール群が利用できる。
例えば「lsb_release -a」コマンドを実行すると、以下のようにLinuxディストリビューションの情報が表示される。
さらにあなたは、UbuntuのBashからローカルPCのファイルシステムにアクセスできる。
UbuntuのBashから「/mnt」にアクセスすると、マウントされたローカルドライブが見つかる。
例えば「C:」ドライブは、「/mnt/c」にマウントされる。
[仮想マシンでLinuxを利用するよりもWSLを使ったほうがいいの?]
「WSL」は、仮想マシンよりも必要とするリソースが少ない。
リソースとは、CPUやメモリー、ストレージの使用率のことである。
また「WSL」を利用すれば、Linuxのコマンド群やツール群を、Windowsのコマンドラインやデスクトップ、Windowsストアのアプリが動作している環境と同じ環境で同時に使用することができる。
Linuxのコマンド群やツール群からWindowsのファイルに直接アクセスすることもできる。
Windowsのファイルを処理したい時に、Linuxのコマンド群やツール群を利用してもいいし、Windowsのアプリを使ってもいい。
好きな方を利用してファイルの処理ができる。
[なぜWindowsのRubyの代わりにLinuxのRubyを使ったほうがいいの?]
クロスプラットフォームで提供されるツールの中には、Linux環境での動作を前提としたツールがある。
例えば非常に長いファイルパスにアクセスできるツールや、特定のファイルやフォルダーに依存するツールだ。
これらはWindows環境とLinux環境の違いから、しばしば問題を起こす。
Windowsに移植された「Ruby」や「node」のような言語の多くは、Windows環境でもバッチリ動作する。
しかし「Ruby Gem」や「node/NPM」ライブラリーの開発者は、そのすべてをWindowsに移植していない。
そしてLinuxに依存する実装の多くもWindowsに移植していない。
結果、Windows環境でこれらのツールを利用してソフトウェアをビルドする際、うまくビルドできなかったり、実行時にランタイムエラーが発生したり、意図しないWindowsの振る舞いに苦しめられるケースがしばしば発生する。
これらの問題により、多くの人々がMicrosoftのコマンドラインツールに改善を要求するようになった。
これをきっかけとして我々は、UbuntuのBashやLinuxのコマンド群をWindows上で動作させるため、「Canonical」とパートナーを結んだ。
[このシステムはPowerShellにとってどういう意味があるの?]
オープンソースのプロジェクトで活動している時、PowerShellプロンプトからBASHへ移った方が非常に便利なケースが多々あった。
Bashのサポートにより、Windowsのコマンドライン環境の価値を高め、PowerShellやPowerShellのコミュニティーは他の人気のある技術に注力できる。
[すべてのLinuxアプリがWSLで動かせるの?]
違う!
「WSL」は、Windows上でBashやLinuxのコマンドラインツールの実行を必要とする開発者達に向けたツールだ。
「WSL」は、「Gnome」や「KDE」といったGUIデスクトップやアプリケーションのサポートを目的としていない。
加えて、「Redis」のような多くの人気あるサーバーアプリケーションを動かすこともできるだろうが、「WSL」のサーバー目的での使用は推奨しない。
サーバー目的で使用するなら、Microsoftは「Azure」や「Hyper-V」、「Docker」といったソリューションを提供しているので、そちらでUbuntuを利用して欲しい。
[なぜベータリリース?]
このシステムは新しい技術であり、今回が初めてのリリースだ。
不具合がある。
我々はいくつか不具合を把握しており、あなたはさらに多くの不具合を見つけるだろう。
もう一度言うが、これはベータリリースだ。
クラッシュしたり起動しないツールがあるだろう。
問題に遭遇したらぜひ知らせて欲しい。
我々は問題の修正と飛躍的な「WSL」の改善に一所懸命取り組む。
[Ubuntu以外のディストリビューションは利用できるの?]
現在点では利用できない。
我々は素晴らしいUbuntu体験をユーザーに届けることに焦点を充てている。
でも将来他のLinuxディストリビューションをサポートするため、積極的に調査を行っていく。
[どのWindowsのエディションならWSLが含まれるの?]
「WSL」は、デスクトップ向けのWindowsで利用できる。
「WSL」はサーバー技術ではないため、サーバー向けのエディションでは利用できない。
また「WSL」はオプション扱いなので、「WSL」を利用したければ「Windowsの機能」から「WSL」を有効にするか、「DISM」から有効にして欲しい。
[サポートされるCPUのアーキテクチャーは?]
x64のみサポートする。(64bit版のWindows 10)
[フィードバックはどこにすればいい?]
フィードバックや質問は、以下でできる。
GitHub issue tracker
command-line UserVoice portal
command-line team blog
Twitter(@richturn_ms)
[Cドライブにどうやってアクセスしたらいい?]
ローカルPCのボリュームのマウントポイントは自動的に作成され、Windowsのファイルシステムに容易にアクセスできる。
マウントポイントは、以下にある。
/mnt/<ドライブレター>
Cドライブにアクセスしたければ、以下のようにカレントディレクトリーを移動する。
cd /mnt/c
[LinuxのドライブにあるファイルとマウントされたWindowsのドライブにあるファイルはなにか区別される?]
1.Linuxのroot(/)以下にあるファイルは、サブシステムによって制御される。
これにより以下のLinux特有の振る舞いを実現する。
- Windowsでは使用できないファイル名を使用できる
- 非管理者ユーザーでもシンボリックリンクを作成できる
- パーミッションなどファイルの属性はchmod/chownで変更する
- ファイル名は大文字/小文字を区別する
2.一方マウントされたドライブ内のファイルはWindowsによって制御され、以下の振る舞いを行う。
- ファイル名は大文字/小文字を区別しない
- シンボリックリンクの作成はサポートしない
- すべてのパーミッションは777に設定され、ユーザーはWindowsのファイルにフルアクセスできる
3.シンボリックリンクは、異なるファイルシステムを超えて作成することはできない。
[apt-get upgradeを実行するとエラーが大量に出力されるんだけど]
いくつかのパッケージは、まだWSLでサポートされていない機能を要求する。
例えば「udev」だ。
これが原因で「apt-get upgrade」時にエラーが出力される。
「udev」に起因するエラーを修正するには、以下の修正を行う。
1./usr/sbin/policy-rc.dの修正
「/usr/sbin/policy-rc.d」ファイルの中身を以下のようにする。
#!/bin/sh
exit 101
2.実行権限の付与
「/usr/sbin/policy-rc.d」ファイルに実行権限を付与する。
chmod +x /usr/sbin/policy-rc.d
3.コマンドの実行
以下のコマンドを実行する。
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl
[完全にWSLをアンインストールするにはどうすればいい?]
コマンドプロンプトで以下のコマンドを実行する。
lxrun /uninstall /full
[bashからインターネットにアクセスできないんだけど]
IPv6の接続に関する問題がある。
アップデートを待ってて欲しい。
[インストール時にError: 0x80040306が出るんだけど]
レガシーコンソールはサポートしていない。
レガシーコンソールを以下の方法でオフにして欲しい。
1.コマンドプロンプトを起動する
2.タイトルバーを右クリックして表示されるメニューから「プロパティー」をクリック し、「従来のコンソールを使う」をオフにする
3.「OK」ボタンがクリックする
[Windows 10 Anniversary Editionに向けて実装する優先順位の高い機能ってなに?]
目標は、コアの実用性と機能性に焦点を当てることである。
Anniversary Editionに向けて、我々は以下の優先順位付けを行っている。
1.開発者のためのbash環境
「grep」や「sed」、「awk」のような標準的なGNUコマンドラインツールが動作するbash環境を提供する。
2.Windowsのボリュームにアクセスできる
「/mnt」を通じてWindowsのローカルボリュームにアクセスできる機能を提供する。
3.シンボリックリンクのサポート
「WSL」環境内でシンボリックリンクをサポートする。
4.Linuxユーザーのサポート
「bash」でLinuxユーザーをサポートする。
5.APTのサポート
パッケージの更新やテストのために、「apt」や「apt-get」をサポートする。
6.プログラミング言語の基本的な機能のサポート
以下のプログラミング言語の基本的な機能をサポートする。
- NodeJS / npm
- Python
- Perl
- Git
7.CUIのエディターやツールのサポート
以下のエディターやツールをサポートする。
- vi
- emacs
- ssh
さらに多くのプログラミング言語と機能がAnniversary Editionで動作するだろう。
しかしそれらの分野で発生する不具合の対応や機能改善は、上記で挙げたリストより優先順位は低くなる。
[Bash on Ubuntu on Windowsってどうやってアップデートするの?]
「Bash on Ubuntu on Windows」のアップデートには、以下の2種類のコンポーネントのアップデートが必要だ。
1.WSL(Windows Subsystem for Linux)
WSLをアップデートするには、Windows Insider Programに参加し、Windows UpdateでBuildを最新の状態にする。
「Ubuntu on Windows」の再インストール等の操作方法は、コマンドリファレンスを参照して欲しい。
2.Ubuntuのユーザーバイナリー
Ubuntuのユーザーバイナリー(ユーザースペース)をアップデートするには、以下のコマンドを実行する。
- apt-get update
- apt-get upgrade
(※Ubuntuの作法と同じです。)
[pingコマンドを実行しようとすると、管理者権限が求められるんだけど]
これは既知の問題だ。
Linuxの実装方法とWindowsカーネルのICMPリクエストの処理方法の違いがこの問題の原因になっている。
将来のリリースでこの問題を解決する予定だ。
[WSLで表示に使用する言語はどうやって変えるの?]
WSLのインストール時、自動的にUbuntuのロケールをWindowsと同じロケールに設定する。
Ubuntuのロケールを変更したい場合は、以下のコマンドを実行してbashを起動し直して欲しい。
sudo update-locale LANG=ロケール
例えば英語に設定したい場合は、以下のコマンドを実行する。
sudo update-locale LANG=en_US.UTF8
[ping実行時にアクセス権がないと出るんだけど]
Windowsでは「ping」の実行に管理者権限が必要になる。
管理者として「Bash on Unbutu on Windows」を実行するか、管理者で起動している「コマンドプロンプト」や「PowerShell」から「bash」を起動して欲しい。
[OpenSSHサーバーはどうやって起動するの?]
「ping」と同じように管理者として「Bash on Unbutu on Windows」を実行するか、管理者で起動している「コマンドプロンプト」や「PowerShell」から「bash」を起動して欲しい。
[WSLからインターネットにアクセスできないんだけど]
ユーザーから、特定のファイアーウォールアプリケーションがWSLのインターネットへのアクセスをブロックするとの報告があった。
報告を受けているファイアーウォールは、以下のとおりだ。
- Kaspersky
- AVG
- Avast
ファイアーウォールをオフにしてインターネットへアクセスできるか確認して欲しい。
[Windowsをアップグレードした後bash.exeを起動すると、Error: 0x80040154になるんだけど?]
Windowsがアップデート処理を行っている間、WSLの機能が無効になる場合がある。
もしこのエラーに遭遇したら、「Windowsの機能の有効化または無効化」から再度「WSL」を有効にする必要がある。
「WSL」のインストールと同じ作業だ。