<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文將介紹“區域網下遠端ide式開發”、“公網下遠端ide式開發”、“區域網下遠端容器的ide式開發”、“公網下遠端容器的ide式開發”這四種開發流程,讓你無論在工位上還是在家中,都可以像開啟本地ide那樣進行遠端的專案開發。
最方便、最開始的開發方式當然是在本地ide中,比如初學者在Windows電腦上使用pycharm來學習python、深度學習,或者使用devc++、visual studio等來編寫c++專案。在本地ide中,可以瀏覽資料夾、檢視文字和圖片等,進一步還可以執行偵錯python、C++等專案。這樣的開發過程稱為“ide式開發”,初學者會覺得這些都是理所當然的。
但是隨著能力的提升、需求的擴大,我們需要使用Linux系統來進行開發,甚至是純伺服器形式的linux,連顯示屏都沒有。此時我們會初步接觸ssh,連上linux伺服器的終端,然後通過敲命令的方式來執行一些程式的執行,檢視結果。注意只連終端是不可能進行程式碼編寫、偵錯等步驟的,更別說看圖片啥的。此時的做法應為在本地機寫好程式碼,再通過ftp傳輸到伺服器上執行。不過這也算入門linux中的專案開發了。
但是這種方式太low了,就不能實現windows裡ide式開發的效果嗎?可以的!藉助強大的vscode的remote-ssh外掛,同樣是ssh連線伺服器的22埠,卻可以實現ide式開發,這樣就可以愉快的點來點去和偵錯程式碼了。想實現這個功能請搜尋“vscode遠端連線linux”,或“vscode remote-ssh連線linux”等教學。
在這個環節,我們應該對ssh的原理、公鑰私鑰的概念與使用有所瞭解,還需要了解sshd_config中各項設定的含義。
再進一步,我們會有居家辦公的需求,比如現在疫情比較頻繁,在家裡沒有了公司wifi,脫離了區域網環境,我們是無法像以前那樣連線linux伺服器的,因為ip是內網中的,而我們處在家中的話還去連那個ip,肯定就不對了。此時需要藉助“埠轉發”,或者說“內網穿透”工具來把處在公司內網的linux伺服器的22埠暴露在公網環境中。對於計算機網路不太好的同學來說不論是理解還是實現這一功能都是比較困難的。
所謂內網穿透,就是藉助處在公網中的伺服器作為中介,讓公司的linux伺服器和家裡的windows電腦都連線上公網伺服器,windows向中介傳送“sudo apt install vim”命令,中介就把這句話轉發給公司linux伺服器,公司linux伺服器就會執行這個命令,然後返回“successfully installed vim.”資訊給中介,然後中介再把這條資訊傳遞給windows電腦,於是整體效果就是win端輸入sudo apt install vim,接著顯示successfully installed vim.這就是內網穿透。在內網穿透基礎上,通過vscode的remote-ssh設定一下,就能實現公網下遠端ide式開發。
內網穿透要注意的細節是比較多的,為了方便大家實現,也為了以後自己在新裝置上覆現,我做一些詳細的說明。
整個內網穿透流程如下
在具體實施上,有3個環節要做:
1、購買並設定好擁有公網ip的阿里雲伺服器,在控制檯的安全組中(並非在伺服器內部,而是在阿里雲控制檯中)開放相應埠
2、在阿里雲伺服器上安裝ssh, 安裝frp,完成frps.ini的設定,開啟防火牆,開放相應埠,frps服務新增至自啟動並開啟
3、在公司內網伺服器上安裝frp,完成frpc.ini的設定,開放相應埠,開啟ssh,frpc服務新增至自啟動並開啟。
具體說明:
我買的是1核2g cpu,1Mbps頻寬,100G容量的ecs.n4.small伺服器,1年84元,伺服器會提供一個公網ip(無論在哪個網路環境下都可以憑藉公網ip存取雲伺服器,假設此ip為89.67.45.200)。在阿里雲控制檯的安全組的出和入裡面新增伺服器端的反向代理監聽埠(7000),對映埠(6000),為了後續的別的裝置的埠轉發,可以多開幾個埠
具體可參考這裡
apt install openssh-server systemctl start firewalld firewall-cmd --add-port=7000/tcp --permanent firewall-cmd --add-port=6000/tcp --permanent firewall-cmd --add-port=6001/tcp --permanent firewall-cmd --reload
mkdir /root/apps && cd /root/apps wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz tar -xvf frp_0.34.3_linux_amd64.tar.gz cd frp_0.34.3_linux_amd64
將frps.ini內容改為
[common] bind_addr = 0.0.0.0 bind_port = 7000 token = 1234
frps表示server端的frp,同理frpc表示client端的frp。
其中bind_port表示監聽埠。一箇中介伺服器可以同時完成多個裝置的埠轉發,但是監聽埠只能有一個。
token表示密碼,別的裝置想讓中介轉發埠,得有這個密碼
將sysytemd下的frps.service內容改為
[Unit] Description=Frp Server Service After=network.target [Service] Restart=on-failure RestartSec=5s ExecStart=/root/apps/frp_0.34.3_linux_amd64/frps -c /root/apps/frp_0.34.3_linux_amd64/frps.ini [Install] WantedBy=multi-user.target
然後執行
cp ./systemd/frps.service /etc/systemd/system/ systemctl daemon-reload systemctl enable frps systemctl start frps
這樣的話中介就設定好了
apt install openssh-server mkdir /home/user/apps && cd /home/user/apps wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz tar -xvf frp_0.34.3_linux_amd64.tar.gz cd frp_0.34.3_linux_amd64
將frpc.ini內容改為
[common] server_addr = 89.67.45.200 server_port = 7000 token=1234 [linux_in_company] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
server_addr表示中介的公網ip,server_port 是中介的監聽埠,linux_in_company是這臺linux伺服器在中介那裡的命名,如果有多個裝置要用中介來轉發埠,這個命名不可以重複
local_port 表示Linux伺服器中要轉發出去的埠,22表示終端
remote_port 是中介上的對映埠。win電腦存取中介的6000埠就能起到存取Linux伺服器22埠的效果
然後做自啟動,修改systemd下的frpc.service
[Unit] Description=Frp Client Service After=network.target Wants=network.target [Service] Restart=on-failure RestartSec=5s ExecStart=/home/user/apps/frp_0.34.3_linux_amd64/frpc -c /home/user/apps/frp_0.34.3_linux_amd64/frpc.ini ExecReload=/home/user/apps/frp_0.34.3_linux_amd64/frpc reload -c /home/user/apps/frp_0.34.3_linux_amd64/frpc.ini [Install] WantedBy=multi-user.target
再
cp ./systemd/frpc.service /etc/systemd/system/ systemctl daemon-reload systemctl enable frpc systemctl start frpc
到這一步就很簡單了。
ssh user@89.67.45.200 -p 6000即可,想登root就改成ssh root@89.67.45.200 -p 6000,後面相應的輸root的密碼即可。有時記得sudo的密碼卻忘了su的密碼咋整?sudo passwd root重置root密碼即可
此外,還可以通過金鑰對來進行免密登陸,這裡不做贅述
隨著能力的進一步提升,我們不得不面臨越來越困難、複雜的環境設定過程,比如cuda,tesnorrt的安裝與更換版本等。很多時候,目的是C,但是為了做C要先把A和B這兩個設定環境的環節給踩一遍,隨著這種情況的增多,我們就會發現原先簡單的linux伺服器變得越來越龐大複雜,裡面設定了各種各樣的環境,複雜到,嘗試更新顯示卡驅動失敗了,導致很多東西都得跟著完蛋,最後連pytorch模型都跑不起來。
所以,我們直接在伺服器本體上進行各種環境的設定與專案的開發有兩個缺點:其一是耗時間,有的東西的確沒必要搞這麼清楚,如果有現成的直接用當然最好;其二是環境間容易相互影響產生依賴,一個出問題了其他都得完蛋。
在這種問題的驅動下,容器內的專案開發流程應運而生:我們開啟Linux伺服器,並不直接在其上面進行環境設定與程式碼編寫偵錯,而是再在linux中建立容器並進入,在容器中去進行開發。一進容器,各種需要的環境已經為你準備好了,比如英偉達官方的pytorch容器,裡面就配好了cuda,cudnn,pytorch,tensorrt等等,這就為我們節省了大量寶貴的時間。再者,在容器裡面不管你怎麼折騰,只要別把掛載資料夾裡的東西亂刪,那都沒事,絲毫不影響容器外部的linux伺服器。不小心把容器搞壞了,再run一個,一切照常。
而想要實現遠端容器的ide式開發也很簡單,只要在建立容器時增加埠對映即可,比如docker run … -p 6666:22 …,然後在容器中安裝好ssh,開啟服務,這樣的話存取linux伺服器(稱為host)中的6666埠就等同於存取容器的22埠了。
所以只需把“1.1 區域網下遠端ide式開發”中的ssh指令的使用者名稱改為root,埠改為6666,即可在vscode中通過區域網來實現遠端容器的ide式開發。
有了“1.2 公網下遠端ide式開發”和“2.1 區域網下遠端容器的ide式開發”的基礎,公網下遠端容器的ide式開發就變得非常簡單:在公司linux伺服器中的frpc.ini中增加一個埠轉發請求,把6666埠轉發到中介的6001埠,這樣的話ssh root@89.67.45.200 -p 6001就會先轉到linux伺服器的6666埠,再轉到容器的22埠,成功在家中進行公司伺服器中容器的ide開發
不過要注意,ssh連之前要先在linux伺服器中執行該容器,並通過/etc/init.d/ssh start開啟ssh服務。這個環節可以使用容器的初始指令碼來完成,首先在linux伺服器上找個地方寫一個指令碼~/code/start.sh
#! /bin/bash if [ -f "/etc/init.d/ssh" ]; then echo "ssh OK" /etc/init.d/ssh start else echo "ssh not installed. Start intallation." /code/install_ssh.sh fi /bin/bash
然後chmod 777 ~/code/start.sh
其中安裝ssh的指令碼如下,沒個容器情況不同,所以僅供參考
#! /bin/bash cd / echo -e "deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiversendeb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiversendeb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiversendeb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiversendeb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiversen" >> sources.list cp sources.list /etc/apt/sources.list apt update apt install -y --allow-downgrades openssh-client=1:7.2p2-4ubuntu2.10 apt install -y openssh-server echo "ssh installed. Now you need to configure it."
然後chmod 777 ~/code/install_ssh.sh
接下來建立容器!
docker run --gpus all -it -p 6666:22 --name trt -v ~/code:/code nvcr.io/nvidia/tensorrt:21.10-py3 /bin/bash /code/start.sh
我來詳細解讀一下這條指令:
run就是從映象建立容器,–gpus all就是把host的所有gpu都開放使用權利,-it就是以互動模式執行容器併為其分配一個終端命令列,-p 6666:22就是把容器的終端埠22對映到host的6666埠,–name trt就是給這個容器命名為trt,-v ~ /code:/code就是把host的~/code資料夾掛載到容器中的/code資料夾。nvcr.io/nvidia/tensorrt:21.10-py3就是映象的名字,/bin/bash /code/start.sh表示一建立容器就用bash執行這條start.sh指令碼,而且start.sh指令碼末尾還有一行“/bin/bash”就是說執行完安裝或開啟ssh指令碼後,執行bash,留著終端這個程式,不然容器會自動退出。
這樣就可以做到一開啟容器,就能自動開啟ssh啦
到此這篇關於利用VSCode進行遠端Linux伺服器、容器開發,達到ide開發專案的效果的文章就介紹到這了,更多相關VSCode遠端Linux伺服器開發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45