对于计算机研究生而言,一般在实验室都有配备的GPU服务器用于深度学习之类的开发(作者现在都才只有台1070的旧机子,哭泣有了一块RTX2080了!)。在很多情况下都有远程开发的需求,比如:晚上在寝室想改一下代码继续跑实验、周末在寝室摸鱼不想去实验室、实验室公用一台电脑当面不好操作等。
本文将详细讲解我采用的一些远程开发方法,其中需要用到的工具有:
所谓内网穿透,就是将内网的主机映射到公网中,使得我们可以在任何地方都访问到该主机,一种简单的方法就是使用花生壳等软件实现,虽然操作简单,但是有着流量限制且该公司网页也让人感觉不太靠谱。所以还是自己来做比较好。
本文主要采用了frp开源软件来完成内网穿透的功能。frp软件需要我们在公网服务器和本地服务器各开一个程序,公网服务器使用frps程序,本地服务器使用frpc程序。大致的结构为:
用户访问公网服务ip,frps程序判断监视服务器端口,发现有用户的访问,将数据包发送给指定的端口服务程序。该端口由本地服务器的frpc与之通信,故数据包会发送到本地服务器上,这样就实现了在任意地点访问实验室服务器。
公网服务器(阿里云等):将frps和frps.ini传到服务器上,修改frps.ini文件,这里使用了最简化的配置:
#frps.ini[common]bind_port=7000这里表示服务端监听端口为7000,在服务端启动frps程序:
./frps-c./frps.ini本地服务器(带有GPU的机器):修改内网服务器frpc.ini文件,假设frps所在服务器的公网IP为x.x.x.x;
#frpc.ini[common]server_addr=x.x.x.xserver_port=7000[ssh]type=tcplocal_ip=127.0.0.1local_port=22remote_port=6000common里面需要填入服务端的ip地址与监听端口号,与frps.ini中的对应。ssh配置内填写本地ssh地址与端口,并指明远程访问的端口。
接着在本地服务器运行:
./frpc-cfrpc.ini运行后,我们在其他的电脑即可使用:
ssh-oPort=6000username@x.x.x.x访问到实验室内网的服务器,username为内网服务器用户名。
无论是在哪个服务器运行frp程序,他都是关掉ssh或者关掉终端就会停止,建议做成守护进程,以下是一些推荐的方法,按照简单到复杂排列:
supervisor比较简单,写好脚本每次开机都会自启动。
通过SSH穿透,那么我们就可以在本地很轻松的连接到了服务器,那么一些基本的bash指令就可以使用了,但是如何进行在线代码编辑呢,这里就要结合VSCode来使用了。VSCode在最新的版本中提供了一系列remotedev插件,也就是远程开发插件,这一系列插件提供了wsl、docker、ssh等跨环境通信服务。我们这里主要使用了ssh功能。
首先,在计划连接的主机上(内网服务器)配置基于密钥的身份验证,方法是将本地公共SSH密钥添加到主机上的~/.ssh/authorized_keys。
这一步骤的详细过程为:
ssh-keygen-trsa-b4096在macOS/Linux上,在本地终端中运行以下命令,根据需要替换用户名和主机名。
ssh-copy-idyour-user-name-on-host@host-fqdn-or-ip-goes-here在Windows上,在本地命令提示符中运行以下命令,并根据需要替换REMOTEHOST的值。
$REMOTEHOST="your-user-name-on-host@host-fqdn-or-ip-goes-here"scp"$env:USERPROFILE\.ssh\id_rsa.pub""${REMOTEHOST}:~/tmp.pub"ssh"$REMOTEHOST""mkdir-p~/.ssh&&chmod700~/.ssh&&cat~/tmp.pub>>~/.ssh/authorized_keys&&chmod600~/.ssh/authorized_keys&&rm-f~/tmp.pub"Note:因为不是采用的22端口,因此在scp和ssh指令后面都需要在加上-oPort=6000指定端口号。
打开vscode,在插件处搜索remotessh,安装结果的第一个插件。
安装完成后左侧工具栏会出现一个新加的图标,点击后,选择connection的Configure选择本地的设置文件。选择第一个文件即可。
该文件是一个空白文件,按照以下格式写如配置文件:
HostComputerNameUserusernameHostNamex.x.x.xPort6000hostname输入公网ip,host处的ComputerName可以替换成任意名称(注意不要写括号和中文字符)。
点击左下角,或者TARGETS(SSH)里面的对应主机即可连接到远程服务器,拥有等同于本地开发的体验。
对于使用Python进行数据挖掘与数据分析的人员而言,JupyterNotebook是一个非常棒的工具,它可以在本地开启一个Web服务器供我们在本地网页进行编写程序。那么我们可不可以将该服务映射到公网使得在任意地点进行开发呢,答案当然也是可以的。这一功能也采用frp软件来进行实现。
对于公网服务器而言我们不需要什么额外的配置了,而对于本地的服务器,我们需要对frpc.ini增加配置。
接下来我们需要对jupyter的一些设置进行修改,因为默认的jupyter只能在本地访问。这一部分的配置与网上的大部分教程类似,主要分为三步:
生成配置文件相对比较简单,在终端输入以下命令,生成的配置文件会被保存到~/.jupyter/jupyter_notebook_config.py
jupyternotebook--generate-config接着是生成密码,从jupyternotebook5.0版本开始,提供了一个命令来设置密码:jupyternotebookpassword,生成的密码存储在jupyter_notebook_config.json。
最后是修改配置文件,使用编辑器打开配置文件,主要修改以下几行
c.NotebookApp.ip='*'c.NotebookApp.open_browser=False此时在终端启动jupyternotebook指令,我们就可以在公网进行访问jupyter网页了。
既然将服务器暴露在了公网,那么安全也是非常重要的一个要做,因此如果希望后续继续进行探索和研究,可以从以下几个方面: