Bash on Windows 實際體驗如何?

Ubuntu on Windows 是真來了。 Build 14316。

Announcing Windows 10 Insider Preview Build 14316


14971 版本更新部分內容。目前基本日常使用沒什麼問題了,ltrace、valgrind、fakeroot、fish 等命令不正常。

另外值得一提是 14965 以上版本支持運行 Windows 軟體了。

內容比較亂,以後可能再整理一下。

試了一下,先放結論:

主要問題是使用 ncurses 的程序顯示不正常,依賴 pty 的程序也幾乎無法運行,中文支持很不好,cmd 本身也不好用,現在可用性還比較差。

性能上比 Cygwin/MSYS2 有不小的提升(提升百分之幾十到一倍),但創建進程的慢的問題依然存在(啟動一個 /bin/true 的時間是 Linux 下的十倍多,但其他命令沒有這麼大的差距),文件讀寫的性能和 Linux 比也有百分之幾十的差距(不確定,需要在實體機測試)。日常使用時注意下應該影響不大(注意不要用 shell 的輸入語法高亮或者複雜的回調命令,寫腳本時盡量避免啟動太多進程),但編譯軟體的耗時可能是 Linux 下的數倍。

不建議非發燒用戶體驗這個版本,希望下個版本會解決這些問題。

放張安裝時的截圖:

文件目錄:

部分問題:

zsh 有不明原因報錯,功能部分可用。(14342 版本正常了)

bash 基本沒問題,ctrl-a 用不了。(14328 版本 ctrl-a 可用了)

sshd 不正常,dropbear 也不正常,分配 pty 失敗。(14971 版本 sshd 正常了。14367 dropbear 正常了。)

ps 正常,ps aux、ps -ef 用不了。(14328 版本 ps aux、ps -ef 都正常了)

ping、dig 用不了。(14367 dig 正常了。14971 ping 正常了)

ifconfig、ip 等網路配置相關命令用不了(14971 可以查看網卡信息了)。

ncdu 基本正常,顯示有些不正常。(14342 版本正常了)

man 往回翻頁不正常。(14342 版本正常了)

percol 基本正常,有時顯示混亂。(14342 版本正常了)

less 往回翻頁不正常。(14342 版本正常了)

git 基本正常,類似git log分頁顯示的地方不正常。(14342 版本正常了)

tig 基本正常,有時會顯示混亂。(14328 版本正常了)

golang 用不了。(14328 版本正常了)

df 用不了。(14367 正常了)

top、htop 用不了。(14328 版本 top、htop都正常了)

chroot 用不了。(14971 正常了)

中文顯示有問題,顯示不全。(14971 正常了)

無法輸入中文。(14971 正常了)

許可權控制無效,chmod 只能修改 ls 顯示結果。(14367 正常了)

當然也有好的方面:

可以在 cmd 里直接用 bash -c 運行命令。

可以監聽低於1024的埠。

ssh client 正常。

gcc、g++ 編譯簡單程序正常。

速度上感覺沒問題,沒做性能測試。

基本上不使用 ncurses,不涉及驅動層面的程序(比如 coreutils中的大部分、awk、sed、grep等)沒問題。

非掛載的目錄(/mnt/c 等),可以創建僅大小寫不同的文件。但在外邊訪問只能訪問到其中的一個文件(我這裡試驗是的在裡邊創建 a 和 A 兩個文件,ll -i 看 inode 是不同的,在外邊訪問 a 和 A 都是訪問的 A)。

直接把根目錄換成 Archlinux 的,可以用,換之後 df 、ifconfig 命令正常了,ps 命令不正常了。但因為根分區掛載的選項是 ro 的,pacman 裝不上包,因為沒有 /dev/fd,makepkg 沒法工作。但由此可見換任何發行版都是可以的。

性能方面:

運行機構簡單腳本,和 MSYS2 以及 Virtualbox 里的 Archlinux 比較下。

因為 MSYS2 主要的性能問題出現在大量 fork 新進程的情況,先試試這種場景。

$ cat test1.sh

#!/bin/bash

for i in {1..10000};do

echo abc &> $i

done

先運行幾次後再測時間。

MSYS2:

goreliu@my-pc ~/t

$ time ../test1.sh

real 0m2.329s

user 0m0.437s

