標籤:canonical 配置 串連 make 資訊 bsp stat flex 支援
在今年的 Build 2016 上,微軟向全世界介紹了他們還處於 Beta 階段的 Windows 下的 Linux 子系統Windows Subsystem for Linux(WSL),它可以讓開發人員們在 Windows 10 下通過 Bash shell 運行原生的 Ubuntu 使用者態二進位程式。如果你參與了 Windows Insider 計劃,你就可以在最新的 Windows 10 年度升級版的 Insider 構建版中體驗這個功能了。
Web 開發人員們不用再苦惱所用的 Windows 開發平台上沒有合適的 Linux 工具和庫了。WSL 是由 Windows 核心團隊與 Canonical 合作設計和開發的,可以讓 Windows 10 下的開發人員們在擁有 Windows 中那些強力支援之外,還能使用 Linux 下豐富的開發環境與工具,而不用啟動到另外的作業系統或者使用虛擬機器。這絕對是一個“來自開發人員,服務開發人員”的 Windows 10 特色,它的目的是讓開發人員們每天的開發工作都變得順暢而便捷。
玩轉 Windows 10 中的 Linux 子系統
在本文中,我會展示給你一些我認為非常有趣的功能,以及告訴你一些可以讓你找到更多資訊的資源。首先,我會展示 WSL 所整合的那些主要命令(比如 ssh)是如何動作伺服器和裝置的。其次,我會示範使用 Bash 指令碼是如何以簡明的方式來自動化執行任務的。其三,我會利用極棒的命令列編譯器、一些其它工具以及對 *nix 相容的能力來玩一個輕量級的古典駭客級遊戲: NetHack。最後,我會展示如何使用已有的 Python 指令碼和其它來自網上的指令碼。
從我的第一台 286 上啟動並執行 Windows 3.0 開始,Windows 就一直是我的主要作業系統和開發環境。不過,我身邊也有很多 Linux 伺服器和裝置。從樹莓派和路由器/網關裝置這樣的物聯網裝置,到 Minecraft 伺服器,它們堆滿了我的辦公室的每個角落。而我經常要從我的主工作站中去管理和配置這些 Linux 電腦。
管理伺服器和裝置
我在我的家中運行著一台無顯示器的 Ubuntu Minecraft 伺服器,這是我去年給我十歲大的兒子的聖誕禮物,但是它已經變成了我的玩具而不是他的(好吧,主要是我的玩具)。我以前在我的 Windows 10 電腦上使用幾個用戶端來管理它,不過我現在想使用 Windows 中的 Bash 裡面的 ssh 命令列來管理它。使用類似 PuTTY 或來自 Cygwin 的 Tera Term 這樣的應用當然也可以,但是我想試試真正原生而自然的體驗也是一種不錯的選擇。Cygwin 就像是在披薩店訂購的披薩一樣,好吃,但是沒有那種氛圍。
我已經使用 WSL 中的 ssh-keygen 和 ssh-copy-id 設定好了公私金鑰組,所以使用 ssh 只需要如下簡單輸入即可:
$ ssh <username>@<server>
我還為此建立了一個別名,以便更快一些。這是一個標準的 Linux/Bash 功能:
$ alias mc=‘ssh <user>@<server>‘
現在,我要訪問我的 Minecraft 伺服器只需要在 Windows 10 下的 Bash 中輸入“mc”即可。
玩轉 Windows 10 中的 Linux 子系統
當然,同樣的方法你也可以用於任何 Linux 上的 Web 或資料庫伺服器上,甚至樹莓派或其它的物聯網裝置也可以。
在終端裡面進行 ssh 只是為了方便而已,不過當你在 shell 中工作時,如果還有類似 apt、node、Ruby、Python 等等工具時,你就有了自動化各種工作的可能。
遠程指令碼
假如說你有一大堆 Linux 伺服器和裝置,而你要在它們上面執行一個遠程命令的話,如果已經配置好公私金鑰組,你就可以在 Bash 中直接遠程執行命令。
舉個例子說,想知道遠程伺服器自從上次重啟後已經運行了多長時間了,你只需要輸入:
$ ssh <user>@<server> ‘last -x|grep reboot‘
ssh 會串連到該伺服器並執行 last -x 命令,然後搜尋包含“reboot”的一行。我在我的 Ubuntu Minecraft 伺服器上啟動並執行結果如下:
reboot system boot 4.4.0-28-generic Thu Jul 7 08:14 still running
這隻是一台伺服器,如果你有許多伺服器的話,你可以自動化這個過程。我在 WSL 裡我的主目錄下建立了一個名為 servers.txt 的檔案,它包含了一系列 Linux 伺服器/裝置的名稱,每個一行。然後我就可以建立一個指令碼來讀取這個檔案。
在使用了很多年像樹莓派這樣的裝置之後,我已經變成了一個 nano 人(在 VMS 上我是一個 LSEdit 人),下面是我用我喜愛的 nano 編輯器開啟的指令碼。
玩轉 Windows 10 中的 Linux 子系統
當然,你也可以使用 vim 、 emacs 或者其它可以用在 Ubuntu 終端上的編輯器。
該指令碼是 Bash 指令碼,要執行該指令碼,輸入:
$ ./foreachserver.sh ‘last -x|grep reboot‘
它將迭代輸出檔案中的每個伺服器/裝置,然後通過 ssh 遠程執行該命令。當然,這個例子非常簡單,但是你可以像這樣把你的本地指令碼或其它命令變成遠端。Bash 指令碼語言足夠豐富,所以你可以使用它來完成你的大多數遠端管理任務。你可以用你下載到 WSL 或遠程系統中的其它應用來擴充它的使用。
你是否需要在工作中把本地的 Windows 檔案或資源用於其它的 Linux 電腦嗎?或者,你根本不使用 Linux ?Bash 可以操作本地的 Windows 檔案或資源,還是說它就是一個完全獨立的環境?
使用 Windows 檔案
WSL 系統可以通過 /mnt/<盤號>/ 目錄(掛載點)來訪問你電腦上的檔案系統。舉個例子,你的 Windows 上的 C:\ 和 D:\ 根目錄可以在 WSL 中相應地通過 /mnt/c 和 /mnt/d 訪問。當你要把你的 Windows 下的專案檔、下載的內容和其它檔案用到 Linux/Bash 之中時這很有用。
玩轉 Windows 10 中的 Linux 子系統
顯示的兩個目錄分別對應於我的電腦上的 SSD 和硬碟:
玩轉 Windows 10 中的 Linux 子系統
這是邏輯掛載,所以當你在 shell 中使用類似 mount 這樣的命令時它們不會顯示。但是它們可以如你預期的那樣工作。舉個例子,在 Windows 中,我在我的 C 盤根目錄下放了一個名為 test.txt 的檔案,我可以在 WSL 中如下訪問它:
玩轉 Windows 10 中的 Linux 子系統
在 Build Tour 大會期間,我們要確保所有的示範都可以在沒有互連網時也能正常工作(你絕不會知道會場的網路是什麼樣子的) ,所以為了讓 Bash/WSL 可以示範 Git 操作,該示範訪問的是本機電腦上的 Windows 檔案,我在 Windows 上的 C:\git\NetHack 下設定一個本地倉庫。 要在 WSL 中進行 clone 操作,我執行了如下命令:
$ git –clone file:///mnt/c/git/NetHack
該命令告訴 git 使用 file:// 協議,並 clone 了位於 /mnt/c/git/NetHack 下的倉庫。你可以以類似的方式來訪問你的 Windows 下的所有檔案。
警示:就像在其它終端中一樣,如果你不小心的話,你可以在 Bash 中修改/刪除 Windows 檔案系統中的檔案。舉個例子,你可以像下面這樣來幹掉你的 Windows ,假如你有合適的許可權的話。
$ rm -rf /mnt/c/ [千萬別試!][千萬別試!][千萬別試!]
我之所以鄭重提醒是因為我們很多人都是剛剛接觸 Linux 命令,它們不是 Windows 命令。
這種可以讓檔案系統整合到一起的魔法來自 DrvFs。如果你希望瞭解該檔案系統的更多細節,以及它是如何工作在 WSL 中的,WSL 團隊為此寫了一篇詳細的文章[1]。
當然, 檔案系統訪問只是 WSL 其中的一部分功能而已,許多開發工作單位還需要通過 HTTP 或其它網路通訊協定訪問遠端資源。
發起 HTTP 要求
從指令碼或命令列而不是從一個編譯好的程式或 Web 頁面上發起 REST 或其它 HTTP(或 FTP)請求是很有用的。就像在大多數 Linux 發行版一樣,WSL 也包括了類似 curl 或 wget 擷取資源這樣的標準功能,它們可以用來發起 HTTP 或者其它網路請求。舉個例子,下面是使用 curl 對 Github 發起 REST 請求來擷取我個人的屬性資訊:
$ curl -i https://api.github.com/users/Psychlist1972
HTTP/1.1 200 OK
Server: GitHub.com
Date: Wed, 13 Jul 2016 02:38:08 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1319
Status: 200 OK
...
{
"login": "Psychlist1972",
"avatar_url": "https://avatars.githubusercontent.com/u/142****46?v=3",
"url": "https://api.github.com/users/Psychlist1972",
"name": "Pete Brown",
"company": "Microsoft",
...
}
$
你可以用它和 Bash 指令碼來建立一個 REST API 的快速測試用戶端,也可以用來探測一個 Web 頁面或伺服器並報告其返回的狀態。它用來從網上下載檔案也很棒,你可以簡單地重新導向輸出到一個檔案而不是在螢幕上顯示它:
$ curl -i https://api.github.com/users/Psychlist1972 > pete.json
我也是一個 PowerShell 使用者,甚至還使用 Windows 10 MIDI in PowerShell[2] 建立了一些有趣的擴充,也修複[3]過出現在特定的錄音硬體裝置上的一些檔案問題。作為長時間的 .NET 開發人員和愛好者,我經常使用和擴充 PowerShell 以滿足我的項目需求。但是 PowerShell 並不是一個可以運行所有的那些 Bash 指令碼和針對 Linux 的開源工具的地方。我希望以一種最簡單、最舒服的方式來完成這些任務,在某種意義上,這意味著我們需要在 Bash 中完成它們。
我已經一掠而過的介紹了 Bash、Bash 指令碼以及你可以在 shell 中完成的任務。到目前為止,我談論的都是有助於開發工作的那些功能。但是在 WSL 中實際的開發和編譯工作是怎樣的?我在 Build Tour 大會上示範了下面這個部分。
Build Tour 大會上的示範:NetHack
這個夏初,來自微軟的講演者們向大家示範了一些來自 Windows 和微軟雲上的很酷的開發人員新功能。作為其中的一部分,我以一種好玩的方式來示範了 WSL,而且這是一種和開發人員們相關的方式。
我個人想要展示使用 git 和一些傳統的終端開發工具,我已經寫好了 Bash 的示範程式,包括了這些基礎的東西(用 Python 和 Ruby 寫的“Hello World”),不過我還是想要更有衝擊力一些。
我回想起我在大學的時光,那時我們在 Unix(DEC Ultrix 及 SunOS)和 VAX/VMS 之間折騰,Unix 幾乎全是命令列環境。在我們學校,絕大多數使用圖形工作站的使用者只是為了在不同的視窗開啟多個終端會話而已,當然,會在案頭背景放上一張超酷的月相圖。大部分學生都是使用 VT-220 終端來開啟他們的會話(學校離波士頓不遠,所以我們有很多 DEC 裝置)。
那時,電腦系的學生們主要玩兩大遊戲:MUD (主要是 lpMUD 和當時剛出的 DikuMUD)和 NetHack[4]。NetHack 和其它的 Roguelikes[5] 類遊戲被視為曆史上最有影響力的遊戲之一,它們是許多現在流行的地牢冒險和角色扮演類遊戲的鼻祖。
NetHack 有很長的曆史,現在的它包含了來自幾十年前的幾十萬行 *nix 代碼,以及後來補充的一些代碼。該遊戲使用 curses[6] (及其替代品)作為終端互動方式,需要通過 lex、 yacc(或 flex 和 bison)和 cc(或 gcc),以及一堆其它的開發工具構建。
它是由 C 語言編寫的,並包括了一些用 Bourne shell[7] 編寫的複雜的指令碼配置功能。我覺得它是一個體現 WSL 和 Bash on Windows 10 的開發人員能力的不錯而有趣的方式。由於使用了 curses(在 Linux 和 WSL 中是 libncurses 庫),它也可以用來展示 Windows 10 中命令列視窗中的終端類比能力。
以前,在我們的分時 Ultrix 伺服器上從原始碼構建 NetHack 要花費掉我們很多時間,而現在我的個人電腦上只需要幾分鐘就可以搞定。我喜歡這種技術進步。在 Linux 或 WSL 上配置和編譯 NetHack 有容易和複雜兩種方式。為了節省時間,我們會以容易的方式來進行。
前置需求
首先,更新你的 WSL 環境,確保你的軟體是最新的。在安裝新的軟體包之前,這是一個好的做法。
$ sudo apt update
$ sudo apt upgrade
然後,安裝必須的開發工具。最簡單的辦法就是使用 build-essential 軟體包,它包括了 Linux 開發人員構建以 C/C++ 開發的軟體時所需的絕大部分程式。
$ sudo apt install build-essential
這要花幾分鐘。如果你想更加深入地瞭解,你可以分別安裝 gcc、gdb、make、flex、bison 以及 NetHack 文檔中提到的其它工具。不過如果你是一位開發人員,有時候你可能還需要一些其它工具。 build-essential 基本上提供了你所需的工具集。
然後,安裝 git。如你所想,很容易:
$ sudo apt install git
就像在 Linux 中一樣,你可以添加一個 git 的 PPA 來擷取較新的版本,不過這裡我們有一個就行了。
最後,我們需要安裝 curses(實際上是 ncurses)來進行終端螢幕互動。
$ sudo apt install libncurses-dev
當我們完成這些步驟之後,就可以開始構建 NetHack 了。
構建 NetHack
官方的 NetHack 倉庫放在 GitHub[8] 上,首先我們需要把它抓取下來放到我們的主目錄裡面。
$ cd ~$ git clone http://github.com/NetHack/NetHack
玩轉 Windows 10 中的 Linux 子系統
http://www.infocool.net/kb/Windows/201705/355764.html
玩轉 Windows 10 中的 Linux 子系統(SSH服務)