使用适用于 Windows 的 Linux 子系统,开发人员可运行 GNU/Linux 环境 (包括大多数命令行工具、实用程序和应用程序),直接在 Windows 上进行修改,而不会形成虚拟机的系统开销。html
你能够:node
grep
, sed
, awk
,或其余 ELF 64 二进制文件。vim
、emacs
、tmux
。Javascript/node.js
、Ruby
、Python
、C /C++
、C# & F#
、Rust
、Go
等。sshd
、MySQL
、Apache
、lighttpd
。微软官方提供了2种安装方式:Microsoft Store
商店安装以及下载.appx
安装包自行安装,不过这2种方式都不能自定义安装位置,官方的wsl.exe
功能也比较少,不方便管理wsl
子系统。不过这里仍是贴上连接:git
这是一款很是强大的wsl
管理软件,具备 自定义安装wsl、卸载已安装的wsl、查看已安装的wsl、转移已安装的wsl系统的位置、备份/导出wsl、设置wsl默认登陆用户 等实用功能。具体的安装&使用方法能够参考下面这篇文章,讲的很是详细:shell
使用官方方式安装wsl
有一个优势:安装完成后,会有一个专门用于wsl
子系统的Terminal
终端,以下图所示:ubuntu
然而使用LxRunOffline
安装后,彷佛只能使用Windows
祖传的cmd
,经过输入wsl
或者bash
来启动wsl
,有点使人不爽。vim
好在微软在2019年发布了一款全新的终端应用程序:Windows Terminal
,它同时适用于cmd命令提示符
、powershell
、wsl
等其余shell
命令交互的用户。windows
打开微软应用商店,搜索Windows Terminal
安装便可。(须要更新win10
的版本到最新的1903
)缓存
默认状况下,打开Windows Terminal
时,会使用powershell
,虽然能够经过新增一个标签页来使用wsl
,但有强迫症的我仍是有些不爽,那么,如何设置默认的shell
为wsl
呢,其实很简单,方法以下:
打开Windows Terminal
,查看本系统上已经安装的shell
种类,找到你以前安装的wsl
,记住它的名字,而后打开Settings
设置,如图:
在profiles.json
中,找到wsl
对应的配置区域中的guid
字段,而后将defaultProfile
字段的值改成此guid
的值,如图:
保存并退出,重启Windows Terminal
。
若是要实现以下的效果:
须要执行的操做以下:
下载Windows Terminal
的图标,而后存放到一个地方:terminal.ico
新增一个.txt
文本文本文档,输入以下内容:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\Background\shell\wt]
@="Windows Terminal here"
"Icon"="你刚才下载的图标的存储路径\\terminal.ico"
[HKEY_CLASSES_ROOT\Directory\Background\shell\wt\command]
@="C:\\Users\\你本身的用户名\\AppData\\Local\\Microsoft\\WindowsApps\\wt.exe"
复制代码
保存,而后修改后缀名为.reg
,而后双击运行。
打开Windows Terminal
,点击Settings
,在对应shell
的配置区域中新增一个字段 "startingDirectory": null
,保存,而后就能够了。如图:
若是要从右键菜单移除的话,只须要打开注册表,找到 HKEY_CLASSES_ROOT\Directory\Background\shell\wt
而后把整个 wt
删除便可。
其余有关windows terminal
的自定义改造,好比更改字体、主题、透明度、光标等等样式之类的,可参考下面这些github
上的官方文档:
WSL 的一个优势是, 能够直接访问Windows文件系统中的文件。
WSL 将计算机的固定驱动器挂载到 Linux的 /mnt/<drive>
文件夹下。好比,你的C:
盘驱动器挂载在/mnt/c/
下。
不要在Windows下直接访问WSL Linux文件系统中的文件,一个比较好的作法是:在Windows文件系统下单首创建一个文件夹,这个文件夹下存放着Windows和WSL都须要访问的文件,而后无论哪一方对文件作了变更,另外一方均可以实时共享。
使用wsl.exe <command>
从 Windows 命令提示符 (CMD 或 PowerShell) 运行 Linux 二进制文件或命令。例如:
WSL 可使用[binary name].exe
从 WSL 命令行直接调用 Windows 二进制文件。 例如, notepad.exe
。 为了使 windows 可执行文件更易于运行, windows 路径包含在$PATH
秋季创意者更新中。例如:
个人是Ubuntu 18.04
系统的wsl
,使用的是清华软件源,更换方法以下:
复制如下内容:(若是你的wsl
是其余系统,可前往清华大学开源镜像站选择相对应的源镜像地址)
# 默认注释了源码镜像以提升 apt update 速度,若有须要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
复制代码
在wsl
中执行如下命令:
sudo vim /etc/apt/sources.list
### 进入vim普通模式
输入 ggdG 清空文件内容
而后输入 i 进入编辑模式
直接点击 鼠标右键 将以前复制的内容粘贴进来
而后按 ESC 键退出编辑模式
输入 :wq 来退出vim
### 退出vim,回到shell
sudo apt update && sudo apt upgrade
复制代码
执行locale -a
命令查看已安装的locale
,如图:
若是没有安装zh_CN
的话,执行locale-gen zh_CN.utf8
命令来安装。
安装完成后,执行update-locale LANG=zh_CN.UTF-8
命令来将系统locale
切换到中文-中国环境。
能够执行locale
命令来查看当前系统的locale
配置信息,如图:
确保切换成功后,重启wsl
来使其生效。
若是没有中文字体的话,后面在经过X-Window
运行GUI
程序时,中文会所有显示异常。能够直接将Windows下的全部字体拷贝到wsl
中,命令以下:
# 将windows的字体放入wsl里,并更新缓存
sudo mkdir /usr/share/fonts/windows
sudo cp -r /mnt/c/Windows/Fonts/*.ttf /usr/share/fonts/windows/
fc-cache
复制代码
在Windows上安装了wsl
子系统后,若是咱们想要在另外一台电脑上远程访问此wsl
,则咱们能够经过为wsl
安装ssh server
来实现。
还有一种状况是在Windows上经过ssh
链接到本地的wsl
,有人说这不是画蛇添足吗,既然是在本地那我直接运行wsl
不就行了吗,干吗绕这么一圈。。。事实上我安装wsl
的目的就是为了学习Linux
,以及在CLion
上将wsl
做为构建工具链,由于wsl
是直接运行在Windows本地嘛,因此我原本觉得CLion
使用wsl
做为构建工具链是采用了一种特殊的方式,结果到配置界面一看,和Remote Host
形式的工具链是同样的,都是采用ssh
链接,说白了就是把wsl
看成远程主机来用。而后CLion
的官方使用说明里还提供了一个wsl
一键安装open-ssh server
并开机自启动ssh
服务的脚本,仍是比较方便的。好吧,那既然这样的话,就用官方的脚本吧,命令以下:
wget https://raw.githubusercontent.com/JetBrains/clion-wsl/master/ubuntu_setup_env.sh && bash ubuntu_setup_env.sh
复制代码
安装完成后,检查ssh
服务是否已处于运行状态以及链接是否没问题:(脚本里设置的端口是2222,也能够本身改)
/etc/init.d/ssh status
ssh username@localhost -p2222
复制代码
Linux
的X Window
图形系统是一个经典的Server/Client
架构。在系统中如Firefox等须要显示GUI界面的应用程序,其实是做为客户端即X Client
,这些程序在编写的过程当中天然须要调用与界面显示相关的API
,但这些API
实质上只是一层封装,它真正作的事情是发送大量绘图相关的底层指令。而真正在调用显卡等硬件资源进行窗口绘图等实际操做的,则是另一个独立的X Server
服务端,它能够看做是一个独立的服务器程序。这二者经过正常的网络协议进行通讯,服务端接收到客户端的绘图指令以后,在屏幕上绘制图像。
经过上面的介绍,咱们能够了解到:在以前的ssh
链接中,wsl
是做为server
来被链接,而在X Windows
中则偏偏相反,wsl
是做为client
来向X Server
发送绘图请求。
下面是以本机Windows
做为X Server
,WSL
做为X Client
的配置方法。固然,X Server
不必定非得是本机Windows
,也能够是远程机器,配置方法是同样的,只须要改一些参数就能够了。
在Linux
系统中,环境变量DISPLAY
用来指示这些绘图指令被发送到的地址和端口,它的值的格式以下:
hostname:D.S
复制代码
X Server
所在主机的域名或者IP地址,好比说本机Windows
,那它的值就是localhost
或者127.0.0.1
。若是省略,那就表示本机localhost
。X Client
的一个编号,由于对于每个X链接,X Server
端都会分配一个监听端口来对应着每个X Client
,映射关系是:listen port = 6000 + <D>
。若是只有一个X Client
,那就是0;若是有多个X Client
链接到一个X Server
,那么每一个X Client
的编号值就是依次递增。X Server
主机的哪一个屏幕上,默认就是0。能够将export $DISPLAY = value
环境变量加入~/.bashrc
里,避免每次打开wsl
都要从新添加,以本机Windows
做为X Server
的示例配置以下:
sudo vim ~/.bashrc
### 进入VIM
### 在末尾加入
export DISPLAY=localhost:0.0
### 退出VIM
source ~/.bashrc
复制代码
Windows下X Server的实现软件有不少,这里选择了VcXsrv
,缘由是比较新,更新也比较频繁。安装配置方法以下:
XLaunch
进行配置,过程以下:在个人电脑上,若是不关闭 [native opengl] 选项,在wsl中打开GUI软件时会报错。
X Server
,直接在桌面打开config.xlaunch
就能够了。X Server
是在后台运行的,若是要关闭,在任务栏找到其小图标,右键关闭便可。随便在wsl
中运行一个GUI
图形程序便可,好比:
Windows
开机后,当咱们第一次打开wsl.exe
、Windows Terminal
或者是在cmd
输入bash
等等其余的方式,wsl
子系统就会启动。可是,当咱们将终端窗口关闭时,它只是将这个终端窗口程序以及bash shell
关闭了而已,wsl
仍是在后台运行着,不信你能够用ssh
链接试试看。并且你在wsl
中输入shutdown -h now
会提示System has not been booted with systemd as init system (PID 1). Can't operate.
,由于wsl
中不支持systemd
,因此这个方法也行不通。
经过查询官方文档得知,关闭wsl
仍是得使用wsl.exe
程序,在Windows
的命令行中输入:
wsl --terminate <DistributionName>
便可终止指定的wsl
系统。能够考虑写一个简单的powershell
脚本,若是不想每次都打开命令行输入的话,以下:(原本想写复杂点的,可是脚本中获取命令结果老是乱码,加上powershell语法我感受学起来很蛋疼,就随便写了个粗暴的)
$wsl_running = wsl --list --running
if($wsl_running.count -lt 5)
{
Read-Host "没有正在运行的WSL,按任意键继续..."
}
else
{
wsl --terminate ubuntu-wsl
Read-Host "已成功终止ubuntu-wsl,按任意键继续..."
}
复制代码
这个问题可谓是头疼了我很久,由于我发如今wsl
中运行vim
,光标不会在不一样的模式下切换,一直跟shell
中保持同样的形状,很差区分。而后在.vimrc
中将普通模式的光标改成方格形状后,退出vim
回到shell
模式光标又没有变回来,在google
上搜了很久,折腾了好几天,最终总算解决了。下面给出配置方法:
首先给出不一样光标形状对应的数字编号:
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
闪烁块 █ | 块 █ | 闪烁下划线 ▁ | 下划线 ▁ | 闪烁竖线 ┃ | 竖线 ┃ |
更改shell
命令交互模式时的光标形状,这个应该是在每一个终端的设置里面改的,不一样的终端可能不同,windows Terminal
的更改光标形状可参考其余设置。
肯定你在不一样模式下想要的光标形状,就拿我本身来讲,个人习惯是:shell
命令交互下光标形状是5,vim
普通模式下是1,插入模式下是5,替换模式下是3。肯定了需求以后,就能够进行配置了。
打开~/.vimrc
文件进行vim
配置,参考以下:
" 进入插入模式下的光标形状
let &t_SI.="\e[5 q"
" 进入替换模式下的光标形状
let &t_SR.="\e[3 q"
" 从插入模式或替换模式下退出,进入普通模式后的光标形状
let &t_EI.="\e[1 q"
" 进入vim时,设置普通模式下的光标形状
autocmd VimEnter * silent !echo -ne "\e[1 q"
" 离开vim后,恢复shell模式下的光标形状
autocmd VimLeave * silent !echo -ne "\e[5 q"
复制代码
最后的效果:
这个终端目前还处于Preview
状态,因此bug
缺陷什么的仍是有点多,最大的一个问题就是无论是在Windows Terminal
上运行cmd
、powershell
仍是wsl
等其余shell
,都没法切换为微软拼音来输入中文,这个bug
在Windows Terminal
的官方的github仓库
上已经开了一个issue
,感兴趣的能够去关注一下进展:CJK IME doesn't work #2213
若是你实在是要在wsl
中常常输入中文,能够换一个其余的终端,好比wsl-terminal
,有官方中文教程,使用起来也还不错,连接:wsl-terminal安装方法。