sys 0m1.874s

goreliu@my-pc ~/t

$ time ../test1.sh

real 0m2.268s

user 0m0.453s

sys 0m1.781s

goreliu@my-pc ~/t

$ time ../test1.sh

real 0m2.264s

user 0m0.390s

sys 0m1.796s

Bash for Windows:

root@localhost:~/t# time ../test1.sh

real 0m0.969s

user 0m0.141s

sys 0m0.828s

root@localhost:~/t# time ../test1.sh

real 0m0.984s

user 0m0.141s

sys 0m0.844s

root@localhost:~/t# time ../test1.sh

real 0m0.984s

user 0m0.109s

sys 0m0.875s

Archlinux in Virtualbox:

[goreliu@my-pc-linux t]$ time ../test1.sh

real 0m0.950s

user 0m0.013s

sys 0m0.910s

[goreliu@my-pc-linux t]$ time ../test1.sh

real 0m0.985s

user 0m0.023s

sys 0m0.917s

[goreliu@my-pc-linux t]$ time ../test1.sh

real 0m0.969s

user 0m0.023s

sys 0m0.920s

比 MSYS2 快了一倍多,和 Archlinux in Virtualbox 基本一樣,提升明顯。

單獨測下啟動進程速度:

$ cat test2.sh

#!/bin/bash

for i in {1..1000}; do

/bin/true

done

MSYS2:

goreliu@my-pc ~

$ time ./test2.sh

real 0m13.466s

user 0m2.918s

sys 0m7.981s

goreliu@my-pc ~

$ time ./test2.sh

real 0m13.005s

user 0m2.857s

sys 0m8.174s

Bash for Windows:

root@localhost:~# time ./test2.sh

real 0m6.813s

user 0m0.141s

sys 0m6.766s

root@localhost:~# time ./test2.sh

real 0m6.813s

user 0m0.234s

sys 0m6.578s

Archlinux in Virtualbox:

[goreliu@my-pc-linux ~]$ time ./test2.sh

real 0m0.605s

user 0m0.007s

sys 0m0.127s

[goreliu@my-pc-linux ~]$ time ./test2.sh

real 0m0.596s

user 0m0.007s

sys 0m0.123s

[goreliu@my-pc-linux ~]$ time ./test2.sh

real 0m0.622s

user 0m0.033s

sys 0m0.110s

比 MSYS2 還是快了一倍多,但還不到 Archlinux in Virtualbox 的十分之一,啟動進程慢的特點依然存在。

在網上隨便找一個 python 腳本試試(排版亂了,原地址 pypy提升pyhton腳本的執行速度及性能)

import time

#http://xiaorui.cc

#rfyiamcool@163.com

def test(n,m):

m=m

vals = []

keys = []

for i in xrange(m):

vals.append(i)

keys.append("a%s"%i)

d = None

for i in xrange(n):

d = dict(zip(keys, vals))

return d

if __name__ == "__main__":

st = time.time()

print test(1000000,100)

print "use:", time.time() - st

MSYS2:

兩次結果是

use: 10.6651120186

use: 10.3868601322

Bash for Windows:

兩次結果是

use: 8.01983714104

use: 7.75542211533

Archlinux in Virtualbox:

兩次結果是

use: 10.1743168831

use: 10.2496631145

比 MSYS2 和 Archlinux in Virtualbox 都快了 20% 左右。

有時間再試試別的。

運行圖形界面軟體,可以參考:

https://www.slightfuture.com/how-to/x-on-wsl

如果想測試其他功能,可以在下邊回復。


這個「保保留留所所有有權權利利。。」是什麼鬼……

瘋狂動物園的樹懶梗嗎……Orz


微軟於今天發布了Windows一周年版(RS1,1607版,10.0.14393,版本名真多),其中我感興趣的就是Bash On Windows這個功能了,這個就是Windows內嵌了一個Linux子系統,只不過目前還是beta版,所以和原生的Ubuntu功能上有些缺陷,不過大部分軟體都是可以正常使用的,啟動這個功能的方式網上一大堆,這裡就不再贅述了。只是有個小坑,開啟bash功能後,需要在cmd或powershell里輸入bash,它會下載一個鏡像文件完成初始化工作,此時它會提示「正在從 Windows 應用商店下載...」,如果你在用一些小運營商的寬度,會立即顯示「無法從 Windows 應用商店下載。請檢查網路連接。」,然而我打開應用商店卻能正常下載應用啊。

