WSL环境安装配置

早在大三上系统级程序设计课程的时候,就通过老师的演示了解到 Windows 的新产品—— Windows Subsystem for Linux(WSL), 可以在 Windows 系统下运行 Linux 系统的程序或命令。不过当时我的旧电脑上装了 Ubuntu 的双系统,所以一直没有尝试。现在换了新电脑之后,一直没有装回 Linux 系统,一是怕麻烦不太想折腾,二是不太想划分硬盘空间。于是干脆就装一个 WSL 吧,尽管现在还没实际使用 Linux 系统的需要,不过就暂时当一个玩具吧。

优点

WSL 还是挺爽的,还没用就感觉优点满满:

  1. 安装简单。简直是傻瓜式的操作,就在系统设置中开启一下,在商店中搜索下载即可,跟在应用商店下个 app 差别不大,而且 Windows Store 的下载速度惊人,非常快就能装好。另外,也不需要考虑任何的驱动兼容问题,少了很多奇奇怪怪的问题。
  2. 空间友好。我下的 Ubuntu 系统才 200+MB, 相比于普通的带 GUI 的 Linux 操作系统,可谓是不占空间一样。另外最关键的一点是,WSL 系统的所有文件都是放在系统盘中,不需要自己另行划分磁盘空间来放置系统。这个点我觉得太赞了,之前装 Linux 双系统最为麻烦的一点就是要专门划分空间,从原有的磁盘中分出空闲空间来专门服务于 Linux 系统,怎么分,分多少,都需要一番思考和设置。分得多吧又感觉浪费,分得少又会不够,到时加空间比较麻烦。
  3. 协同方便。因为 WSL 系统在 Windows 当中,两系统当中的文件都能够轻易地传输使用。之前的话,Linux确实可以通过挂载的方式访问 Windows 的文件,但反过来却不行,而且操作还有风险。当时有访问跨系统文件的需要时,还需要专门重启一下切换系统,又或者通过网页微信传输文件到手机作为中转。

安装

安装还是挺简单的,只要本机的 Windows 版本支持 WSL功能即可。

  1. 打开“启用或关闭 Windows 功能”,开启适用于 Linux 的 WIndows 子系统。这个可以通过在开始菜单搜索启用(qiyong)的拼音就出现了。

  2. 打开 Microsoft Store,搜索 WSL 则可以看到支持的所有 Linux 版本。选择其中一个,获取安装即可。安装后可以在开始菜单找到并打开,会自动开启该系统下的 bash 命令行界面。

配置

一个完美的开发运行系统,最关键的还是各种的软件或系统的配置,参考了网上的各种各样的文章,主要有下面的方面需要配置。我使用的是 Ubuntu 系统,不同的系统可能配置的具体方式会有出入。

软件源更新

Ubuntu 软件安装/更新源均在国外,下载速度感人,所以可以将所有软件源更换为国内的镜像。这里选择的是阿里云的源。首先将原来的源文件备份,然后更改源文件,将内容换成阿里云的源链接。

1
2
sudo cp /etc/apt/sources.list  /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list

通过 vim 修改源文件,将文件内容更改为下面内容

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

保存后更新

1
2
sudo apt update
sudo apt upgrade

Nodejs

安装方法可以参考这里。Linux 上面有三个方法,一是直接下载编译后的包来使用,下载后建立链接;二是通过下载源代码来编译构建;三则是使用 apt-get 命令直接安装。我当然是选择了最简单的 apt-get 命令安装大法。两行命令搞定。

1
2
sudo apt-get install nodejs
sudo apt-get install npm

安装后可以通过查看版本号测试是否成功

1
2
3
4
$ node -v
v0.10.25

$ npm -v

我的 node 的确成功安装并测试,但是 npm 却没有,输入命令时提示如下,似乎是命令调用错误,通过 which 命令查看时发现调用的是在 Windows 系统的 npm,着实奇怪。

1
2
3
4
5
6
7
$ npm -v
: not foundjs//npm: 3: /mnt/d/nodejs//npm:
: not foundjs//npm: 5: /mnt/d/nodejs//npm:
/mnt/d/nodejs//npm: 6: /mnt/d/nodejs//npm: Syntax error: word unexpected (expecting "in")

$ which npm
/mnt/d/nodejs//npm

网上搜索了一下也很多人有类似的问题,GitHub 上面也很多人提了 issue,尝试无果,最终选择换了个方式重新安装,随后解决。

  • GitHub issue :这里提到的方法主要是修改环境变量的顺序,确保先查找 WSL 安装的 npm 先被搜索到,尝试了一下没有用,which 命令测试也没有变化。

  • StackOverflow 上的重装大法 :将旧的移除后,用新建源的方法重新使用 apt-get 来安装。重新安装后测试成功

    1
    2
    3
    4
    5
    
    sudo apt-get --purge remove nodejs
    
    curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
    sudo apt-get install -y nodejs
    sudo apt-get install -y build-essential
    

zsh and oh-my-zsh

之前各种的 Linux 系统,无论是服务器还是桌面系统,都是使用自带的 bash,但是大家都说别的 shell 终端更好,于是就干脆试试大家都在推荐的 zsh。

  1. 可以通过命令cat /etc/shells查看本机是否有 zsh,有的话可以直接跳到 3
  2. 如果没有的话,使用 apt-get 安装即可 sudo apt-get install zsh
  3. chsh -s /usr/bin/zsh 通过命令切换到 zsh,重启终端即可
  4. 初次进入 zsh 会提示你需要进行配置文件的创建与配置,我们这里使用 oh-my-zsh 来提供配置

获取 oh-my-zsh 的方法则比较简单,通过 curl 或者 wget 的方式获取 shell 脚本后执行即可。

1
2
3
4
5
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# or

sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

但这里我怎么也搞不下来,两种方式都不能建立链接,获取不到这个脚本,自然无法进行后续的安装处理。原因似乎是国内的网络环境因为你懂的原因无法访问这个网址 ,估计走代理的话应该可以解决。所以我采用的方法是在 WIndows 系统下好这个 shell 脚本,然后在 WSL 里面运行,问题解决。之后就可以通过在配置文件 ~/.zshrc里面设置主题里,可选的主题及效果可以点此选择

我选的是 ys,这里要吐槽一句,不知道为什么网上看到的预览图片,跟我实际使用的效果相差太大了,有些甚至对使用造成了影响,例如主题 agnoster ,显示的实际颜色与下面的样例图出入太大了,在 WSL 里面打开就是目录显示的是深蓝色,深到看不清楚里面的字那种,尽管我挺喜欢这种风格的,但因为影响到实际使用了,只能放弃。

官方网站以及大多数经验分享文章中的 agnoster 主题效果

这是我用主题 agnoster 的效果图。

这是我最终选择的主题 ys 的效果


发现了为啥我的颜色跟网上看到的不一致,原来是需要设置额外的配色,将某些颜色映射为其它色号。我用的是 Windows Terminal,设置配色比较简单,只要在配置文件的 schemes 属性中添加配色主题,再在想要设置配色的终端设置 color-scheme 即可。配色主题可以到这个 GitHub repo 上面挑选。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
   // powershell 的设置项
   "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
   "name": "Windows PowerShell",
   "commandline": "powershell.exe",
   "fontFace":  "Cascadia Code PL",
   "colorScheme": "OneHalfDark", //选择的配色名称
   "hidden": false
}

// ...
{  //使用的配色主题, 有些颜色觉得不太行就注释掉,也可以自行修改
   "name": "OneHalfDark",
   // "black": "#282c34",
   "red": "#e06c75",
   "green": "#98c379",
   "yellow": "#e5c07b",
   "blue": "#61afef",
   "purple": "#c678dd",
   "cyan": "#56b6c2",
   "white": "#dcdfe4",
   // "brightBlack": "#282c34",
   "brightRed": "#e06c75",
   "brightGreen": "#98c379",
   "brightYellow": "#e5c07b",
   "brightBlue": "#61afef",
   "brightPurple": "#c678dd",
   "brightCyan": "#56b6c2",
   "brightWhite": "#dcdfe4",
   "background": "#282c34",
   "foreground": "#dcdfe4"
}

oh-my-zsh插件

自带的插件只需要在配置文件中添加即可,我这里添加了:

  • z:路径自动推测跳转 z dir
  • extract:解压所有类型文件 x file
  • git:简化了 git 的常用命令
  • npm:npm 命令的自动补全

额外下载的插件则需要下载源代码到 ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins目录下面

  • zsh-syntax-highlighting:自动语法高亮
  • zsh-autosuggestions:自动补全建议
  • git-open:打开 git remote

代理

Simple

因为我国的独特网络环境,在访问某些网站的时候速度比较感人,有些时候甚至还不能访问,因而需要一些比较科学的方法来访问互联网,这里设置的代理,本质还是让网络请求通过本机(Windows 系统)的工具进行网络请求。在 zsh 的配置脚本~/.zshrc中添加下面别名即可,里面的端口和协议根据自己的工具具体设置。设置后添加别名 proxy 开启,通过 unproxy 关闭。

1
2
alias proxy='export http_proxy=socks5://127.0.0.1:1080; export https_proxy=socks5://127.0.0.1:1080'
alias unproxy='unset http_proxy; unset https_proxy'

添加后通过source ~/.zshrc 激活,输入 proxy 后即可打开某些不可访问的网站测试一下。

zsh-proxy

