ちょっと前にWindowsがBashをサポートする と言う発表をして、今年の夏頃からサポートしたバージョンがWindows 10のアップデートで配布される 予定です。
現時点でも Windows Insider Program に参加することで現在進んでいるプロジェクトを先取りして使うことが出来、 その中にこのBashのサポートも既に含まれているので ちょっと使ってみました。
途中、インストールで躓いたところとかもあったのでその辺もメモしておきます。
- Windows 10 Anniversary Update
- Run native Bash on Ubuntu on Windows
- 現在インストールされているUbuntu/Bash
- ディレクトリ構造
- 日本語について
- root権限
- 大文字小文字
- シンボリックリンク
- Xサーバー
- GNU screen/tmux
- まとめ
- WindowsでのサードパーティーLinux環境
Windows 10 Anniversary Update
追記: 2016/08/04
8月2日にAnniversary Updateと呼ばれる大型アップデートが提供開始され その中にBash on Ubuntu on Windowsも含まれています。
従って以下のWindows Insider Programなどへの参加はもう不要で、 開発者向け機能を使う以降の設定で使えるようになります。
追記ここまで
Run native Bash on Ubuntu on Windows
以下の14316というビルドでBashをネイティブにWindows上で走らせる事が出来るようになっています。
Announcing Windows 10 Insider Preview Build 14316 Windows Experience Blog
このビルドを手に入れるためにはまず、 Windows Insider Program に参加する必要があります。
また、今回行っているのは64 bit版のWindows 10 Home Editionです。
Windows Insider Programへの参加
設定の更新とセキュリティWindows Update から詳細オプションへ行き、Insider Previewビルドの入手というところで 開始するを押すと、Windows Insider Programにご参加くださいと言ったダイアログが出るので、 そこで登録を押しても上のページに行けます。
また、アカウントを持ってるけどWindowsに登録してなかったり別のアカウントを使ってる様な場合、 ここでアカウントを切り替えたりすることも出来ます。
大概の場合、Windows 10を使っている場合はMicrosoftアカウントを登録してあると思うので そのアカウントでWebページでもログインし、Insider Programに参加します。
Webで参加登録後、先ほどのInsider Previewビルドの入手のところで 再び開始するを押すと実際に入手する作業に入れます。
ここでちょっと注意が必要なのは、Insider Previewビルドの入手を開始する前に、 プライバシーフィードバックの間隔 の設定をいじっている場合、フィードバックを求められる頻度及び デバイスのデータをMicrosoftに送信するをそれぞれデフォルトの 自動(推奨)、完全(推奨)に戻しておく必要があります。
これを戻しておかないと、上の開始ボタンを押しても、 既にInsider Programに参加したアカウントを選んでいても延々と Windows Insider Programにご参加くださいのダイアログが出てきてしまいます。
Insider Programは正式配布前のビルドを試用してフィードバックをもらおう、というものなので 当然フィードバックありきの配布なわけで、ここをオフにしてたら使えない、というわけです。
上の絵はInsider Program開始後ですが、開始後はこれらのオプションが変更できない様になっています。
ここで結構悩んで途中で辞めそうになった…
Insider Previewの入手、インストール
とういうことで、無事開始することが出来たら次はビルドの入手の設定をしておきます。
先ほどのWindows Updateの詳細オプションの所に 今度はInsiderのレベルを選んでください。設定を変更した後ではビルドの受け取りにしばらく時間がかかります。という項目があり、下にバーがあるので 一番右のMaxのファスト(Fast)にしておきます。
これは新しいビルドをどれだけ頻繁に入手するか、というオプションですが、 差し当たり早く欲しいのでファスト(Fast)に。 (ただ、最初の入手に関してどれだけ意味があるのかはちょっと良くわかってません。)
この設定をすると暫くすると入手するんですが、 これはWindows Updateの更新プログラムのチェックを押しても すぐに入手することは出来ません。
ネットにつながってる時に自動的にチェックして入手出来る様になるらしく、ここまで来たらしばらく待つ他ありません。
早ければ1時間以内、ヘタすると1日位かかるみたいですが、今回は 設定して1時間位したら入手できる様になりました。
ここでも更新をチェックしても更新されないためにきちんと設定できてないんじゃないか? と疑ったりして、色々チェックしなおしたりしてましたが、 ここはもう待つしかありませんので暫くは忘れて放っておく位な気持ちで。
しばらくしてWindows Updateを見て、更新プログラムを利用できます。 の表示の下にWindows 10 Insider Preview XXXXX。の様な表示があれば Insider Previewを入手出来るようになってるので その下に出ている今すぐインストールボタンを押して インストールを開始します。
そうなってないかぎりは辛抱強く待つだけです。
初めてInsider Previewを入れるときは差分が多くあるので結構時間がかかります。 (開始して寝ましたが多分最低1時間程度はかかっていた様です。)
インストールが終わったら再起動が必要ですが、再起動して更新するにも 結構時間がかかります。(数十分程度。) 途中で何回も再起動をしたりもするので、特にこちらの再起動の方は時間がある時に行う必要があります。 (入手するだけならバックグラウンドでも出来るので。)
Insider Previewのインストールが終わって再起動すると、 最初ログイン画面が青色一色になってたりログイン後にも しばらくマウスも使えない状態で待たされたりしますが、 一通り準備が終わると今まで通りの設定で使える様になります。
ただ、一部機能などがリセットされるらしく、 レジストリをいじって変更していたCapsLock、Alt、Ctrlの 交換1 はリセットされていました。 なのでこれは再び設定しておきました。
その他は今のところ特に気づいたところは特にありません。
設定の項目自体が色々と変更されてるのでその辺で細かい違いがあるかもしれません。
Windowsのバージョンの確認
Insider Preview版をインストールしましたが、ここでWindowsのバージョンの確認をしておきます。
Windowsの細かいバージョンを確認するには、
Win-Rでファイルを指定して実行を起動するか
Cortanaの検索を使い、winver
を入力して実行します。
そうするとこんな画面が出てくるので、ここでビルドが14316
より大きければ
Bashの機能が使える様になっています。
Insider Previewをインストールしていれば14000より大きなこんな数字になっていると思いますが、
現状の通常バージョン(Windows 10 Home Editionで確認)だと
10586.318
になっていました。
もしこんな感じの数字であればまだインストールが出来ていないので、 入手が終了しているのであれば 設定のWindows Updateなどに行くと再起動して更新、的なボタンが有るはずなので それを押して再起動、更新する必要があります。
デスクトップに表示が出る?
Insider Preview版をインストールすると強制的にデスクトップに表示が出るようです。
こんな感じで右下にInsider Previewの表示が出て、壁紙とかを変えても 常に表示される様な状態になっています。
ちょっと気になる人は気になるかも。。。
開発者向け機能を使う
Bashを有効化する前に、機能を使えうために開発者モードに設定する必要があります。
これは、設定更新とセキュリティ 開発者向けに行くと 開発者モードを選べる項目があるのでそれを選びます。
Bashの有効化
ここまで来たらBashを有効化出来ます。
スタートボタンを右クリックするなどして出てくる項目からコントロールパネルを開き、 プログラムWindowsの機能の有効化または無効化を開きます。
Insider Previewが入っていて上の設定がきちんとできていれば、 ここにWindows Subsystem for Linux (Beta)という項目があるはずなので それにチェックを入れてOK。
再起動を促されるので再起動します。
再起動したらコマンドプロンプトかPowerShellを起動してbash
とコマンドを打ちます。
もしくはファイルを指定して実行などからbash
を直接起動してもOK。
(C:\Windows\System32\bash.exeを実行する。)
そうするとBashをインストールするかどうか聞かれるのでy
を入力するとBashのインストールが始まります。
インストールが終わるとBash用のユーザー名やパスワードの設定を促されます。 このユーザー名などはWindowsの物と同じでなくても構いません。 (PowerShellだと日本語表示になりますが、なんか表示が二重になってたりしておかしかったです。。。)
設定が終わるとBashが始まります。
その後は
スタートアップにBash on Ubuntu on Windowsという項目が追加されているはずなので
それを起動するといきなりBashなコマンドプロンプトが使えます。
(この項目自体はbash.exeへのショートカットになっていて、
引数として~
を取る様な形になっています。)
コマンドプロンプトなりPowerShellでbash
と打って始めることも出来ます。
これでWindowsでネイティブなBashが使えるようになりました。
現在インストールされているUbuntu/Bash
見てみるとこんな感じです。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.4 LTS
Release: 14.04
Codename: trusty
$ uname -a
Linux DESKTOP-IIK93T3 3.4.0+ #1 PREEMPT Thu Aug 1 17:06:05 CST 2013 x86_64 x86_64 x86_64 GNU/Linux
$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Ubuntuなのでapt-get
を使ってパッケージをインストール出来る様になっています。
ディレクトリ構造
Bashのホームディテクトリは、Windows上では C:\Users\<WindowsUserName>\AppData\Local\lxss\home\<UbuntuUserName> になります。
lxssディレクトリなのですが、エクスプローラーからだと
隠しファイルを表示する様になっていても表示されず、
Localまで行った後にアドレスバーに直接\lxss
を追加すると中を見ることが出来ました。
(何やら初めて見る仕様です。。。)
追記: 2016/08/04
コメントで指摘していただきましたが、 これは初めて見る仕様、ではなく、もうひとつ、 保護されたオペレーティング・システムファイルを表示しないというフォルダオプションを切る必要があります。 このオプションは以前のWindowsバージョンからずっとあるものです。
隠しファイルよりもう一段階高いレベルで保護されてるファイル、フォルダの表示を設定する項目。
Windows 10ではエクスプローラーでフォルダを開いて上のタブの表示を押して表示に関するオプションを出すと、 隠しファイル等の表示を簡単に変更できる様になっています。
ただ、ここに全てのオプションがあるわけではなく、 さらにオプションを起動して表示タブに行くと 詳細設定が出来る様になっています。
この中に隠しファイルの表示設定もありますが、 一番下に 保護されたオペレーティング・システムファイルを表示しないという項目があり、 デフォルトではチェックされています。
このチェックを外すとlxssのフォルダも見える様になります。
エクスプローラーの表示の項目で簡単に隠しファイルとかの表示が変更できる様になってたので 昔ながらのオプションの変更はもう必要ない、と勘違いしてたのが気づかなかった理由です。
それでも表示のところにオプションと右に大きくあるのに 気付けなかったな、、、と。
追記ここまで
さらに C:\Users\<WindowsUserName>\AppData\Local\lxss\rootfsというデイxレクトリがあり ここにusrやbinなどのLinuxファイルが入っています。 こちらにもhomeはあるんですが、 中は空でWindows側からなにか作ってもUbuntu側のhomeには反映されないので、 どうもhomeだけは\lxss\homeを使う仕様になってる模様。
これから分かるように、Bash on Ubuntu on Windowsでは各ユーザーごとに Linux環境を作る様になっているみたいです。
また、Bash側から Windowsのディレクトリを見るには、 /mnt/cなどからCドライブなどへアクセスが出来る様になっています。
日本語について
Bash上では今のところ日本語を打つことが出来ません。
PowerShellなんかだと日本語を使えるのですが、
bash
を起動すると日本語に切り替えができなくなります。
(BashなPowerShellにフォーカスがあるかぎりIMEを直接ひらがなとかにしようとしても出来ない。)
ただし、日本語を表示することは可能らしく、
日本語の内容のファイルをcat
してみたり、
日本語のファイル名があるディレクトリでls
してみたところ正しく表示されました。
日本語が打てないのでVimとかで開いても文字やコピーこそ一応出来ますが、 削除も半角毎に行ってるっぽい感じでまともに使えません。
無理やりファイル操作とかをしたい場合、PowerShellからbash -c
とコマンドの形で呼んで、
> bash -c "mv このふぁいる あのふぁいる"
みたいな感じで操作しようと思えば出来ますが、まあ意味無いです。
root権限
root権限はユーザに与えられているのでapt-get
などはユーザーで直接できる、
みたいな話を見ましたが、apt-get
してみたところ
Permission deniedでare you root?と聞かれてしまいました。
rootのパスワードなど設定してないのでsu
しようが無いのですが、試しに
$ sudo apt-get update
としてみるとユーザーのパスワードを聞かれ、パスワードを入力すると行けました。
$ id
id=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev)
みたいになっていて、sudo
グループに全権限が与えられてるので全てのコマンドを
このユーザーでsudo
出来るみたいです。
大文字小文字
上のポストに書いてあるとおり、 基本的にWindowsは大文字小文字を区別しません。
一方Linuxシステムでは区別します。
Bash on Ubuntu on Windowsの場合、/mnt/cなどからWindows領域に行って作業すると 基本的に大文字小文字だけが違う別のファイルを作る事は出来ません。
$ cd /mnt/c/Users/user
$ touch a A
$ du a A
0 a
としてもa
というファイルだけが出来ます。
一方、Ubuntu領域に行くと、
$ cd
$ touch a A
$ du a A
0 a
0 A
と、aというファイルとAというファイルの2つができています。
実際エクスプローラーから覗いてみてもこの2つが確認できます。
Windowsは通常NTFSにフォーマットされたディスクを使いますが NTFS自体は大文字小文字を区別できますがWindowsがアプリケーションとして区別しないようにしています。 なのでこの場合、Ubuntu領域に限っては区別するような特別な処置をしているみたいです。
この辺なかなか複雑なことをしてる感があります。
ただ、エクスプローラーから見えるには見えるものの、正しくは扱えないみたいで、
$ echo aaa > a
$ cat a
aaa
$ cat A
$
な状態でエクスプローラーからaをメモ帳で開いて見ると空でした。
Aを削除してから再びaをメモ帳で開いてみるとaaa
と言う内容が見れました。
どうもa、Aがある状態でエクスプローラーから開こうとしても 常に大文字の方だけをアプリケーションに名前として渡してしまう模様。
シンボリックリンク
また、Cygwinなんかでシンボリックリンクを使おうとすると結構ややこしいのですが、 Bash on Ubuntu on Windowsのシンボリックリンクはまた面倒な仕様です。
シンボリックリンクを作ってみたところ、Windows領域では 通常ファイルに見えますが、メモ帳とかで開こうとすると ファイルにアクセス出来ませんと出て開けません。
一方、Ubuntu領域で作ると開くことは出来ますが、中身には リンク元のファイル名が入っています。
$ touch a
$ ln -s a b
とすれば、bをメモ帳で開くとa
となっている状態。
ただし、開けますが内容を変更しようとすると プロセスはファイルにアクセスできません、別のプロセスが使用中です。 と言われて Windows側から変更を保存したりは出来ません。
というわけでWindows側とリンクを共有したり、そういった事は今のところ出来なそうです。
さらに、Ubuntu領域に対してWindows側からファイルを作ったりディレクトリを作った場合、 それらのものはBash側では見ることが出来ません。 (なので、上でHomeに作っても変換なし、と言った所はちょっと理解が違うかもしれません。)
どうもUbuntu領域は基本的にWindowsとは完全独立な体制にしたい感じになっています。
Xサーバー
Bash on Ubuntu on WindowsではXサーバーは直接サポートしないとなってますが、 自前でXサーバーを動かせばGUIなアプリも動かすことが出来ます。
Xmingなり CygwinのXサーバーなりなんでも良いんですが、 多分、今現在WindowsでXサーバーを立ち上げるのはMobaXtermを使うのが 一番簡単なのでそれでテスト。
MobaXtermが入ってればアプリを立ち上げるだけでXサーバーも起動します。 MobaXtermのローカルターミナルでDISPLAY変数を見てみると
$ echo $DISPLAY
127.0.0.1:0.0
となっているので、Bash on Ubuntu on Windowsのターミナルで、
$ export DISPLAY=127.0.0.1:0.0
とします。(デフォルトでは値は設定されていません。また、ローカルホストなので
実際にはexport DISPLAY=:0.0
だけでもOKです。)
これでXなアプリも使える様になったはずなのでテストしてみます。
適当なものが無かったのでapt-get
でxclock
などXアプリをインストールして使ってみます。
$ sudo apt-get install x11-apps
$ xclock
MobaXtermを起動した状態でxclock
を立ち上げれば
時計がきちんと出てくるはずです。
Xサーバーが動いてなければ
$ xclock
Error: Can't open display: 127.0.0.1:0.0
と言った感じのエラーが出ます。
もし本気でこのBash on Ubuntu on WindowsをXも含めて使いたい場合は Xmingとかを使うべきだとは思いますが、 取り敢えずXサーバーを動かせばXなアプリも使える様です。
GNU screen/tmux
追記: 2016/09/01
GNU screenやtmuxと言ったターミナルマルチプレクサなどは 色々と難しい点があるようで、 初期のBash on Ubuntu on Windowsでは両方共使えませんでした。
ただ、tmuxの方はAnniversary Update時にには使えるようになっていて、 GNU screenに関しても使える様になったみたいです。
追記ここまで
まとめ
ちょっと触ってみた感じでは単純なBashシェルとしては普通に使えました。
ssh
なども入っているので他のサーバーにログインして使ったりも出来ます。
ただ、Linux環境をそのまま入れようとし過ぎているのか、 基本、Windows環境と独立したものが単に入っている感じになっています。
一応/mnt/からWindows側のファイルを見ることは出来ますが、 システムが違う物を無理やり繋げてる感じがして 余り実用的ではありません。
Xに関しては一応使えますが別途自分で用意しなくてはいけないので Windowsネイティブ、という売りの意味が無くなってしまいます。
起動スピードに関してはCygwinやMobaXtermに比べて大分速く、 瞬時に立ち上がる感じがあるのは良い所だとは思います。
後は一応Ubuntuなのでapt-get
でパッケージをインストールすることが出来、
Cygwin(またはMobaXterm)のapt-cyg
で用意されているものに比べれば
パッケージが充実してるかな、という点はあります。
ですが、例えばCygiwnではcygstart
というコマンドがあり、
所謂Macのopen
コマンド的なファイルをOSのアプリを使って開いたり
OSのアプリを実行するコマンドがありますが、
Bash on Ubuntu on Windowsではそのようなコマンドはありません。
これはそもそも思想が違うので今後出来るか、とわれると 根本的なコンセプトが変わらないかぎりは入ってこないと思います。
そもそもWindowsにBashが入る、ということでユーザーが求めるのは
個人的にWindowsをBashで管理する、ということだと思うのですが、
これだと単にWindowsの中でBashを使える、というだけで
むしろCygwinやMobaXtermの単なる下位互換にしかならない感じです。
追記: 2016/06/06
WindowsをBashで管理するが欲しいのは個人的には Linux的な作業を行うのであれば手元のマシンで行うことがあまり無いからです。
基本Linuxサーバーが別にあってそこに入って作業します。 前までのWindowsマシンでは中にVM環境作って作業するにはきつかったし あまり現実的ではなかったですし。
今はWindowsだとそういう開発をするのに全部手元のマシンでVMを使う人も多いのでしょうかね? (Cygwinで開発してるというのは殆ど聞かないし、下に出したcoLinuxなんてのは 最近話にすら出てこないので。。。)
ただ、逆に今の端末はノートPCでも十分なスペックを持ってる事が多く、 手元で開発を行う様な人ならVMでLinux立ち上げても十分使える様なものを持ってる事が多いと思います。
だとすればやはりUNIXライクなコマンドが使えて嬉しいのは ホントにネイティブにWindows内のシステム等にUNIXなコマンドラインから アクセス出来る、というところだとは思うのですが。
MacとWindowsで差を感じるのはやはりその部分なので。 まあ、個人的にですが。
追記ここまで
取り敢えず入れてみた、感しか無いんですが、 今後、Windowsを管理するためのBash、として進化してくれることを祈りつつ、ちょっと見守る感じです。 (現状CygwinやMobaXtermの方が圧倒的に使えて、このBashを使う意味は全く無いという結論。。。)
追記: 2016/06/05
個人的な思いはともかく、実際どういったものを作ろうとしてるか、というのは Bash on Ubuntu on WindowsのFAQを見るとちょっと見えてきます。
まず、これはWindows Subsystem for Linux (WSL)と呼ばれ Windows内にLinux環境のサブシステムを作るためのもの、とのこと。
Why would I use WSL rather than Linux in a VM?
WSL requires fewer resources (CPU, memory and storage) than a full virtualized machine. WSL also allows you to run Linux command-line tools and apps alongside your Windows command-line, desktop and store apps, and to access your Windows files from within Linux. This enables you to use Windows apps and Linux command-line tools on the same set of files if you wish.
特にこれを見ると仮想マシンでやってることをWindowsネイティブで出来る様にしたい、と行った感じです。 VM上で行うのに比べOS自体を立ち上げる必要がないため少ないリソースで Linux環境を作る事が出来る、と。
また優先度が高いものとして
1. A Bash environment for developers to run standard GNU command line tools such as grep, sed, awk
2. Provide access to the local hard drives through /mnt
3. Symlink support within the WSL environment
4. Linux user support
5. Provide the ability to run apt / apt-get for updates and package testing
6. Provide basic functionality for some languages:
* NodeJS / npm
* Python
* Perl
* Git
7. Command line editors / tools
* vi
* emacs
* ssh
が挙げられていますが、これらは大体出来てる感じです。
/mnt/からWindows領域を見ることはできるし シンボリックリンクもWSL内ではきちんと機能しています。
NodeやGit、またEmacsに関しては現状初期状態では入っておらず
apt-get
で取ってくる必要があります。
と言った感じで目指されてるのはWindowsでもVMなどを立ちあげなくてもパッと Unix系コマンドを使ってテストとか出来る様にしたい、という所みたいです。
これを使ってWindows側を管理したりどうこうする、なんてことは今のところ あまり無い模様。 その辺はやはりコマンドプロンプトなりPowerShellがあるでしょ、ということかもしれませんが。
むしろ領域を完全に分けて仮想状態を作ってる辺り、逆に Windows環境とは敢えて切り分けて置く、という考えもありそうな感じすらします。 シンボリックリンクとかWindowsの物とは全く別の物を使ったりしてるみたいなので 単に環境をまとめるのがまだ難しいだけかもしれませんが。
Bash on Ubuntu on Windowsに対する追加アイデアみたいなものは 下で投稿され、必要とされるものは取り入れられて行っている様です。
Command Prompt / Console / Bash on Ubuntu on Windows: Top (390 ideas) – Welcome to the Windows developer feedback site!: https://wpdev.uservoice.com/forums/266908-command-prompt/filters/top
また、GitHubにもIssue専用のREADMEだけのレポジトリが出来ていて、 問題などを見つけたたらこちらから報告するみたいです。
追記ここまで
WindowsでのサードパーティーLinux環境
追記: 2016/06/05
WindowsではサードパーティーなアプリでLinux環境を構築することが昔から行われています。
一番有名なのはやはり Cygwin。
シェルなどをWindows環境上で動くようにコンパイルしなおして UNIXライクな環境を作り出しています。
パッケージも
apt-cyg
というapt-get
に似せたスクリプトを使ってインストールしたりすることが出来ます。
(ただし、apt-cyg
自体はCygwin公式なものではなくてさらなるサードパーティースクリプトです。)
Cygwinと似たような物で MobaXterm というソフトも有ります。
こちらはBusyBoxというUNIXツールを一つのバイナリに詰めた軽量 ツールをベースに作られています。
Xサーバーとかがデフォルトで起動したり、sshの管理がGUIで簡単に出来たり、 PuTTYから設定をインポートできたり、 またMoshなどもサポートしていたり 結構色々充実しています。
ぱっと始めるのであればCygwinより手軽です。
後は余り使われてないと思いますが、 Cooperative Linux(coLinux) という、実際のLinux環境を仮想的にWindows内に作る物があります。
ただ、今はVMwareなりVirtualBoxなりで好きな仮想環境を作れるので 敢えて使う必要は無い感じです。 (昔のリソースが少ない環境でもcoLinuxは割りと負荷なく動いたのでそれはそれで結構便利でした。)
ただ、Bash on Ubuntu on Windowsの使用感としてはこのcoLinuxが一番近いように感じます。
追記ここまで