而事實上它並不是從Windows應用商店上下載的,而且通過訪問這裡,跳轉到微軟的一個CDN上,而這個CDN並沒有國內節點(我寫這篇文章的時候,微軟已經把那個鏈接跳轉到Ubuntu網站了,然而依舊沒有國內節點),所以你懂得,而解決辦法也很簡單,給IE設置個代理就可以了,這個包大小為180.02MB,而且微軟的下載機制沒有考慮到斷點續傳,so有一點網路波動,你就得重下(我不會告訴你我下了十幾次,真坑啊)。

換源

之後你從cmd或者ps里輸入bash就可以進入Linux子系統啦,後面的操作就和你用ubuntu一模一樣,比如你用ubuntu一般都會換源的吧,默認鏡像是14.04的,你按照同樣的方法就可以換源了。(其實你直接通過修改sources.list就能從14.04升級到16.04了,不過我在BashOnWindows的issue里看到有人升級會出問題,雖然有解決方法,但是我感覺微軟工程師應該是基於14.04進行開發的,所以建議沒必要不要升級大版本,除非微軟推送鏡像包)

sudo sed -i "s/archive.ubuntu.com/mirrors.163.com/g" /etc/apt/sources.list
sudo sed -i "s/security.ubuntu.com/mirrors.163.com/g" /etc/apt/sources.list

取消系統提示音

如果你進入shell沒有輸入認識內容,直接按回車,就會觸發系統提示音,反正我覺得這個聲音聽起來挺煩的,你可以輸入

sudo echo "set bell-style none" &>&> ~/.inputrc

但是這個不能取消掉VIM里的提示聲,你可以選擇關閉系統聲音,按照如下步驟:打開控制面板——&>打開硬體和聲音——&>打開聲音——&>選擇聲音——&>修改關鍵性停止的聲音方案,來取消提示音。

美化

如果你以後經常用這個子系統,那麼肯定不能忍受cmd的字體和配色,我之前用cygwin時喜歡用cmder,但是cmder和bash.exe不兼容,如果你直接輸入bash,那麼進入子系統後將無法使用方向鍵和Home/PageUp/PageDown等鍵,需要輸入下面的命令進入bash

%windir%system32ash.exe -cur_console:p1

你可以把這個命令加入cmder的啟動項里

我個人習慣用zsh了,而進入這個子系統必須先進入bash(這背後一定有交易,手動滑稽),所以啟動項里多了個zsh的切換命令。

PS:這個子系統的文件系統和Windows是融合的,進入bash後默認路徑為你的用戶文件夾內(/mnt/c/Users/Shura),所以你每次下載時確保當前目錄在home目錄(~)下,否則你可以會發現你把文件下載到Windows分區里了-XD

8月7日更新

感謝 @Snapsisy的方法,輸入bash ~即可從~啟動bash,不用再切換目錄了。

%windir%system32ash.exe ~ -cur_console:p1

最後Show一下

Bash On Windows beta版食用筆記,新手寫文章,語言組織能力不行,請大家見諒。


已經跑起來了 xeyes,wine 還沒裝好,坐等有人比我先搞出 IE6 on wine on Ubuntu on Windows 來。


看來 MS 要長期堅持這種 "畫個大餅,扔個 pre alpha 級別的東西給你們玩,最後能不能實現看內部政治鬥爭" 的路線了


0、這個App的名字叫「Bash on Ubuntu on Windows」,我就不吐槽了。

1、pty顯然沒做完/好,screen tmux之類不能用,sshd也受牽連

2、估計還是terminfo的問題,ncurse相關的程序很多不太正常,比如zsh報錯,但vim和emacs目前看起來正常。

3、procfs不完整,ps和top的輸出都有問題,而且Linux子系統和Windows是隔離的,看不到Windows的進程。

4、kernel的版本是「3.4.0+」,不知道是什麼玩意兒。

5、fork應該是專門搞的,不像Cygwin那樣模擬的,速度明顯加快很多,接近原生Linux的速度。

6、現在倉庫里的包是trusty的,都有點老了,不知道過陣子會不會升級到xenial。

