使用適用於 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安裝方法。