在Windows上溫馨地使用Linux子系統(一):WSL的安裝及配置

WSL介紹

使用適用於 Windows 的 Linux 子系統,開發人員可運行 GNU/Linux 環境 (包括大多數命令行工具、實用程序和應用程序),直接在 Windows 上進行修改,而不會形成虛擬機的系統開銷。html

你能夠:node

  1. 選擇你最喜好的 GNU/Linux 發行版。
  2. 運行常見命令行的自由軟件,如grepsedawk,或其餘 ELF 64 二進制文件。
  3. 運行 Bash shell 腳本和 GNU/Linux 命令行應用程序,這包括:
    • 工具: vimemacstmux
    • 語言:Javascript/node.jsRubyPythonC /C++C# & F#RustGo 等。
    • 服務:sshdMySQLApachelighttpd
  4. 使用本身的 GNU/Linux 發行版包管理器安裝其餘軟件。
  5. 使用相似於 Unix 的命令行 shell 調用 Windows 應用程序。
  6. 在 Windows 上調用 GNU/Linux 應用程序。

WSL安裝

Microsoft Docs官方安裝方式

微軟官方提供了2種安裝方式:Microsoft Store商店安裝以及下載.appx安裝包自行安裝,不過這2種方式都不能自定義安裝位置,官方的wsl.exe功能也比較少,不方便管理wsl子系統。不過這裏仍是貼上連接:git

適用於 Linux 的 Windows 子系統文檔github

使用第三方開源軟件LxRunOffline

這是一款很是強大的wsl管理軟件,具備 自定義安裝wsl卸載已安裝的wsl查看已安裝的wsl轉移已安裝的wsl系統的位置備份/導出wsl設置wsl默認登陸用戶 等實用功能。具體的安裝&使用方法能夠參考下面這篇文章,講的很是詳細:shell

使用 LxRunOffline 優雅的管理 WSL:轉移目錄、備份、設置默認用戶json

使用Windows-Terminal來啓動終端

使用官方方式安裝wsl有一個優勢:安裝完成後,會有一個專門用於wsl子系統的Terminal終端,以下圖所示:ubuntu

官方的wsl終端

然而使用LxRunOffline安裝後,彷佛只能使用Windows祖傳的cmd,經過輸入wsl或者bash來啓動wsl,有點使人不爽。vim

好在微軟在2019年發佈了一款全新的終端應用程序:Windows Terminal,它同時適用於cmd命令提示符powershellwsl等其餘shell命令交互的用戶。windows

安裝

