如何評價 Windows 版「bash」(及其相關 *nix 子系統)?


Scott Hanselman 在他的博客裡面提供了更多關於這個的細節 http://www.hanselman.com/blog/DevelopersCanRunBashShellAndUsermodeUbuntuLinuxBinariesOnWindows10.aspx

這個並不是通過Hyper-V啟動一個Ubuntu的虛擬機的方式來弄的。而是Windows有個子系統把Linux的調用都轉成Native的API,直接運行Ubuntu鏡像裡面的二進位執行文件。所以能使用各種Linux命令(包括Ubuntu的apt-get安裝軟體)。就像Linux上的wine通過翻譯Windows API來運行Windows程序一樣,Windows的那個子系統就是Windows上的wine。

Dustin Kirkland 是Ubuntu Team的人,

http://blog.dustinkirkland.com/2016/03/ubuntu-on-windows.html 他的博客裡面也講到這個

Here, we"re talking about bit-for-bit, checksum-for-checksum Ubuntu ELF binaries running directly in Windows.

...

Linux geeks can think of it sort of the inverse of "wine" -- Ubuntu binaries running natively in Windows. Microsoft calls it their "Windows Subsystem for Linux". (No, it"s not open source at this time.)


更新:微軟發布了一個blog post,詳述相關的Linux子系統設計。基本上可以看成是對POSIX子系統的擴展,一個對Linux API的翻譯層加上對應的文件系統實現。

Windows Subsystem for Linux Overview

------------------------------------------------------------------------------------------

與其說這是Bash on windows, 不如說這是Ubuntu on Windows.

1. 這個subsystem從用戶的角度是什麼樣子的?

Here"s let"s break it down slowly...

  1. Windows 10 users
  2. Can open the Windows Start menu
  3. And type "bash" [enter]
  4. Which opens a cmd.exe console
  5. Running Ubuntu"s /bin/bash
  6. With full access to all of Ubuntu user space
  7. Yes, that means apt, ssh, rsync, find, grep, awk,sed, sort, xargs, md5sum, gpg, curl, wget, apache,mysql, python, perl, ruby, php, gcc, tar, vim, emacs,diff, patch...
  8. And most of the tens of thousands binary packages available in the Ubuntu archives!

http://blog.dustinkirkland.com/2016/03/ubuntu-on-windows.html?m=1

2. 我本來就可以在windows下運行VM/Cygwin/mingw。這個系統和以往的方案區別在哪?

1) 不是vm,也不是container,所以性能不受太大的影響。根據上文中Krikland的文章, sysbench的運行結果幾乎相同。

2) 它比cygwin更像Linux,或者說,這本來就是一個完整的user-space Ubuntu,通過類似wine的原理實時把system call翻譯成native windows API。這意味著你可以直接用apt-get管理軟體包,直接運行Ubuntu的binary,不再需要單獨為Windows重新打包和編譯。

3) 此外,微軟為此改進了cmd.exe這個console,增加了更多vt100的支持。也就意味著Powershell和Native命令行程序也能獲得更好的支持。

3. 這個系統是設計給誰的?如何評價?

應該很少有人會在這個系統上跑server。微軟明確指出那種情況應該考慮虛擬化。此外,Linux子系統和Windows應用無法交互 - 你無法用bash運行notepad,反過來也無法從PowerShell運行Ubuntu的Ruby。

Run Bash on Ubuntu on Windows

這個特性更多的針對的是需要使用Linux開源工具鏈的Windows開發者。現在你無需虛擬機就可以很方便的獲得和Ubuntu幾乎相同的軟體環境——而Ubuntu是今天雲端Linux系統的事實標準。同時享受Windows方便廣泛的硬體軟體支持。

假如整個系統工作正常——看下一個insider版本了;這對於每一方應該都是好事:開源生態進一步跨平台,Windows開發者的選擇進一步增多,Linux, Microsoft和Canonical也擴大了影響力。

至於到底有多好用,是不是PowerShell+chocolatey就比bash+apt-get難用,讓用戶去判斷吧。又不是說從此Windows就只能用bash。

有選擇總比沒選擇好,不是嗎?


反編譯lxcore.sys得到的一些結論(猜想(?))

1. 做了一個subsystem(pico?)的驅動用來處理linux下的syscall,叫做lxcore.sys

用elf loader(比如bash)創建進程的時候,會通過這個驅動來創建(準確的說是pico給出的介面來創建?),擁有其他正常windows進程的特性(?)

2. 用了一套新的API,PsRegisterPicoProvider

3. 直接執行elf

4. 擼了一套fs,看起來把linux下的一堆fs下的東西都擼出來了

5. --fork是多線程實現-- 看錯了

6. epoll是事件做的

