配置远程Linux云服务器+可视化环境
一直希望能像“黑客军团”里的男主那样,随时随地就可以开始hack。后来才逐渐发现,他实际上登录的是一个远程服务器,在已经配置好的服务器上,开始hack&工作。
并且,联系到最近我在学习机器学习,也需要这样一个独立的环境(因为Linux主机带来带去的确是太笨重了)方便我在移动中办公和学习。
因此就萌生了这样一个想法,但是实施起来却非常困难,好在已经打通了一条路子。本文的目标是:使用阿里云ECS的主机(Ubuntu 14.04),搭建一个Python环境,并且可以实现可视化(例如可以运行matplotlib),我可以通过mac、linux、windows在远程任意地实现可视化和命令行的操作,进行机器学习。
1. 配置云服务器
这部分不多说,就是在阿里云上面买一台ECS服务器,然后配置好root密码就可以了。镜像选用公共镜像-Ubuntu 14.04。这是一个妥协的选择,显然16.04更好,但似乎没有找到可供参考的安装教程,因此就会麻烦一些(14.04的python版本很老,需要编译安装python, python-setuptools)。
顺便也可以学习一下如何配置,增长Linux知识。
首先打开terminal,使用ssh连接服务器:
$ ssh root@ip
$ password of root
首次打开的时候会询问是否保存秘钥,如果服务器系统重置了,需要删除这个秘钥才能够正常登陆:
$ cd ~/.ssh
$ rm known_hosts
登录以后第一件事情是更新apt-get源:
$ apt-get update
这一步操作非常重要
2. 配置Python开发环境
下面开始配置Python开发环境。直接打开python我们可以发现,Ubuntu 14.04的python版本是2.7.6,非常低,而且也不能使用apt-get或者pip安装matplotlib,总之问题非常多。我本能地感觉到需要重新编译安装一个高版本python,并且给它配置一个对应的pip。
因此我们的目标是:
- 编译安装另一个版本的python
- 编译安装setuptools,也就是easy_install
- 使用easy_install安装对应的pip
- 使用这个pip安装matplotlib等机器学习库
- 创建软链接(快捷方式)
2.1 编译安装非系统自带的python
首先是编译安装python
请参考这篇文章
先apt-get安装编译的依赖,然后是去python官网下载源代码,这里我使用的是2.7.13,再是编译安装。注意第2步里面需要改变文件名:
$ ./configure --prefix /usr/local/lib/python2.7.13 --enable-ipv6
这样就装到/usr/local/lib/python2.7.13
下面了。
2.2 安装python-setuptools
顺着这篇文章下去,setuptools似乎是因为墙或者别的原因,安装不下去了,因此要用源代码编译方式安装setuptools。(对于这个情景,我不推荐apt-get的安装方法,因为天知道setuptools会被安装到哪个python下面去)
请参考这篇文章
先把全文看完,再安装,后面有一步操作要放到前面来:
$ apt-get build-dep python
接着在google搜索setuptools下载最新版源代码包就可以了。这里的关键是第3步,要用相应的python(前面编译的非系统python)来编译setuptools,也就是将easy_install和我们自己的python版本一一对应:
$ /usr/local/lib/python2.7.13/bin/python setup.py build
这样就将python2.7.13和easy_install对应起来了。
然后顺利编译安装,/usr/local/lib/python2.7.13/bin/
下面就可以执行easy_install
了。
2.3 安装非系统自带python对应的pip
接着回到上面的那篇文章中来,我们需要使用这个新的easy_install安装对应的pip,然后利用这个新的pip安装各种包。请注意由于我们安装了新的python2.7.13,环境变量已经发生了变化,因此:
$ /usr/local/lib/python2.7.13/bin/easy_install pip
$ /usr/local/lib/python2.7.13/bin/pip install ***packages
这样就可以顺利正确配置python并安装matplotlib、numpy等包了,否则你会遇到各种报错。
2.4 创建软链接
最后为了方便,我们还需要创建软链接,总不能每次都使用/usr/local/lib/python2.7.13/bin/...
这条命令吧。
这里的原理是:linux在执行bin的时候,是按照 /usr/bin/
->/usr/local/
顺序往下读的。这意味着输入easy_install会先从/usr/bin/
下面寻找,因此我们只需要在优先级最高的/usr/bin/
下面创建一个软链接,链接到我们需要python版本对应的easy_install和pip真实bin文件下就可以了:
$ ln -s /usr/local/lib/python2.7.13/bin/easy_install /usr/bin/easy_install
$ ln -s /usr/local/lib/python2.7.13/bin/pip /usr/bin/pip
左侧是真实bin,右侧是快捷方式的bin。
这样就可以直接输入easy_install
和pip
而不会去错位置了
当然我们也可以偷懒地:
$ ln -s /usr/local/lib/python2.7.13/bin/python /usr/bin/python13
或者
$ ln -s /usr/local/lib/python2.7.13/bin/python /usr/bin/python2.7.13
这样就可以使用
$ python13 / python2.7.13
打开我们自己的python环境了。
———-8月10日的补充————
我们还需要将/usr/local/lib/python2.7.13/bin
加入到我们的环境变量中,否则会出现pip安装报错的情况:
$ vim ~/.bashrc
加入:
export PATH=/usr/local/lib/python2.7.13/bin:$PATH
保存退出
$ source ~/.bashrc
3. 配置可视化环境
当然只有这些是远远不够的,例如matplotlib无法在非可视化环境下运行,因此我们还需要配置一个可视化环境。
3.1 linux环境配置部分
首先你安装的linux镜像是不带可视化界面的,因此需要安装可视化(GUI)环境:
可以参考这个教程
$ apt-get install x-window-system-core
$ apt-get install gnome-core
$ apt-get install gdm
非常简单,这就是使用Ubuntu 14.04的好处,亲测可用。
3.2 客户端环境配置部分
windows环境可以使用xshell+x-manager组合,具体就不说了,这里主要说mac环境下的配置方法。
可以参考这个教程
主要思路就是安装xQuartz这个软件(可视化环境,提供x11环境),调用方法是打开软件-打开application菜单栏-打开terminal,会打开一个bash的终端窗口,使用ssh
命令。或者是用mac自带的termianl,使用:
$ ssh -X root@ip
终端就可以调用xQuartz的x11环境了。
我们分别用matplotlib和firefox测试一下:
$ ssh -X root@ip
$ firefox
会打开linux服务器下的firefox,但奇卡无比,但至少成功了:
$ python13
>> import matplotlib.pyplot as plt
>> import numpy as np
>> plt.figure(1)
>> x = np.linspace(0, 3, 100)
>> plt.plot(x, np.exp(x))
>> plt.show()
然后就会使用xQuartz输出matplotlib绘制的图了:
亚克西!
3.3 配置jupyter notebook
使用一段时间以后发现一个问题:
- 在mac、windows上安装了X11环境,因此可以很方便地打开matplotlib生成的图,但是在linux上却不行。
- 用python命令行的方式来编程,非常不方便,尤其是机器学习写代码的时候需要一步一步地验证和修改,而我们又没有办法在远程使用pycharm这样的IDE。
但是我发现jupyter notebook可以很好地解决上述两个问题,唯一的不足是jupyter notebook里没法用制表键tab选出类库的信息。
下面开始教程:
我是参考这个教程来配置的。
1.首先是安装jupyter,jupyter在python2环境下需要安装ipython 5.0
$ pip install ipython==5.0
$ pip install jupyter
2.然后就照着教程安装就可以了,非常简单,亲测可用。
3.最后只需要进入主机,在命令行下输入:
$ jupyter notebook --allow-root
如果你没有输出环境变量,那么:
$ /usr/local/lib/python2.7.13/bin/jupyter notebook --allow-root
jupyter notebook就运行在你ECS:ip:8888下了。
然后打开浏览器,输入:
ip:8888
就可以登录jupyter开发了。顺便安利一下jupyter,非常舒服,甚至可以用于开发。
4.最后完善一下
最后需要完善什么呢?这涉及到一个使用远程服务器一个很麻烦的地方:你不能断开命令行,否则程序就会终止(例如jupyter notebook),或者你在运行一个爬虫脚本,这样就不能关机了。
这里介绍tmux,tmux就是可以将terminal进程挂机运行的一个工具。
具体可以参考这篇文章
大致的方法就是:
1.现在登录远程服务器,安装tmux
$ apt-get install tmux
2.你可以创建一个自己的会话(具体的知识可以看上面参考的文章)
先退出当前会话:
$ tmux detach
然后创建会话:
$ tmux new -s your_session_name
然后就登入了你的会话,你还可以退出,再使用:
$ tmux a -t your_session_name
这里tmux detach
就是登出你的会话,就相当于将这个terminal窗口挂机运行。这样你就可以利用tmux实现jupyter notebook常驻运行了。
然后就可以随时随地,只要有一个浏览器,就可以做python开发了:)
是不是很酷?