[ Windows 10 ] Bash on Ubuntu on Windows

Title

「Windows 10 將可運行原生 bash」這大概是到目前為止最令我興奮的 Windows 更新了。

就我所知,部份開發者選擇 OS X 是因為 OS X 是 UNIX clone,現今許多開發環境都是來自於 Linux,選擇 OS X 可以讓建置開發環境的成本降低。而 Windows 相對來說就高很多,因為 Windows 無法直接使用那些在 Linux 上開發的開源軟體或套件,需要仰賴有志人士將程式碼改寫後製作成支援 Windows 的二進位檔案才行。不過這一切或將改觀。

Microsoft 任用 Satya Nadella 為 CEO 之後,他做下的許多決定之一就是擁抱開源社群。而這一點反應在 Microsoft 當家作業系統 Windows 10 上,就是新的 Windows Subsystem for Linux 的出現。Microsoft 協同 Ubuntu 的母公司 Canonical 製作的 Windows Subsystem for Linux 將可以讓 Linux 軟體以原生的姿態在 Windows 上運行。這個更新預計將會在 Windows 10 第一個大更新,Redstone 上出現。而 Microsoft 也將 Windows Subsystem for Linux 實裝於 6/四月/2016 釋出的內部預覽版 build 14316 中。


Build 14316 是 Insider program 的 Fast ring 測試版本。雖然之前我吃過 Fast ring 一次虧,但 Windows Subsystem for Linux 實在太誘人,因此這次我又衝了。幸好安裝後並沒有什麼奇怪的狀況。如果你想嘗試請先搜尋網路上已知的問題是否會影響你。例如說目前已知對 Xbox One 與 Hololens 的開發者都造成影響:Visual Studio 模擬器會無法啟動。

如果你想嘗試的話:

  1. 先參與 Insider program。
  2. 把你的 Windows 10 的 Insider 預覽層級調整到 Fast。
  3. 等待。不用一直按更新,此時等待一到數天不等。畢通知中心會出現訊息通知你可以安裝更新。
  4. 升級到 build 14316 後,找到 [設定] → [更新與安全性] → [適用於開發人員],選擇 [開發人員模式]。
  5. 按 WinKey + R 出現 [執行] 後輸入 appwiz.cpl 按 [Enter]。
  6. 在 [程式與功能] 視窗,點擊左側 [開啟或關閉 Windows 功能] 然後找到 Windows Subsystem on Linux (Beta) 後將之打勾,按 [確定]。
  7. Windows 會要求你先重開機。
  8. 重開機後登入桌面,按 WinKey + R 出現 [執行] 後輸入 bash 按 [Enter]。
  9. 會出現一個文字視窗,有一些警告標語,按 Y 再按 [Enter] 下載安裝必要程式。
  10. 安裝完成後,按 WinKey + Q 輸入 bash 即可搜尋到 Bash On Ubuntu On Windows。

目前初步進行過一些測試。

  • 一開始的身份就是 root。
  • 使用的 Ubuntu 版本是 14.04.4 LTS。
  • 初始安裝需要約 1GB 的空間。
  • 安裝的路徑在 %LOCALAPPDATA%\lsxx 。這是一個系統目錄。初期空間約佔用 1GB。
  • 啟動 Bash On Ubuntu On Windows 後,裡面看到的是 Linux 的路徑。所有本地磁碟都掛載於 /mnt 之下。
  • apt-get 可用,包含 apt-get update & apt-get upgrade 等。就跟真的在 Linux 一樣。
  • 我有試著安裝一些程式,例如 apt-get install gedit,安裝沒有問題。
  • 這個 Bash on Ubuntu on Windows 目前無法將圖形界面的需求交給 Windows 桌面渲染。例如剛剛的 gedit,如果直接運行會得到 error: XDG_RUNTIME_DIR not set in the environment. 這樣的錯誤訊息。因此需要小幫手: Xming 。這是一個運行在 Windows 上的 X Window server。安裝執行後,打 DISPLAY=:0 gedit 即可運行 gedit 。
  • /dev 下面沒有 fd 虛擬裝置,這會影響一些腳本的運作。例如 bash < <(curl -s https://raw.github.com/railsgirls/installation-scripts/master/rails-install-ubuntu.sh) 這樣的語法就會出現 /dev/fd/62 不存在的錯誤。如果有這種需求,需要改成用 pipe 往後傳遞的方式。
  • tar 解壓縮時有點問題。例如 tar xvfz rvm-1.27.0.tgz 解壓縮過程會出現無法建立 symlink 的錯誤訊息。手動建立 symlink 是可行的,但是 tar 卻不行。不知道是不是 GNU tar 的問題。
  • 有一些跟底層有關的套件無法安裝,硬要安裝上去可能會出問題,例如 udev。上面有提到 /dev 下面沒有 fd 虛擬裝置,如果你想強制安裝 udev 解決這問題,反而會造成你的 dpkg 異常。此時只能把 udev 移除。也因為這樣,需要用到這些底層套件的程式例如 wine 就無法安裝。(請不要吐槽我為什麼要在 Windows 的 Linux 子系統安裝 wine 跑 Windows 原生程式)
  • 因為 udev 裝了之後 dpkg 就會出事(會一直回傳 Sub-process /usr/bin/dpkg returned an error code 導致無法安裝套件),所以安裝套件時要注意看附帶安裝的套件中有沒有 udev,有的話就不能用 apt-get 安裝了。例如 openjdk-7-jre 就會附帶安裝 udev。
  • 有些程式執行起來怪怪的,例如 top。
  • Apache2 可以跑。
  • 因為不能用 apt-get 安裝 openjdk-7,因此從 Oracle 網站下載 JDK 1.8.0 的壓縮檔自行解開使用。光是一個 java –version 就會造成我的電腦 CPU 使用率維持在 20% 上下而且跑一分鐘都不會秀出版本資訊。因此需要用到 java 的程式例如 Android Studio 連啟動都有問題。

由於 14316 是預覽測試版,Windows Subsystem on Linux 也是新面世,所以現在充滿各種 bug 是很正常的。

另外要小心的是,如果你把這個環境玩死了,目前不知道要怎麼救回來。單純的從 [開啟或關閉 Windows 功能] 開關 Windows Subsystem for Linux 是沒用的。或許這個子系統需要的程式是從 Windows Store 下載的,但是目前應該還沒有公開連結。所以使用上小心不要做出愚蠢的操作。