macOS延續自BSD Unix, Linux則是從內核開始重新編寫但延續Unix使用方式的Unix。所以mac還有linux程式員,一般都算是 nix程式員,儘管其中還有不少的區別。 Windows從版本10開始做出的最大改變,可能就是內置的linux子系統,原本的安裝方式很簡單,網上很多介紹,一 ...
macOS延續自BSD Unix, Linux則是從內核開始重新編寫但延續Unix使用方式的Unix。所以mac還有linux程式員,一般都算是*nix程式員,儘管其中還有不少的區別。
Windows從版本10開始做出的最大改變,可能就是內置的linux子系統,原本的安裝方式很簡單,網上很多介紹,一般就是三步:1.設置中打開開發人員模式;2.windows組件中安裝linux子系統;3.在DOS視窗中執行bash,隨後經歷一場漫長而令人期待的安裝。
後來這個辦法不靈了,因為雖然win10幾乎馬不停蹄的更新了不少版本,其中的linux仍然保持著beta狀態,下載的源網站也在國外,而因為我們都知道的原因,這個網站在國內訪問越來越困難。
有聰明人想了辦法,比如首先從第三方下載tar安裝包,利用fiddle之類的軟體截獲win10安裝linux子系統時候的下載路徑,隨後替換為本地的tar文件,雖然麻煩點,但還是能很快的完成安裝。後來,又是後來,這個辦法也失效了,win10的內置下載路徑已經不能再被修改替換。
這時候說“上帝關上一扇門,總是又為你打開一扇窗”是不是有點矯情?
但事實就是如此,Win10 RS3之後的Linux子系統,終於轉正成正式版了,從而登上了Win10的應用程式商店,並且還有了Ubuntu/Suse Linux等多個版本供選擇,據說還會有更多正在趕來的途中,嗯,這扇窗開的不算小吧?
無論你的Win10使用了什麼版本,打開應用商店,都已經能搜索到這些Linux應用,但是,似乎只有RS3之後的版本才可以下載,其它版本的win10只能看看介紹,然後就只好洗洗睡了。
事實上,正確的打開方式是這樣:
- 首先登陸微軟官網,使用自己的微軟賬號登陸進去,把自己的賬號轉換成開發者賬號,如果找不到登陸鏈接,可以直接從下麵第2步鏈接賬號的地方進去。
- 菜單路徑是:開始菜單->齒輪圖標進入設置->更新和安全->Windows預覽體驗計劃,先選擇鏈接Microsoft賬戶,使用你的微軟賬號捆綁到Win10系統,然後在上面的獲取Insider Preview中,打開開發者預覽功能。
- 同一個設置界面中,選擇最上面的Windows更新,這時候你會找到很多預覽版的升級,踏踏實實升級到這個最新的預覽版。你問是否穩定?你個*nix碼農,關心Win10穩定不穩定幹啥?
升級會耗費比較長的時間,一旦升級完成,打開應用商店,選一個你喜歡的linux版本,下載就好了。
————————————————————————————————————————————————
很多unix程式員的工作方式都是ssh登陸,然後vi修改程式,接著make編譯。
到了win10你會發現,同樣的ssh不管用了......
實際的情況是這樣,win10預設的ssh留給了自己的CMD應用,也就是Windows命令行,你只能使用Win10的管理員登陸,比如一般預設的Administrator,也就是說,你應當用類似:
ssh [email protected]
這樣來登陸到Win10,隨後可以用bash啟動linux。
但是如果linux已經在電腦桌面其他的CMD視窗啟動了怎麼辦?這時候bash命令會報錯,說已經有其它實例運行,怎麼解決呢?可以在桌面進入linux子系統,編輯一下/etc/ssh/sshd_config文件,把其中的22號埠,修改為比如23,修改完是這樣子的:
Port 23
如果你的win10開了防火牆,記著修改防火牆設置,允許傳入的連接申請(allow incoming traffic)到23號埠,以便允許你遠程登陸。
linux子系統再次啟動之後,ssh -p 23 [email protected]
就可以登陸到linux之中了。
如果你根本不使用windows自己的命令行,那在win10 services中關閉SSH Server Broker、SSH Server Proxy兩項,就可以讓出來22號埠,從而不修改linux子系統的ssh埠,這樣也是可以的。不過我不建議這樣,比如你想遠程關機,就只能在CMD中執行,Linux子系統根本沒有這個許可權。
這時候還存在一個問題,如果win10重新啟動,而linux子系統還沒有啟動,ssh是無法登陸到linux的,解決這個問題,可是個麻煩事了,大概經過這些步驟:
- 在linux子系統中執行:
sudo dpkg-reconfigure openssh-server
生成ssh伺服器端證書。 sudo vi /etc/ssh/sshd_config
,再次編輯sshd的配置文件,把UsePrivilegeSeparation yes
這一行最後的yes修改成no。- 繼續修改這個文件,把
PasswordAuthentication no
修改成PasswordAuthentication yes
。 - 保存/etc/ssh/sshd_config退出vi。(嗯,寫給小白,保存退出vi的方法是:ESC鍵->":"鍵->x然後回車)
- 運行
sudo visudo
編輯sudoers文件,增加一行:$USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D
,註意這裡把$USER替換成你的linux子系統用戶名。保存退出。如果visudo有任何報錯一定仔細檢查修改直到正常,否則你的linux將無法再登陸!!! 在Win10一側建立一個vbs腳本文件,比如叫autostartssh.vbs,內容為:
set ws=wscript.createobject("wscript.shell") ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
- 現在可以先測試一下,雙擊autostartssh.vbs文件,應當能順利的打開linux子系統並啟動ssh伺服器。
如果測試沒有問題,在開始菜單->Windows管理程式文件夾中啟動win10的“任務計劃程式”,增加一個開機自動執行任務,操作是啟動程式,程式內容就是剛剛編寫的這個autostartssh.vbs腳本。在這裡碰到一個我相信是bug,本來觸發器應當設置為“電腦啟動時”自動執行,但死活無效,最後設置成了”當任何用戶登錄時”反而沒有任何人登陸就執行了,實際是開機自動執行的效果。
不管怎麼樣,我們想開機自動運行Linux ssh的目的,終於達到了。
————————————————————————————————————————————————
Win10下麵Linux子系統的日常維護跟標準的Linux系統一樣,比如Ubuntu版本也是使用apt進行包管理,日常要經常進行一些apt update
/ apt upgrade
這樣的操作。感覺上,90%原來伺服器端的開發工作,都可以在這裡面完成了。有些用戶喜歡GUI界面,可以嘗試安裝Xming之類的X11 Windows Server,官方網址是:https://xming.en.softonic.com,不過我覺得必要不是很大,開發工具、辦公工具以及其它一些常用軟體,windows下已經有很多了,真的沒有必要自討無趣。
已知有幾項限制,開發過程中可能會碰到:
- 本質上Linux子系統還是接近虛機的運行方式,因此,比較偏向底層的網路編程,比如socks udp操作,測試的時候你要考慮到實際上linux是通過win10的網路系統轉發的,難以描述確切的癥狀,總之會碰到很多無法達到預期的情況,這類程式調試,可能你還是需要一臺linux或者mac真機。
- tcpdump之類的工具,在linux子系統上是無法正常執行的,因此如果要抓包,估計你只能藉助windows下的軟體了,不過無論如何可能達不到tcpdump這樣方便。sad...
- 上面提到過,類似關機、重啟之類這樣的操作,在linux子系統中無法實現,這樣的功能,還是需要真機調試。
(你有沒有好奇今天的題頭圖我沒有說圖文無關?事實上這幅圖片是Win10預置的桌面壁紙之一,不算無關吧?)