7. 現在的(14295)下的mount syscall並沒有實現

8. 為啥這裡還有app container的理論……

9. 看起來exec有點偏差?

----10. 似乎刪除(硬碟上)文件是調用ZwSetInformationFile的FileRenameInformationBypassAccessCheck移動文件……----

刪除文件:ZwSetInformationFile

對DrvFs會刪掉文件(似乎是給Windows的文件用的(?))

對VolFs、RootFs、LibraryFs什麼的似乎是Rename……(給Linux的文件系統用(?))

VolFs有chmod什麼的理論,DrvFs大概沒有……(就算有也是在vfs上的吧……)

Linux文件系統和NT的文件系統下的差異似乎是通過VFS的inode來解決的……

至於許可權似乎只在Linux里生效(這個我明天再看看)

11. 支持cgroup (?) 至少看起來在支持

12. 看起來TmpFs不是memdisk

13. 能(有限度地)通過傳統的Linux手段訪問一些硬體

比如mouse0啥的……

14. pipe通過一個特殊的fs實現,在內存里開一段空間交換數據

15. 對了,我個人認為這不算是API的翻譯,因為win32和linux的進程空間是相對隔離的。。他們共享的層次相對是比較低。

待更新……


再也不用吧Git Bash的bin目錄加到PATH里去了。


====

強勢插入硬廣!!!!!

招聘搜索引擎開發! java, 分散式文檔索引. 熟悉Lucene,Solr,ElasticSearch,懂NLP優先!

外企, 傳統軟體公司(非互聯網公司), 有期權. 坐標北京知春里! 經歷符合且有興趣投崗的私信我! 記者就免了... 回答不過來這麼多問題, 問我技術類問題我也不懂, 上面的幾個名詞我都不懂, 我只是抄我收到的郵件而已! 我就是個獵頭而已, 不要對我要求太高哇!

====

終於有時間看看這個玩意了. (我沒看發布會, 我就是來胡說的.)

我記得之前知乎上有大v軟粉說微軟刻意把命令行做的又丑又難用, 是因為他們不希望用戶繼續用命令行.

我表示贊同, 顯然這次引入一個bash也是為了讓用戶都不用bash.

講真我也是從媒體上看到這個的. 然後公司內部發了一封郵件, 裡面有個FAQ, 但是郵件中同時說到裡面有些內容還是不能公開的, 所以我也無可奉告.

然而我說無可奉告你們又不開心, 那我還是胡扯幾句好了:

1. 這是拉攏開發者. 普通用戶想要bash嘛? 我妹子都不知道bash是啥.

2. 這貨野心蠻大, 第一步是要通過LTP. LTP是啥? 是SuSE啊, redhat啊用來測試他們的企業級發行版的測試套件. LTP的測試結果大家都蠻重視的. LTP裡面有一個syscall的testset, 基本涵蓋了linux下重要的syscall. 如果說LTP都通過了, 那麼蠻多應用都應該是能跑起來了(不要GUI的那些).

3. 微軟想要一個ubuntu還是蠻容易理解的. 畢竟azure上跑著眾多的ubuntu虛擬機, 虛擬機裡面得跑程序啊. 程序得有人開發啊. 為了給azure上寫程序得開個ubuntu虛擬機顯然不合理啊.

4. 啥時候支持一下gnome或者kde啊? : 沒戲

至於對ubuntu來說是不是損害自身利益了:

並沒有啊... Canonical是最沒有"黨性"的發行版公司. (Redhat也好, SuSE也好, 都是黨性比較濃的, 你們看那個瑪麗蘇每次噴ubuntu的時候的憤怒的口吻也能感覺到...)

給我的感覺是, Canonical希望的是讓更多的人用上更趁手的工具. 而不是盲目的遵守unix哲學或者盲目的追隨GNU社區. (你們看最近阻礙emacs發展的毒瘤是誰就知道了啊...)

桌面是個很難競爭的領域, 比移動端還難競爭, 為什麼呢? 大家用了那麼多年windows了, 盜版windows和正版windows分別佔據桌面os的前兩名, 其他廠商想插針還是很難的. 所以老闆們現在要布局的是雲和IoT. 無論是有錢精明的大公司巨硬/Intel/18摸也好, 還是渣渣弱爆的窮鬼公司Canonical也好, 都在部署這些東西. 在以前, 如果一個windows的開發者需要開發程序並最終跑到雲端的linux上, 那麼他可能需要從眾多linux distro裡面選擇一個裝到虛擬機里作為開發環境. 而現在, 不用選了, 直接用windows上原生的ubuntu就好. 看, ubuntu避免了跟其他distro競爭, 直接獲取了用戶. 既然開發者開發的時候都選擇的是ubuntu, 那麼在雲端系統的選擇上當然也是要選最熟悉的ubuntu了. 這一點是大果子做不到的, 畢竟哪個雲端的虛擬機里跑得是大果子的系統呢? 開發者還是要在mac下給linux/win開發軟體.

