《開啟WSL之旅》中,我們建立了windows10下的Ubuntu子系統,可以在Ubuntu與Windows系統間切換,毫無延遲感。本文介紹兩種終端軟件,MobaXterm與Xshell,與WSL中的Ubuntu建立SSH通道,本方案也適于windows訪問獨立的Linux主機。
準備工作:
ifconfig執行結果
【開始】中,啟動Ubuntu18.04,在wsl窗口中,執行:
ifconfig
eth0:段中的inet后的 172.17.86.219 ,即為本機的IP地址(每次啟動wsl,獲得新地址,后面建立連接用到)
wsl窗口中,執行:
sudo service ssh start
啟動ssh server,如果出錯或報沒有此命令,則需安裝SSH server,參考安裝SSH。
sudo service ssh status (檢查是否啟動成功)
安裝SSH
sudo apt update
sudo apt upgrade
sudo apt remove openssh-server
sudo apt install openssh-server
sudo vim /etc/ssh/sshd_config
主要改兩項:
Port: 22 把前面的#注釋去掉,緊接的幾行也可以去掉#
PasswordAuthentication yes 把no改為yes
sudo service ssh restart
下載地址: https://mobaxterm.mobatek.net/download-home-edition.html
選擇免安裝版(Portable Edition)下載。
第一次運行,會自動檢測到WSL
MobaXterm會自動檢測到WSL環境,直接點擊左側圖標,輸入用戶名、密碼,即可快速連接。但下面介紹更一般的用法,手工建立會話連接,這也適用于連接其他計算機上的Linux系統。
如上圖,點擊左上角【Session】,打開如下界面
輸入IP,wsl用戶名
如果出現Network errror:Connection refused,表示ssh設置有問題
出現類似問題,可參考準備工作中的說明,檢查一下ssh的啟動狀態。
連接上,等待輸入登錄密碼
選Do not show this mesage again
選擇【Yes】后,出現加密方式保存Ubuntu用戶密碼界面,加密密碼至少為7位。
加密密碼至少長為7位
連接成功
連接成功后,左側為Ubuntu中的文件列表,可以在其中進行文件、目錄操作。右側為終端,可以在其中執行linux命令。
Ubuntu與本地window間上傳下載文件
以后每次啟動WSL,可以在建立的連接上,鼠標右鍵,【Edit session】,修改ip等參數。
下載地址: https://www.netsarang.com/en/free-for-home-school/
選擇免費的個人版。
下載頁面注意選Both
會發送兩封郵件到你的郵箱,一個是Xshell的鏈接,另一個是Xftp的鏈接。Xftp為內嵌入Xshell中,用于文件傳輸,依次下載、安裝。(因為下載的是個人免費版本,在首次啟動Xshell后,會提問是否購買,【關閉】即可)。
去掉啟動顯示
【新建】會話
輸入ip
首次連接,會提問,【接受并保存】
輸入wsl的用戶名、密碼
連接成功
登錄成功后,即可在右側窗口執行linux命令,左側會話列表中,選中一會話,鼠標右鍵【屬性】中,可修改ip地址。如果要傳輸文件,可點擊下圖中圖標,啟動Xftp。
Xftp界面
左側為本地文件窗口,右側為Ubuntu中文件操作窗口。鼠標右鍵,選擇對應操作。
MobaXterm與Xshell對比
MobaXterm可以自動檢測WSL,建立連接比較方便。Xshell中的Xftp,相當于一個ftp客戶端,文件的操作能力強大。
本文主要講win10系統怎么編譯出opencv.js。
主要編譯過程跟官網一樣,先安裝Emscripten,再獲取opencv源碼,再編譯opencv源碼。
本文主要解決的問題是在win10怎么完成編譯。
先說一下背景,公司的電腦是win10,構建opencv.js需要用到Emscripten,而Emscripten官網不推薦直接在windows系統上運行,對windows用戶推薦了windows的Linux子系統。
一開始我不了解什么是window的Linux子系統,即WSL,于是我直接在windows中運行了(我不想裝虛擬機,也不想重裝系統,也不想把mac帶到公司來),結果搗騰了2天也沒把編譯時的各種報錯解決完,報錯一個接一個,解決完一個又出現一個……
最后我決定去看一下WSL,發現非常好用,編譯opencv.js一舉成功!
1、勾選適用于Linux的windows子系統
路徑是「控制面板」-「程序」-「啟用或關閉Windows功能」
2、打開 Microsoft Store,搜索「WSL」,選1個安裝,比如我裝的第一個Ubantu 20.04。
3、安裝完成后自動打開終端,沒有自動打開就手動打開,跟linux系統一樣,設置好用戶名和密碼,就進入linux系統了。
1、確保安裝了git、cmake、python,沒有安裝的話運行下列命令安裝:
sudo apt install git
sudo apt install cmake
sudo apt install python
安裝后可以通過下列命令查看安裝的版本:
2、安裝Emscripten
# 創建customopencv目錄
mkdir customopencv
# 進入customopencv目錄
cd customopencv/
# 拉取emscripten源碼
git clone https://github.com/emscripten-core/emsdk.git
# 進入emsdk目錄
cd emsdk/
# 安裝emsdk
./emsdk install latest
# 激活emsdk
./emsdk activate latest
# 設置環境變量
source ./emsdk_env.sh
3、獲取opencv
回到上級目錄,clone opencv源碼:
# 拉取opencv源碼
git clone https://github.com/opencv/opencv.git
4、編譯opencvjs
運行下面的命令來編譯:
python platforms/js/build_js.py build_out --emscripten_dir /home/lovelyun/customopencv/emsdk/upstream/emscripten --build_wasm --clean_build_dir
接下來去喝杯水,然后就可以看到編譯成功了:
=====
===== Build finished
=====
OpenCV.js location: /home/lovelyun/customopencv/opencv/build_out/bin/opencv.js
進入到上面的bin文件夾,運行ls -l可以看到文件詳情:
或者用du -sh *查看它們占用的空間:
這里的opencv.js就是我們最后需要的文件,現在在Linux子系統中,怎么傳到windows系統中呢?
最簡單的是在文件資源管理器的地址欄輸入\wsl$,回車就可以看到所有的子系統。
點進去就可以看到上面的文件,比如我的路徑是\wsl$\Ubuntu-20.04\home\lovelyun\customopencv\opencv\build_out\bin。
接下來我們去掉DNN模塊,首先用vscode打開子系統中的opencv文件夾,打開/platforms/js/build_js.py文件,把get_cmake_cmd(self)函數中的-DBUILD_opencv_dnn=ON改為-DBUILD_opencv_dnn=OFF。
重新構建后可以看到,opencv.js從一開始的8.6M減小到了5.5M。
我們還可以修改opencv_js.config.py,去掉沒用到的函數,比如只保留core和imgproc。
此時編譯出來的opencv.js就只有3.7M。
或許你覺得3.7M也很大,當然大啦,但是core和imgproc中沒用到的函數還可以接著刪除呀。
直接把bin目錄中的opencv.js復制到項目中,比如下面這樣引用:
<script src="js/opencv.js" onload="onOpenCvReady();" type="text/javascript"></script>
然后發現調用cv的api會報錯,比如cv.imread is not a function。
打印發現cv是一個promise,這里我們簡單的處理一下,把cv重新賦值為promise返回的結果,就可以運行起來了。
async function onOpenCvReady() {
window.cv = await window.cv
}
按照官網的說法,應該是可以直接使用編譯出來的opencv.js的,即直接替換官網編譯的opencv.js。這里實測直接替換有問題,那就解決它,我們暫時不糾結為什么會有問題了,
需要Linux環境的問題,就用Linux,不要用windows環境瞎折騰。
這次編譯的大部分時間都在解決windows上的報錯問題,雖然windows上安裝都是成功的,校驗是否安裝成功的結果都是ok的,但編譯時各種報錯,最后用了WSL,一開始為了省時間直接把windows上下載的emsdk文件夾cp過去用,而且WSL中的python環境默認是python3,這些因素也導致了編譯報錯,最后我想完全重新來一次,在WSL中重新下載emscripten,重新安裝python,最后用的python2,編譯一次性成功。
用Linux編譯,感覺就是超幸運,干什么都是一次成功。
雖然覺得這種環境問題導致的報錯解決起來浪費時間還沒什么意義,但是編譯成功的那一刻還是挺興奮的,哈哈哈……