如何进行Ubuntu on Windows10跨平台开发环境搭建
本篇文章給大家分享的是有關如何進行Ubuntu on Windows10跨平臺開發環境搭建,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
程序猿經常爭論的一個話題是:日常開發到底Windows好還是Linux好?進而演化出另一個問題:到底選MacBook 好還是SurfaceBook好?
選擇Linux系統或者mac筆記本的同學最核心的理由是Linux/Mac開發、編譯工具鏈比較完善,很多環境或者安裝包都系統自帶了,寫出來的程序可以很方便的通過開發、測試與線上系統對接,開發測試效率比較高,而 Windows下開發的同學可能需要考慮開發、測試代碼的可移植性問題。就拿筆者來說,也曾經遇到過某些java/pythonAPI不支持Windows的問題,這給日常開發帶來了不小的麻煩。
在Windows10以前,咱們為了解決 Windows開發環境跨平臺的問題,往往會選擇cygwin,這個項目本身已經很成熟了,筆者也用了很多年,它能在Windows下模擬一套類Linux的環境,用它應付一般的開發測試問題不大。但它的缺點在于組件、包管理器比較弱,對于日后的環境維護相當麻煩,而且一些底層 API模擬的并不完善,對于一些涉及 Linux底層的系統調用等場景顯得很雞肋。幸運的是2016年微軟在Windows10WSL里開始內置Ubuntu,之后又開始在MicrosoftStore以 UWPAPP 的形式發布各個Linux系統。這樣對于需要搭建跨平臺開發環境的同學來說可以做到一套系統搞定多套平臺環境,又多了一個舍棄Mac的理由 :)
本文今天會詳細講解下怎樣在Windows10下安裝Ubuntu、搭建Linux開發環境,碰到的一些坑及其解決方案。
1、安裝 Ubuntu on Windows10
首先更新你的 Windows10 系統到最新,然后開啟“開發人員模式”,最后在MicrosoftStore里輸入wsl(或 Ubuntu、linux)然后選擇安裝,成功后即可點擊啟動。
注意:網上有些老的教程在命令行下用lxrun /install的形式安裝,這里不推薦,因為這是早期WSLbeta版本的做法,現在正式版直接在MicrosoftStore以UWPAPP的形式獲取更便捷,也易于管理。
最終的系統安裝在如下目錄:
%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
 初始安裝時,整個目錄大概 600MB 左右,我更新了一些軟件包并升級到 16.04 后,大小在 1G。
2、開啟sshd
2.1 設置 sshd
- 
重裝openssh
sudoapt-getremoveopenssh-server sudoapt-getinstallopenssh-server
 - 
修改 sshd 設置,添加以下配置到/etc/ssh/sshd_config
AllowUsersyour-username PasswordAuthenticationyes PermitRootLoginyes
 - 
重啟 sshd
sudoservicessh--full-restart
不出意外使用 ssh 客戶端應該可以鏈接上 Bash on windows 了。
 