7、OpenJDK7和Oracle JDK8都可以運行,但沒有仔細測試,不知道有沒有什麼潛在問題。


隨便寫點,隨便更新

icmp 全掛,於是 ping mtr 均不行

raw socket 有問題,proxychains 無法對接 Windows 下的 socks 代理,當然也別指望自己跑 ss-local

可以訪問本機的 http proxy,但 proxychains 一樣無法中繼,原因未知

可以訪問 Windows 下的 web server

無聊試了下在這東西上裝 Ros(Robot Operation System)

安裝過程一切順利,預料之中的 roscore 無法運行,目測還是 raw socket 的問題,其他純終端命令看起來沒啥異常,但我也沒試能不能連到遠程的 ros master 上去,rviz 之類因為沒有 x server 肯定是沒辦法跑起來的。

另外有個無關功能的問題,bash on windows 在 任務管理器里是完全看不到具體的進程的,但資源管理器里能看到疑似使用資源的進程,具體 pid 在任務管理器里不可見。如果正式發行還是這樣子的,跑日常程序還是有點坑。。


和預期的一樣, tty 子系統(估計也包括 termios )是殘廢的(表現為基於 ncurses 等複雜的 Terminal UI 程序行為不正常,以及一系列「無法獲得pty」之類的 bug ),不過這不能全怪微軟——這玩意兒是個大坑,算是 UNIX/Linux 的歷史包袱。

感興趣的人可以看看這篇文章:

The TTY demystified

以及這個系列:

https://blog.nelhage.com/2010/01/a-brief-introduction-to-termios-signaling-and-job-control/


挺好的,很漂亮,給人耳目一新的感覺,從來沒有用過這麼漂亮配色的CMD呢

右上角是執行了top之後就bug了,還有其他很多bug前面也有很多回答了

我真的不關注這個東西的可用性,我只關注windows是如何以native方式載入執行ELF格式的可執行文件的。

當你enabled 了這個feature之後,windows會把一份Ubuntu的鏡像存放在你的這個目錄下,lxss,這裡面就是整個liux子系統的文件系統了,不同的是這些文件實際是以NTFS的磁碟格式存放的,這裡面是ELF格式的可執行文件哦

當然你執行的時候,這些文件並不是以可執行代碼存在於一個進程的內存空間的,而全部是以文件資源的形式被system進程載入的

所以中間還是存在一層執行轉換的,看一下本機安裝的elf的格式

我的機器是64位版本,這裡看到安裝的elf文件也是對應架構的,所以這裡可以看出執行轉換的模塊要進行的轉換過程中應該不會存在指令集轉換,對執行效率有貢獻。

至於如何在system進程裡面管理這個linux子系統的虛擬進程等資源還沒來得及細看啊,畢竟現在老了,上IDA都累的吭哧吭哧的。

總之還是很不錯的,現在的各種bug問題後續應該會能夠解決的。

Windows的系統整體架構是非常清晰簡潔的,MS想要兼容一個現有系統,只需要做個兼容目標的subsystem,然後往自己的子系統層一插,這個過程只需要做對硬體管理的介面層,對於subsystem內部,對用戶層介面按照原系統全部原封不動,然後做一下這個目標subsystem對硬體資源訪問的適配,憑藉windows kernel的架構,做這些適配對MS來說輕而易舉,對於安卓這種系統更是無需大傷windows系統的本身元氣。

Windows 10意圖已經十分明顯了,不管你要為什麼操作系統進行開發工作,IOS,Android,Linux,OSX等等等,windows 都能作為你的開發平台,提供比你原生的開發工具鏈體驗更好的開發工具鏈,不求一統天下,但是我就要作為你的生態鏈上的基礎生產力的一環,不怕對手壯大,只管做好這個,吸引開發者,那windows的目的就達到了。


0x00

用戶態存在 init 和 bash 進程

開了倆 bash,所以有兩個

ps 得到的 pid 和 windows 自身的 pid 不一致

0x01

TCP 和 win32 是一致的?

0x02

線程也是用的 NT 那一套?0x03

順手 apt-get update apt-get upgrade 了一下,udev 安裝失敗

提示錯誤內容是

initctl: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: No such file or directory

0x04

文件許可權,在 rootfs 下的文件存在許可權設置,甚至 s 標誌位都支持了