至於上層工具下面的內核是NT還是Linux, 講真, 這些留給黨性發行版去考慮吧.

;; 早知道我就不看FAQ了, 不看的時候什麼都敢說, 看完了之後這也不敢說那也不敢說的...

如果過兩天心情好, 我更新以下內容(不過估計也沒人願意看我胡扯吧...):

1. 如果要用ruby, 是用ruby for windows呢, 還是要在ubuntu on windows下跑ruby呢?

2. 如果想跑redis呢?

3. 如果以後想給妹子修電腦, 可不可以扔個bash script腳本給妹子, 妹子執行一下就解決了呢?

- 這個問題我現在就要回答!!! 理論上是這樣的, 如果問題是通過對文件的操作就能解決的話, 那麼一個bash script就能輕鬆解決了!!!!

- 那麼, 今天的重頭戲出來了!!! 我要學某當開始收徒教受基本的shell編程入門技術. 不要1萬快, 不要拜師禮, 只要5毛錢!!! 五毛錢你買不了吃虧也買不了上當!

4. 性能如何?

-- 硬廣時間到, 招c/c++開發, 外企, 快上市(某大型外企的全資子公司). 30 - 40w可談, 有期權, 不加班, 不打卡. 工作地點北京, 要求演算法好, 基礎知識紮實, 懂分散式加分, 懂資料庫常見演算法加分. 如果人不在北京可以遠程面試. 歡迎自薦. (想來的再聯繫我啊, 不要一上來問這問那等我都回答了就不說話了啊... 我當個獵頭也不容易啊...)


Hi Linux, hi Cygwin, Live long and suck it.

很顯然,這不是虛擬機,也不是container,是原生跑ELF。我在這個答案里提到過 Windows10中的包含Linux子系統是否違反了GPL? - 叛逆者的回答; 這用的是clean room實現的linux內核。

Astoria的遺產放光芒。

又想到了另一個好處。每個程序是個窗口,所以當你不知道怎麼關掉vim的時候,關窗口就行了。。。


@vczh 以後Office就不用發布Windows版的了,只發Mac/iOS和Linux/Android就好(逃


我是不是有點過分, 想要oh-my-zsh

更新日誌

5:42:00 8/8/2016: 添加標點


windows平台ocaml開發者的福音!


等了好久,個人覺得微軟早就該這麼幹了,Powershell太難用了。現在為了兼顧bash shell和依賴win的一些開發程序,用的是MacBook+PD11,非常佔資源。

剛才在台式機上安裝了win10的insider preview版本然後從商店下載了bash beta,試了下apt-get命令和LaTeX編譯功能。值得一提的是,這個bash是自帶Python 2.76和Python 3.43的。

這個所謂的subsystem雖然不是虛擬機,但是用起來跟虛擬機上面跑Linux沒有太大區別,就相當於win下面跑了一個獨立的Ubuntu。雖然win下面的程序都不能直接調用,但是完全可以當做一個完整的bash shell來用,大部分的開發需求都可以滿足。

我相信等正式版發布之後,很多人都不會再用虛擬機,很多因為bash shell想要買Mac的人也會猶豫一下了。


終於可以不需要裝OSX來移植GacUI到OSX上了,好方便


1) 沒有用戶就沒有開發者,2) 沒有開發者就沒有App, 3) 沒有App就不會有用戶願意買你的系統。

這個雞生蛋蛋生 的問題已經在WP上出現並至今無法解決。微軟最害怕的就是同樣的情況出現在Windows上,如果是這樣,整個微軟帝國會轟然倒塌的。而從最近幾年開發者的趨勢來看,這個已經出現,所以,微軟希望通過各種方式來扭轉目前的形式。

為解決#1, 微軟的策略是Win10免費,微軟希望3年內把Win10變成一個10億用戶的平台,目前8個月2.8億用戶,只能算一般,應該比當初期望的要差,需要繼續推進。

為解決#2, 微軟開始擁抱開源,大力發展雲計算,收購Xamarin, 包括在Windows平台上兼容Linux,都是希望開發者能夠留著Windows平台上,畢竟微軟還有Visual Studio的優勢在這裡

我始終認為這麼做是對的,現在需要的是執行力,加快迭代速度,盡量不要像以前那樣反覆,或者提供一個半成品。如果這些能成的話,微軟未來還是很看好的。


差點高潮,差點暈倒。

Microsoft is bringing the Bash shell to Windows 10