2.2問題1:sshd啟動報錯
# /etc/init.d/ssh restart
sshd: ../sysdeps/posix/getaddrinfo.c:2603: getaddrinfo: Assertion `IN6_IS_ADDR_V4MAPPED (sin6->sin6_addr.s6_addr32)' failed. Aborted (core dumped)
原因是 ipv6 的問題,修改sshd_config配置添加 ListenAddress 0.0.0.0 即可
sudovi/etc/ssh/sshd_config
如果遇到如下錯誤
Could not load host key: /etc/ssh/ssh_host_rsa_key
請執行/usr/bin/ssh-keygen -A重新生成hostkeys再重啟sshd即可。
2.3問題2:ssh 密碼錯誤&&無法監聽端口
這個問題查起來還是比較復雜的,需要有比較系統的排查方法和理論,筆者這里折騰了不少時間。
現象就是sshd服務起來了,psaux和top都能見到,但是ssh連接的時候一直提示密碼錯誤或者沒有權限,但密碼確認是對的,包括新建賬戶也不行,按照上篇《記一次詭異的 ssh 互信免密碼登錄失敗》的排查思路發現sshd服務壓根就沒有監聽指定的sshd端口,換做其它端口也有同樣的問題:
nc-l127.0.0.14444 #onpowershell: netstat-a-n-q|findstr"4444"
那可能是系統層面的問題,進一步分析Windows系統事件發現是TDI篩選器的問題:
在windows/system32下咱們可以找到這個驅動文件:
重啟電腦,再次測試ok:
3、sshd開機啟動
一旦關掉 bash.exe 進程,ssh 就無法連接了。解決這個問題分三個步驟:
- 
添加啟動項,讓 bash.exe 隨機啟動
 - 
使用命令
sudo service ssh start啟動 sshd - 
因為
sudo service ssh start命令需要輸入密碼不能自動化,所以需要 visudo 來免除輸入密碼的操作。 
3.1 理清思路接下來記錄一些過程:
- 
使用 vbs 啟動隱藏窗口開啟 bash 和 運行
sudo service ssh start 
setws=wscript.createobject("wscript.shell")
ws.run"C:WindowsSystem32bash.exe",0
ws.run"C:WindowsSystem32bash.exe-c'sudo/usr/sbin/servicessh--full-restart'",0
- 
運行
sudo visudo,添加如下配置 
toorALL=(root)NOPASSWD:/usr/sbin/service
其中 toor 是我的用戶名。
- 
添加vbs文件到windows 啟動項,將 vbs 文件放入到如下目錄下。
 
%AppData%MicrosoftWindowsStartMenuProgramsStartup
重啟,測試不出意外就可以連接上 ssh 了。
另外一種方案是使用windows自帶的定時任務計劃添加開機啟動Ubuntu ssh服務的任務:
搜索“任務計劃程序”,操作-- 創建基本任務
觸發器:當計算機啟動時
操作:啟動程序
程序名:bash.exe
參數為-c "sudo /usr/sbin/sshd -D"" 意思是打開bash,執行sshd命令開啟ssh服務
選擇“點擊完成打開屬性頁”按鈕,點擊完成,打開屬性頁
在屬性頁選擇“使用最高權限運行”,避免錯誤。
3.2 問題1:重啟/開機后無 sshd進程
首先確保上述三步每一步的代碼都正確,其次看看系統日志是何原因失敗,我這里遇到的是sudo還需要密碼,導致開機的VB腳本執行出錯。仔細研究了下, 這個配置文件如下:
... #Userprivilegespecification rootALL=(ALL:ALL)ALL my-usernameALL=(ALL)NOPASSWD:ALL#--->thelineaddedbyme #Membersoftheadmingroupmaygainrootprivileges %adminALL=(ALL)ALL #Allowmembersofgroupsudotoexecuteanycommand %sudoALL=(ALL:ALL)ALL #Seesudoers(5)formoreinformationon"#include"directives: #includedir/etc/sudoers.d
可以看到我的配置加在了中間,后面還有幾條配置,導致我的配置被后面的覆蓋了。解決方案是把我的配置移動到最后,再次試了下,sudo不再需要密碼了。
3.3問題2:secureCRT卡死/亂碼
這里的 secureCRT卡死/亂碼和字符集有關,注意設置正確的終端字符集和系統字符集,UbuntuonWindows默認字符集是Latin。
sudovim/etc/default/locale LANG=zh_CN.UTF-8 LANGUAGE=”zh_CN:zh” ################################# #sudodpkg-reconfigurelocales #en_US.UTF-8、zh_CN.GBK、zh_CN.UTF-8 ################################# WARNING!Yourenvironmentspecifiesaninvalidlocale. Theunknownenvironmentvariablesare: LC_CTYPE=zh_CN.UTF-8LC_MESSAGES=zh_CN.UTF-8LC_ALL= Thiscanaffectyouruserexperiencesignificantly,includingthe abilitytomanagepackages.Youmayinstallthelocalesbyrunning: sudoapt-getinstalllanguage-pack-zh or sudolocale-genzh_CN.UTF-8 Toseeallavailablelanguagepacks,run: apt-cachesearch"^language-pack-[a-z][a-z]$" Todisablethismessageforallusers,run: sudotouch/var/lib/cloud/instance/locale-check.skip
另外一種方案不修改配置,在bash中依次執行如下命令:
apt-getupdate apt-getinstalllanguage-pack-zh-hans update-localeLANG=zh_CN.UTF-8
這幾條命令安裝了中文補丁,并且把本地編碼改為了中文編碼。
然后重啟WSL(關掉窗口,重新打開),再執行命令
echo$LANG
可以看到輸出為
zh_CN.UTF-8
之后可以看到終端中輸出的中文能夠正常顯示了。
4、WSLUbuntu 更新
4.1 ubuntu 系統升級:
(1)版本升級 //更新軟件源,最后會讀取軟件包列表 sudoapt-getupdate sudoupdate-manager-c-d 然后選擇upgrade:apt-get-y--force-yesupgrade (2)普通升級所有軟件包 sudoapt-getupdate sudoapt-get-yupgrade #apt-get-y--force-yes--fix-missingupgrade (3)升級單一軟件 sudoapt-getupdate sudoapt-getupgradepackage_name_your_want_to_upgrade aptlist--upgradable-a (4)全部升級 //更新所有的軟件 sudoapt-getdist-upgrade (5)從16.04升級到18.04,事后記得更新/etc/apt/sources.list鏡像源版本為boinc aptinstallupdate-managerupdate-manager-core sudodo-release-upgrade-d #autoremove慎用 sudoaptautoremove
4.2 修改 Ubuntu 鏡像源:
WSL自帶的Ubuntu更新源國內訪問非常慢,很容易出現部分源IP無法連接上,進而部分索引文件下載失敗,最后導致整個更新失敗,這里推薦阿里云的鏡像比較穩定可靠,當然也可以參考國內各個大學的鏡像源。
(1)Ubuntu的軟件源配置文件是/etc/apt/sources.list,先將系統自帶的該文件做個備份: (cd/etc/apt&&sudocpsources.listsources.list.bak.`date-I`) (2)將源文件中的URL替換為國內任意源,比如阿里云:http://mirrors.aliyun.com/ubuntu debhttp://cn.archive.ubuntu.com/ubuntu/trustymainrestricteduniversemultiverse debhttp://cn.archive.ubuntu.com/ubuntu/trusty-securitymainrestricteduniversemultiverse debhttp://cn.archive.ubuntu.com/ubuntu/trusty-updatesmainrestricteduniversemultiverse debhttp://cn.archive.ubuntu.com/ubuntu/trusty-backportsmainrestricteduniversemultiverse #如要用于其他版本,把trusty換成版本代號就好,比如:15.10willy、14.04trusty #具體請參考:http://wiki.ubuntu.org.cn/%E6%BA%90%E5%88%97%E8%A1%A8http://wiki.ubuntu.org.cn/%E6%A8%A1%E6%9D%BF:18.04source (3)sudoapt-getupdate,刷新列表使其生效。 #注意:一定要選對版本 #注意:一定要執行刷新,重新加載配置
在 vim中可以直接:
%s#debhttp://archive.ubuntu.com/ubuntu/#debhttp://mirrors.aliyun.com/ubuntu/#g %s#debhttp://security.ubuntu.com/ubuntu/#debhttp://mirrors.aliyun.com/ubuntu/#g
一切妥當后:
5、借助 X Server 在 WSL 上使用GUI 桌面程序
5.1 X 窗口系統 (X Window System) 簡介
X 窗口系統( X Window System,也常稱為 X11 或 X)是一種以位圖方式顯示的軟件窗口系統。最初是 1984 年麻省理工學院的研究,之后變成 UNIX、類 UNIX、以及 OpenVMS 等操作系統所一致適用的標準化軟件工具包及顯示架構的運作協議。X 窗口系統通過軟件工具及架構協議來創建操作系統所用的圖形用戶界面,此后則逐漸擴展適用到各形各色的其他操作系統上。現在幾乎所有的操作系統都能支持與使用 X。更重要的是,今日知名的桌面環境——GNOME 和 KDE 也都是以 X 窗口系統為基礎建構成的。
X Window System 主要由 X Server 和 X Client 兩部分組成。其中 X Server 負責接受對圖形輸出 (窗口) 的請求并反饋用戶輸入,而 X Client 則是使用圖形界面的應用程序。由于 WSL 本身不支持圖形界面,我們需要額外安裝 X Server 并指定圖形輸出位置,使得帶有 GUI 的桌面程序可以被顯示和運行。
5.2 X Server 的選擇
Windows 上常用的 X Server 有:Xmanager, Xming, VcXsrv 等,簡單比較一下:
- 
Xmanager 是商業軟件,需要付費
 - 
Xming 雖然是開源軟件,但是從從 2007 年最后一個免費版本 (6.9.0.31) 之后,就需要捐助才能下載。不過免費版本雖然老舊,但由于 X Windows System 近年來變化不大,免費版還是基本夠用
 - 
VcXsrv 為開源免費軟件,使用方式及界面與 Xming 極為相近,還在不斷更新,因此我最終選擇此軟件
 
5.3 VcXsrv 的安裝和啟動
下載 VcXsrv 并進行安裝后,運行 XLaunch,一直點 Next 至啟動完成。
5.4 WSL 設置
啟動 X Server 后,需要在 WSL 中輸入如下兩條指令,重啟 Bash,即可運行帶有圖形界面的 Linux 程序了
echoexportDISPLAY=:0.0>>~/.bashrc sudosed-i's$<listen>.*</listen>$<listen>tcp:host=localhost,port=0</listen>$'/etc/dbus-1/session.conf
這里對這兩條指令簡單解釋一下:
- 
第一條指令
 
該指令將export DISPLAY=:0.0 指令添加進 ~/.bashrc 中,使得每次開啟新的 Bash 時,自動指定圖形程序顯示的位置。
 也可直接輸入以下指令運行程序,無需export,但作用效果只有一次,再運行其他程序時,還要重新輸入指令。
DISPLAY=:0.0gvim&//gvim為你想要打開的程序
tips:gvim 后的 & 不是必須要加,它表示程序以后臺啟動的方式運行,這樣在圖形界面運行時,命令行窗口還可以繼續使用。要是忘記加 &, 也可以在程序運行時按ctrl+z, 將程序進程掛起,并輸入bg,使其在后臺運行
- 
第二條指令(可選)
 
第一條輸入,重啟 Bash 后 , 理論上就可以運行 Linux 程序了,但程序一般不會運行很久就掛掉了,并會提示 D-Bus異常,該異常會使得許多 Linux 的圖形程序無法很好地運行。 這是因為 D-Bus 需要使用socket來通信,但 WSL 目前并不支持 socket。
 Reddit 上對此的解決方案為:用 tcp 代替 sockets 來使 D-Bus 運行。
 具體實現為:在 /etc/dbus-1/session.conf 中(需要 Root 權限),將<listen>unix:tmpdir=/tmp</listen>字段替換為 <listen>tcp:host=localhost,port=0</listen>,簡單寫就是第二條指令了。
5.5 WSL/VcxSrv中文亂碼
是因為你的 WSL 里沒有中文字體支持,所以需要安裝中文字體:
sudoaptinstallfonts-noto-cjk 或者 sudoaptinstallfonts-wqy-microheifonts-wqy-zenheixfonts-wqy
如有需要在 VcxSrv輸入中文可以安裝fcitx中文輸入法,具體參考
#Windows Subsystem for Linux入門:安裝+配置圖形界面+中文環境+vscode
https://wu-kan.github.io/posts/linux/Windows-Subsystem-for-Linux
#windows 前端工作環境搭建指北
https://juejin.im/post/5a5f0e3ff265da3e290c3b78
如果還有問題,可以進一步如下設置:
打開xlanch,一路下一步添加啟動參數
 -fp "C:/Windows/Fonts"
然后重啟xming
6、WSL 訪問本地文件
本地文件系統的各磁盤掛載在 /mnt 目錄下,如 C 盤在子系統中的位置是:/mnt/c ,WSL文件讀寫權限的配置方法:
cat/etc/wsl.conf [automount] enabled=true options="metadata,fmask=022,dmask=022,umask=022" options="metadata" mountFsTab=false
6.1 本地訪問 WSL 文件
Ubuntu 子系統的根目錄位置:
 [C:UsersusernameAppDataLocalPackagesCanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgscLocalStaterootfs]
需要將子系統中的文件拷貝到本地時可以直接訪問;但不建議在外部手動更改子系統里的文件。
 如果不小心把子系統搞崩潰了怎么辦?這里有兩種方法。
1、直接右鍵卸載,再從 Microsoft Store 重新安裝。
 2、推薦!打開 PowerShell,運行 ubuntu clean ,該命令會清除 Ubuntu 的所有文件和配置,但是不會卸載應用,相當于重置,省得重新安裝應用了。
輸入ubuntu help可以查看更多指令。
6.2 Tips
設置默認登陸用戶
子系統默認登錄賬戶為我們初始化時設置的普通賬戶,我們可以把默認賬戶更改為 root。
打開 windows 的 PowerShell,修改默認賬戶為 root:
ubuntuconfig--default-userroot
需要修改為其它賬戶的話,把命令中的 root 改為其它用戶名即可。
6.3在ConEmu中使用WSL
按圖操作:
7、DockeronWSL
wsl 2已經全面支持docker,本文不再贅述,下面主要針對wsl版本。
7.1WSL中安裝Docker
首先WSL命令行一定要用管理員身份啟動。(用管理員打開Ubuntu程序,記住不是sudo,是Windows的“管理員打開”)
sudoaptupdate sudoaptinstalldocker.io #sudogroupadddocker sudousermod-aGdocker$USER#授予當前用戶以root權限運行DockerCLI
如果默認安裝不通過,可以指定docker 版本號安裝:【WSL+Docker】新手Win10下的WSL Ubuntu18并安裝使用Docker
https://zhuanlan.zhihu.com/p/61542198
隨后再以管理員啟動WSL控制臺,執行
sudocgroupfs-mount#一個簡易加載控制組文件的腳本 sudoservicedockerstart
測試安裝結果(下面的命令不要再帶sudo):
$dockerversion Client: 。。。 Server: 。。。 $dockerrun--rmhello-world $dockerrun-itubuntubash
顯示如上信息,就表示可以正常使用了,需要注意的是每次電腦重啟后先執行cgroupfs-mount再啟動docker服務,wsl 目前docker支持并不完善,可能會有很多問題,建議直接linux環境使用,或者wsl 2 。
7.2可能問題:
運行docker提示: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
7.2.1 這時候你需要通過deamon連接docker(client),執行:
echo"exportDOCKER_HOST=tcp://localhost:2375">>~/.bashrc&&source~/.bashrc
7.2.2修改docker服務配置:
Inside file/lib/systemd/system/docker.service change:
ExecStart=/usr/bin/dockerd fd://
with
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375
Inside file/etc/init.d/dockerchange:
DOCKER_OPTS=
with
DOCKER_OPTS="-H tcp://0.0.0.0:2375"
and then restart your computer(or admin: sudo service docker restart).
7.3曲線救國
如果你的Windows/Docker版本不對也會有各種問題,可能 WSL 本身無法支持/兼容docker engine,這時候我們若希望在 WSL 中運行 docker(client) ,我們需要將 docker client 連接到 Windows 的 docker engine (這也是為什麼要安裝 windows docker 的原因),并且還需如下設置。
總結
以上是生活随笔為你收集整理的如何进行Ubuntu on Windows10跨平台开发环境搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: mysql5.623 GTID主从复制+
 - 下一篇: python连接中控考勤机分析数据