在实际使用中发现,上面这样的简单的方式在某些地方虽然可行,但是有些地方在实际使用上面却会有问题,例如我在使用 wget 获取网络资源时会提示 socks5 识别不了,说是 wget 并不支持 socks 协议。另外,一些需要频繁访问网络的命令,如 git,npm 等似乎有着自己独特的代理设置方式。没办法,一个 wget 就逼着不得不改变。搜了几个方法之后,最终选择了一个 zsh 插件zsh-proxy来实现代理功能。

使用方法很简单

  1. 将插件脚本 clone 到本地

    1
    
    git clone https://github.com/sukkaw/zsh-proxy.git ~/.oh-my-zsh/custom/plugins/zsh-proxy
    
  2. 在配置文件~/.zshrc的插件项中添加插件 zsh-proxy

  3. 激活配置文件

    1
    
    source ~/.zshrc
    
  4. 通过命令init_proxy进行初始化配置,按照提示输入自己的 http 代理和 socks5 代理即可

  5. 配置完成后通过命令操作即可

    • proxy: 开启
    • noproxy: 关闭
    • myip: 查看代理的 ip

走代理的速度还是挺爽的,我用 wget 下载 Miniconda,虽然才 80 多兆,但不走代理才 30-40Kb 每秒,开启代理每秒 3M 多,半分钟不到就下完。

Python

以前的人都说,Python 在 Linux 环境不需要折腾这么多官方,而我在 Windows 下面进行 Python 项目的开发也确实或多或少地遇到一些小问题,尤其是 package 的安装和管理,使用 pip 的时候莫名其妙地就失败。不过这些问题在开始的时候折腾过后一般就不再发生,尤其是我使用 conda 进行包管理之后,基本很少发生。

除了可能有奇奇怪怪的的错误之外,使用 Linux 系统开发的好处就是能够接近实际的部署生产环境。因为现在使用的服务器大多都是使用 Linux系统,在相似的环境下开发,部署起来更加方便。

我也试过跑到 Linux 下面进行 Python 的软件开发,有着 Pycharm 的支持,开发效率也还不错。不过主要的问题是,非开发工具的效率和便利性确实不行。~~就像是简单地从别人那接收一个 QQ 发过来的文件,我需要从手机 QQ 中接收保存下来,再通过微信发送给在 Linux 系统中登录的网页微信。一两次都还好,经常这样的话简直灾难,尤其是某些应用的网页端 app 简直是残废。~~有些沟通交互实在麻烦,而且开发过程中的休息与娱乐也比较困难,使我难以坚持下来。

WSL 似乎就能完美解决这个问题(当然确实云服务器也可以,但就我能负担的云服务器的硬件配置加网络,可能性能还不如虚拟机),双系统完美交互。确实可以考虑把一些 Python 项目的开发和运行丢到这里。

说了一堆废话,下面看看安装。机器本身就自带 Python2 和 Python3,不过我现在比较偏向于使用 conda 作包管理和虚拟环境管理,就打算重新下一个 Anoconda。不过完整的 Anoconda 体积庞大,包含了很多不必要的科学计算库,这里选的是 Miniconda。安装也是傻瓜式。

  1. 获取安装脚本。建议开启代理,不然速度感人,又或者你在 WIndows 系统下好再在 WSL 里面执行也可以

    1
    
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
    
  2. 赋予执行权限。

    1
    
    sudo chmod 777 Miniconda3-latest-Linux-x86_64.sh # 直接全给权限了
    
  3. 执行安装脚本。安装过程中会出现若干的配置提示信息,包括安装路径等。

    1
    
    ./Miniconda3-latest-Linux-x86_64.sh
    
  4. 添加环境变量。将export PATH=/home/YOURNAME/miniconda3/bin/conda:$PATH 放到你的 bash 配置文件中。我放到了 zsh 的配置文件 ~/.zshrc中。添加后重新启动,或者激活配置文件即可

待填坑

  • ✅ Python。Ubuntu18 自带了 Python2 和 Python3。我已经不再使用 Python2 了,而 Python2 把 Python和 pip 的命令默认调用都占用了,考虑移除 Python2,或者搞一个 Anoconda 来做环境管理。
  • ❌ C/C++ 环境​。想好好学习一下 C++,之前因为 Windows 环境的原因,不得不装了个巨占空间的 Visual Studio,然后到现在还没写过一行 C++ 代码。有点想把它删了,在这里搞个 LLVM/clang 编译器。

命令与快捷键

记录一下一些较为常用和实用的命令和快捷键这里

命令

  • x file:解压任意类型文件(需要添加 extract 插件
  • z dir:根据给出的目录进行跳转
    • 不一定是完整的,可能只是最后一级
    • 效果感觉一般,感觉需要吃历史记录的,很多新目录访问都完成不了
    • 看了一些分析,说是要经过过往的 cd 跳转来获取经验的

快捷键

好像是仅适用于 zsh

  • ctrl + u:清空当前行命令
  • ctrl + a:跳到行首
  • ctrl + e:跳到行尾
  • ctrl + k:删除光标到行尾内容