"Microsoft noted that this will work through a new Linux subsystem in Windows 10"

"The native availability of a full Ubuntu environment on Windows"


如果能直接從 windows 上調用這一部分 app 就好了。。。僅僅只是 command line 我覺得是極好的,如果能從 windows 上直接調用這些,真的就是要爆了。。。再支持個 gui。。。啊啊啊啊啊啊啊(畢竟我更喜歡用 gvim = =,相信用 emacs 的也是沒有人用 command line 的 emacs 的吧。。。其實不過想想 macvim 也是原生的 mac app。。。whatever。。。

想想之後我可以直接從 gvim 裡面用 Linux command,就不用到處找各種 「windows user please click here」 了。。。然後 clion 也不會到處讓我找 Cygwin home,然後缺了這個 binary,缺了那個 binary 的,挺煩人的 = =。

僅僅有一個 command line 也是極好的,尤其是對於我這種 Linux 轉到 windows 的人。。。之前一直想寫一個 powershell 的 tab completion plugin,現在也可以省省勁了。真是太好了

說實話,我覺得 powershell 比起一個 shell 來說更適合做 scripting tool,因為可讀性強,然後語法清晰,但是真的很慢,作為一個 script,你本來就是要做一堆事情的,開始慢個兩秒沒人在乎,但是如果我每次 cd,每次 ll(我習慣用 ll 替代 ls)都要慢兩秒真的很煩人。。。(加上 posh-git 更慢了= =)

總的來說是一件好事,但是可以更好,就是如果能夠完全和 windows 環境交互就好了,比如在 zsh 中打開 notepad,gvim 之類的,然後可以從 clion 中調用 Linux 環境就好了。。

現在想起來 gui 支持完全沒有必要,(畢竟 Linux 上的 gui 天天不停 crash= =


不說了,這次立刻升級Win10


嗯,以後再看到有人因為*nix shell吹OS X的可以上去正面幹了


我整理一下自己用WSL的幾點體會和看法

1)windows下的IDE無法整合WSL

我覺得作為開發環境很重要的一點就是win下的IDE們不能「方便」地直接調用WSL下的程序,比如在vscode下面不能調用WSL里的git,而非得裝個git-bash。更別說IDE里直接調用WSL裡面的python,node,go了。

根據微軟最新build中(https://blogs.msdn.microsoft.com/commandline/)提出的互操作,重點似乎在WSL側調用windows程序,他們已經把win下的path都append到WSL的path了,但在windows側則不可見WSL的path,只能通過蹩腳的bash -c 去調用。

在微軟自己都沒有搞清楚兩者互操作關係的前提下,就會有各種類似於這樣的問題:用xxx-for-win還是用xxx-on-WSL?

若只在WSL側裝工具鏈,windows側的IDE就是殘廢成只能做編輯器了,你用的win下的工具鏈怎麼測linux下的bug,怎麼加斷點調試?

2)WSL閹割GUI硬傷導致不具備高效的開發環境

不僅互操作不行,在WSL裡面開發體驗也是很糟糕的。

之前盛傳的在windows下用xserver運行Ubuntu桌面程序的視頻也是反映了開發者對缺乏GUI支持的訴求。

3)WSL定位究竟是開發環境or生產環境?

甚至我覺得微軟的表述是自相矛盾的,他說WSL是面向開發,但無論怎麼看沒有GUI的Ubuntu更像是一個部署環境,而不是開發環境,沒有IDE的支持怎麼調試怎麼開發呢?而且按照現在的完成度,只是個玩具。

4)關於WSL未來的一點想法

1.微軟絕對不會放棄windows下工具鏈的支持

2.WSL短期內不能取代windows下工具鏈,至少從IDE支持度上差距很大

3.微軟的目前的所有動作看起來都似乎表明WSL的真實目的是讓linux開發者用dotnet和SQLserver,也就是把linux的開發者拉過去,而不是把windows的開發者推出去。


一大波開著虛擬機做交叉編譯的人會把虛擬機刪掉,一大波優雅地用著macbook寫web程序的人也會悄悄裝個win10看看

話說,google在下個月的google io 2016上發布一個桌面android,自帶原生linux環境,可運行android studio也說不定哦


期待後續的相關評測。

不過給了我又一個從Mac換到Windows的理由。

(曾經用過Cygwin…… It sucks!)

話說我聞到了vim/emacs大戰的味道啊…

IDE(VS/Jetbrains)+Sublime Text黨表示默默圍觀(滑稽)


看不懂那些說打os X和 linux臉的,巨硬自己往類unix身上靠,怎麼反成打人家臉了。

打臉也要按基本法的


推薦閱讀:

TAG:MicrosoftWindows | Linux | Shell編程開發 | Bash | Build2016 |