但是 Windows 下看不出區別

大概是寫入 NTFS 的 meta 里去了?

0x05

無法在普通 shell 中運行

`C:WindowsSystem32ash.exe` 算是一個載入程序,`C:UsersUSERAppDataLocallxss
ootfsinash` 是真正的 bash。不會 dump exe,誰來看下這個 loader 都做了哪些工作?

0x06

無法把文件直接粘貼到 rootfs,得從 /mnt/ 拷貝,大概是因為沒有帶上 meta?0x07

為了一探究竟,搞了個 nfi.exe 亦可賽艇

hello.txt 在 lxss 下可見,test.txt 不可見,不熟悉 NTFS metadata,但是看到有 EA_INFORMATION 和 EA 這兩項是獨有的,找一個引用(ftp://ftp.kolibrios.org/users/Asper/docs/NTFS/ntfsdoc.html#attribute_ea_information):

Used to implement under NTFS the HPFS extended attributes used by the information subsystem of OS/2 and OS/2 clients of Windows NT servers.

0x08

好像不支持 ipv6?

0x09

有時候 apt 會提醒有更新包,什麼時候檢查的?

0xff

中文似乎正常?


因為VirtualBox 5.0.16 在Windows 10 build 14257 之後的所有版本都不能用,沒法在Linux 下開發就一直沒升級。聽說14316有了bash,決定試一試,反正有Linux 環境, VirtualBox 能不能用也無所謂了嘛。

微軟給我搞得這個東西啊,Excited

裝!

圖標蠻萌的

主要是開發Django 的Web站,首先,apt-get 能用,python-virutualenv 無壓力,g++工作正常,需要編譯的Python 包都能夠安裝成功。

然後打算試試SSH,私鑰不想複製想做符號鏈接鏈接過去,首先找到根文件系統在操作系統下的位置

C:UsersComzyhAppDataLocallxss

LXSS 應該就是LinuxSub System 的意思吧,裡面內容不多,只有/home, /root, /temp

我其實挺奇怪別的東西跑哪裡去了,這個一會再說。

創建符號鏈接:

已經找到/root 了嘛,然後再windows 下 mklink /D 創建.ssh 的鏈接成功是成功了,但是在Linux 下根本看不到,於是嘗試

ln -s /mnt/e/.ssh .ssh

成功是成功了,但是Linux 子系統雖然能操縱mnt下的文件,然而並不能修改普通分區下文件的許可權,所有在/mnt 下的文件許可權都是700,導致 id_rsa 不能設置為 600,遂放棄

不過發現了,在Linux 子系統的/root 下操作,是能夠正常建立符號連接的,而且許可權什麼的不是我想像中的777,什麼許可權都可以有,不過符號鏈接只有777

可以看到有兩個符號鏈接,文件夾和文件都可以鏈接,這是怎麼實現的呢?

去windows 用資源管理打開lxss 文件夾看看

能看到兩個東西都是普通文件,打開看看就是純文本,內容就是鏈接內容

至於文件系統方面怎麼做到的,猜想是用了 NTFS 的 MFT 標記了許可權?

Unix Socket

目前觀察到的似乎不支持UnixSocket ,所以service,supervisord等默認使用unix Socket 通信的東西都沒法用

Zsh

zsh 能用apt-get安裝,但是似乎沒法用。

根文件系統剛才提到根文件系統在哪,發現其實也在lxss 下,只是被隱藏了

C:UsersComzyhAppDataLocallxss
ootfs

還是不小的

其實lxss 下有很多內容的

比如 /var

許可權,符號鏈接都不是問題

開發

因為許可權,符號鏈接都不是問題,VirtualEnv也能在lxss下正常工作,所以在/root 下建立virtualenv 然後再Windows 下編輯代碼執行毫無壓力

啟動個Django

Prefect,不過效率明顯比Vagrant 慢,按說M$ 自己出的東西,文件系統效率不能比我在Windows下折騰Winnfsd 起NFS 再慢吧,不過還真是慢

當然,WinKey + R 輸入bash 這速度不知道比啟動個虛擬機不知道高到哪裡去了。

總結

總之還是非常好用的,就是M$字元界面是在是太丑了,我換錯字體之後還換不回去了。暫時只能這麼丑著。

另外VBox 5.6.17 可以正常泡在 14316上了,4月4日更新的,下載請戳Testbuilds a€「 Oracle VM VirtualBox


在用apt-get裝default-jre的時候手賤默默開了另一個bash試了一下fork bomb,然後jre安裝炸穿了現在不知道怎麼修復。。

後續:聽從建議完全卸載了Ubuntu子系統然後又重新下載安裝了一遍,其它的編譯器比如g++安裝正常,Java的jre安裝又出現了和之前一模一樣的錯誤。看了一下Java Jre安裝過程需要用到/proc裡面的東西,然而看到其它回答說/proc功能不完整,所以看來可能本來就裝不了。


我的win10聽說我不用cmd了,被嚇死了...從此,磕巴了..


不知道Ubuntu真機是什麼情況,反正Bash On Windows使用apt-get的時候不科學上網就沒辦法下載任何東西,我費了好大勁才把g++裝上

另外在Appdata的Lxss文件夾里可以直接訪問到root目錄,換句話說可以不用Vim寫代碼……

現在我在寫我司新版C++課程,於是我終於可以名正言順地公開安利Win10了233333

唯一的問題就是現在的RedStone最近兩個版本升級之後Office的激活都會出問題,不然我就直接把它當成主系統來用了,然後就再也不需要Linux虛擬機了……

另外不知道什麼時候它能跟Visual C++ For Linux結合起來

個人感覺以後Linux伺服器開發可以直接告別OS X了——兩者在內核上的差別姑且不談,至少Subsystem是受到微軟和Cartonical的官方支持的,而蘋果對於開源工具鏈向來是「你們的死活我一概不管」,OS X每次更新都會導致Homebrew之類的東西一下子掛一片,要是再像El Capitan一樣搞出個SIP之類的東西那就更麻煩了……


很慚愧,我只用來git。。。

但是就目前的使用來看,基本能正常使用

另外安利一下:cmder+bash很不錯

對於我這種只用來git的,當然是要在當前路徑了呀,所以直接把Startup配置為

cmd /k "%ConEmuDir%..init.bat" -new_console:d:%USERPROFILE% bash

就ok了,也就是在「cmd::Cmder」加個

bash

------------------------更新一下--------------------------------

現在我很推薦的是用 wsl-terminal 而不是cmder,可以看這篇文章的介紹進入 WSL(或者說 Bash on Ubuntu on Windows )環境的多種方法比較


安裝了,爽了十分鐘。然後發現本地中文名稱的目錄只顯示了兩個字(全名是四個漢字),然後又發現不能輸入中文(也就無法進入中文目錄),就刪掉了。

大概因為是beta版吧,很多命令還不能使用,比如ifconfig,所以刪掉,繼續用我的樹莓派,還有虛擬機


/proc 實現不完整,w用不了,top無法正常使用


你知道雞肋嗎……

比它強一點點


建議 Web 前端還是不要升級了

Bash for Windows 自帶的 NodeJS 還是 0.10 的,npm 還是 1.x 的。我升級到 NodeJS 5.10.1,npm 3.8.7 後,fs 模塊實現有問題,無法打開文件,導致基本的命令行都運行不起來了。

這個問題很嚴重,也不知道 M$ 什麼時候能修好。

=============== 更新趟坑日記 =================

通過 compiling - How do I install the latest version of node.js? 的 node 安裝方法,找了個 node 源,搞定了 fs 的問題,node 版本是 5.10.1,npm 是 3.8.3。

難道老版本可以用,新版本就不行了?!

繼續趟坑中。

=============== 更新 2nd ==================

發現用普通賬號是可以執行 npm install -g 的,但是有跨文件系統問題。

給 npm 報了個 issue - npm v3 on Bash on Ubuntu on Windows is working incorrectly. · Issue #12353 · npm/npm · GitHub


不咋地,因為永遠不要忘了它還是個Windows


推薦閱讀:

Bash on Windows 10 怎麼安裝?
bash on windows程序無法監聽埠?
如何評價 Bash on Windows 已經可以運行 Ubuntu 界面和應用程序?
如何解決Bash on Windows在cmder中的中文亂碼?

TAG:微軟Microsoft | 程序員 | Linux | Windows10 | WindowsSubsystemforLinux |