打開微軟應用商店,搜索Windows Terminal安裝便可。(須要更新win10的版本到最新的1903緩存

設置默認shell

默認狀況下,打開Windows Terminal時,會使用powershell,雖然能夠經過新增一個標籤頁來使用wsl,但有強迫症的我仍是有些不爽,那麼,如何設置默認的shellwsl呢,其實很簡單,方法以下:

  1. 打開Windows Terminal,查看本系統上已經安裝的shell種類,找到你以前安裝的wsl,記住它的名字,而後打開Settings設置,如圖:

    設置默認shell(一)

  2. profiles.json中,找到wsl對應的配置區域中的guid字段,而後將defaultProfile字段的值改成此guid的值,如圖:

    設置默認shell(二)

  3. 保存並退出,重啓Windows Terminal

添加到右鍵菜單

若是要實現以下的效果:

右鍵打開windows terminal

須要執行的操做以下:

  1. 下載Windows Terminal的圖標,而後存放到一個地方:terminal.ico

  2. 新增一個.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"
    複製代碼
  3. 保存,而後修改後綴名爲.reg,而後雙擊運行。

  4. 打開Windows Terminal,點擊Settings,在對應shell的配置區域中新增一個字段 "startingDirectory": null,保存,而後就能夠了。如圖:

    右鍵打開windows terminal(二)

若是要從右鍵菜單移除的話,只須要打開註冊表,找到 HKEY_CLASSES_ROOT\Directory\Background\shell\wt 而後把整個 wt 刪除便可。

其餘設置

其餘有關windows terminal的自定義改造,好比更改字體、主題、透明度、光標等等樣式之類的,可參考下面這些github上的官方文檔:

Windows Terminal用戶文檔

使用JSON來進行用戶自定義設置

Profiles.json配置文檔

互操做性

文件訪問

WSL 的一個優勢是, 能夠直接訪問Windows文件系統中的文件。

WSL 將計算機的固定驅動器掛載到 Linux的 /mnt/<drive>文件夾下。好比,你的C:盤驅動器掛載在/mnt/c/下。

不要在Windows下直接訪問WSL Linux文件系統中的文件,一個比較好的作法是:在Windows文件系統下單首創建一個文件夾,這個文件夾下存放着Windows和WSL都須要訪問的文件,而後無論哪一方對文件作了變更,另外一方均可以實時共享。

從Windows命令行運行Linux工具

使用wsl.exe <command>從 Windows 命令提示符 (CMD 或 PowerShell) 運行 Linux 二進制文件或命令。例如:

windows命令行執行WSL Linux工具

從WSL運行Windows工具

WSL 可使用[binary name].exe從 WSL 命令行直接調用 Windows 二進制文件。 例如, notepad.exe 。 爲了使 windows 可執行文件更易於運行, windows 路徑包含在$PATH秋季創意者更新中。例如:

從WSL執行Windows程序

更換國內軟件源

個人是Ubuntu 18.04系統的wsl,使用的是清華軟件源,更換方法以下:

  1. 複製如下內容:(若是你的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
    複製代碼
  2. wsl中執行如下命令:

    sudo vim /etc/apt/sources.list
    
    ### 進入vim普通模式
    
    	輸入 ggdG 清空文件內容
    	而後輸入 i 進入編輯模式
    	直接點擊 鼠標右鍵 將以前複製的內容粘貼進來
    	而後按 ESC 鍵退出編輯模式
    	輸入 :wq 來退出vim
    	
    ### 退出vim,回到shell
    
    sudo apt update && sudo apt upgrade
    複製代碼

配置中文環境

設置系統語言-區域(locale)爲中文-中國

執行locale -a命令查看已安裝的locale,如圖:

設置locale(一)

若是沒有安裝zh_CN的話,執行locale-gen zh_CN.utf8命令來安裝。

安裝完成後,執行update-locale LANG=zh_CN.UTF-8命令來將系統locale切換到中文-中國環境。

能夠執行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
複製代碼

爲WSL安裝SSH-Server

在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
複製代碼

使用X Window讓WSL運行GUI圖形程序

LinuxX Window圖形系統是一個經典的Server/Client架構。在系統中如Firefox等須要顯示GUI界面的應用程序,其實是做爲客戶端即X Client,這些程序在編寫的過程當中天然須要調用與界面顯示相關的API,但這些API實質上只是一層封裝,它真正作的事情是發送大量繪圖相關的底層指令。而真正在調用顯卡等硬件資源進行窗口繪圖等實際操做的,則是另一個獨立的X Server服務端,它能夠看做是一個獨立的服務器程序。這二者經過正常的網絡協議進行通訊,服務端接收到客戶端的繪圖指令以後,在屏幕上繪製圖像。

經過上面的介紹,咱們能夠了解到:在以前的ssh鏈接中,wsl是做爲server來被鏈接,而在X Windows中則偏偏相反,wsl是做爲client來向X Server發送繪圖請求。

下面是以本機Windows做爲X ServerWSL做爲X Client的配置方法。固然,X Server不必定非得是本機Windows,也能夠是遠程機器,配置方法是同樣的,只須要改一些參數就能夠了。

WSL配置X Client

Linux系統中,環境變量DISPLAY用來指示這些繪圖指令被髮送到的地址和端口,它的值的格式以下:

hostname:D.S
複製代碼
  • hostname:表示X Server所在主機的域名或者IP地址,好比說本機Windows,那它的值就是localhost或者127.0.0.1。若是省略,那就表示本機localhost
  • D:它能夠理解爲X Client的一個編號,由於對於每個X鏈接,X Server端都會分配一個監聽端口來對應着每個X Client,映射關係是:listen port = 6000 + <D>。若是隻有一個X Client,那就是0;若是有多個X Client鏈接到一個X Server,那麼每一個X Client的編號值就是依次遞增。
  • S:屏幕編號。一臺機器可能鏈接了多個屏幕,每一個屏幕從0開始編號加以區分,這個參數用來指示圖形應該顯示在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

Windows下X Server的實現軟件有不少,這裏選擇了VcXsrv,緣由是比較新,更新也比較頻繁。安裝配置方法以下:

  1. 下載並安裝VcXsrv
  2. 打開XLaunch進行配置,過程以下:

配置VcXsrv

在個人電腦上,若是不關閉 [native opengl] 選項,在wsl中打開GUI軟件時會報錯。

  1. 之後若是要運行X Server,直接在桌面打開config.xlaunch就能夠了。X Server是在後臺運行的,若是要關閉,在任務欄找到其小圖標,右鍵關閉便可。

測試配置是否成功

隨便在wsl中運行一個GUI圖形程序便可,好比:

使用XWindow在wsl中運行GUI程序

其餘一些問題

如何終止正在運行的WSL

Windows開機後,當咱們第一次打開wsl.exeWindows 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,光標切換相關的問題

這個問題可謂是頭疼了我很久,由於我發如今wsl中運行vim,光標不會在不一樣的模式下切換,一直跟shell中保持同樣的形狀,很差區分。而後在.vimrc中將普通模式的光標改成方格形狀後,退出vim回到shell模式光標又沒有變回來,在google上搜了很久,折騰了好幾天,最終總算解決了。下面給出配置方法:

  1. 首先給出不一樣光標形狀對應的數字編號:

    1 2 3 4 5 6
    閃爍塊 █ 塊 █ 閃爍下劃線 ▁ 下劃線 ▁ 閃爍豎線 ┃ 豎線 ┃
  2. 更改shell命令交互模式時的光標形狀,這個應該是在每一個終端的設置裏面改的,不一樣的終端可能不同,windows Terminal的更改光標形狀可參考其餘設置

  3. 肯定你在不一樣模式下想要的光標形狀,就拿我本身來講,個人習慣是:shell命令交互下光標形狀是5vim普通模式下是1,插入模式下是5,替換模式下是3。肯定了需求以後,就能夠進行配置了。

  4. 打開~/.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"
    複製代碼
  5. 最後的效果:

    WSL vim光標配置

Windows Terminal沒法輸入中文

這個終端目前還處於Preview狀態,因此bug缺陷什麼的仍是有點多,最大的一個問題就是無論是在Windows Terminal上運行cmdpowershell仍是wsl等其餘shell,都沒法切換爲微軟拼音來輸入中文,這個bugWindows Terminal的官方的github倉庫上已經開了一個issue,感興趣的能夠去關注一下進展:CJK IME doesn't work #2213

若是你實在是要在wsl中常常輸入中文,能夠換一個其餘的終端,好比wsl-terminal,有官方中文教程,使用起來也還不錯,連接:wsl-terminal安裝方法

相關文章
相關標籤/搜索