# **Windows Subsystem for Linux (WSL) 環境設定** ## 0. 目錄 第一篇:[WSL 原理介紹](https://hackmd.io/s/Bkh8oAmGX) 第二篇:本篇 第三篇:[WSL 補充內容](https://hackmd.io/s/SyL3pzzQm) 第四篇: ## 1. 安裝 Linux distro ### 1.1. 事前須知 首先請確認一下自己是否: * 使用 x64 的處理器 * 使用 Windows10 (S 不支援) * 版本為 1709 或更新版 * 了解基本的 Linux 命令列語法 * 勇於嘗試並尋找方法 **本教學適用 Ubuntu LTS 16.04 與 18.04** 歡迎搭配以下兩篇一起服用~ [Windows Subsystem for Linux 環境配置 (最新 1709 版)](https://medium.com/hungys-blog/windows-subsystem-for-linux-configuration-caf2f47d0dfb) [【WSL】Windows Subsystem for Linux 安裝及基本配置!](https://blogs.msdn.microsoft.com/microsoft_student_partners_in_taiwan/2017/10/03/wsltune/) WSL 更新資訊: * [WSL 官方 github](https://github.com/Microsoft/WSL) * [Release Notes](https://docs.microsoft.com/zh-tw/windows/wsl/release-notes?f=255&MSPPError=-2147217396) * [1703 版](https://blogs.msdn.microsoft.com/commandline/2017/04/11/windows-10-creators-update-whats-new-in-bashwsl-windows-console/) * [1709 版](https://blogs.msdn.microsoft.com/commandline/2017/10/11/whats-new-in-wsl-in-windows-10-fall-creators-update/) * [1803 版](https://blogs.msdn.microsoft.com/commandline/2018/03/07/windows10v1803/) ### 1.2. 啟用 Windows 設定 #### 方法 1: 使用**系統管理員**權限開啟 **Power Shell**,輸入下述指令: ``` Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux ``` 重新啟動電腦以完成安裝。 <img src="https://i.imgur.com/OOoF8Aj.png" width=100%> #### 方法 2: 到「控制台 > 程式集 > 程式與功能」,點擊「**開啟或關閉 Windows 功能**」。 <img src="https://i.imgur.com/gdkAqch.png" width=100%> 從開啟的小視窗中點選啟用「**適用於 Linux 的 Windows 子系統**」,確定後重新啟動電腦。 <img src="https://i.imgur.com/7EDYUfn.png" width=55%> ### 1.3. 設定 distro 打開 Windows 市集並搜尋 Ubuntu,沒有標註的預設會安裝**穩定版 LTS** (目前是 16.04),**App 更新不影響版本**,筆者這裡使用最新 18.04 版來說明。 <img src="https://i.imgur.com/RSdtqJd.png" width=100%> > Ubuntu 和 Open SUSE 是最先支援的 distro,而在 1803 版後又新增了 Kali Linux 和 Debian GNU/Linux。 > Ubuntu 提供 18.04 與 16.04 特定 LTS 選擇,不同 App 視為不同的 distro。 安裝好後請打開 App,第一次開啟會需要等他安裝組建,完成後需要新增帳號密碼來建立使用者,密碼主要用於 `sudo`。 <img src="https://i.imgur.com/zCI5NyG.png" width=100%> 覺得字型大小不好看的話,可以右鍵開啟 App 內容,在裡面調整顯示設定,關於 TrueType 字型在 zsh 會有詳細說明。 <img src="https://i.imgur.com/dJdKDjQ.png" width=60%> > 1803 版之前 App 的內容配置,每次重開似乎都會自動變回新細明體。 設定成功後就會進到此畫面,前面是你的帳號,@後面是你的電腦名稱。 <img src="https://i.imgur.com/XqnT0xM.png" width=90%> 除了透過 App,我們還可以透過**命令提示字元 (cmd) **或是**執行** (`Win`+`R`) 並輸入以下任一種來啟動 WSL: * `bash`:進入 **預設** Linux distro 的 **bash shell** * `wsl`:進入 **預設** Linux distro 的 **default shell** * `ubuntu` 或 `ubuntu1804`:執行特定 **App .exe** 前兩項會根據目前 WSL 預設的 distro 執行,因為目前只安裝 Ubuntu,所以都可以視為相同。 `/mnt/c` 也就是 mount C,是用來支援原生 Windows 檔案系統,詳情可以查看上一篇。 需要注意**使用者名稱**和**根目錄**並非同一個位置,前者存取的是 Windows 下的 Users,後者為專屬 WSL 的檔案系統。 <img src="https://i.imgur.com/MA5lFEC.png" width=90%> > 1703 版前舊版 WSL 的路徑有些不同。 由於 WSL 支援多種 Linux distro,所以我們可以在 cmd 透過 `wslconfig` 來管理,下圖可以看到目前的預設的 distro (App 名稱)。 <img src="https://i.imgur.com/TQp2L88.png" width=90%> > 1703 版前舊版 WSL 要透過 `lxrun` 管理。 上面都沒問題的話就更新一下 Ubuntu 的資料庫,最好定期執行。 ``` $ sudo apt-get update # 更新伺服器的檔案清單 $ sudo apt-get upgrade # 更新套件 ``` > 有安裝後續 zsh 的 debian 就可以直接用 `ad` 和 `adg`。 > 目前 18.04 版在更新套件時會看到 ebtables 的 error,不過這可以先忽略。 #### 如要更新 distro: * 在 Ubuntu 執行 `do-release-upgrade` (目前測試是沒有辦法找到新 release) * 重新安裝 App #### 如要刪除 distro: * 直接解除安裝 App * 透過 `wslconfig` 取消註冊 參考資料:[Manage and configure WSL](https://docs.microsoft.com/en-us/windows/wsl/wsl-config) ## 2. 設定 Z shell (zsh) ### 2.1. 特色 一言以蔽之就是實用,像是命令列補全、可載入模組等等,主要都會選擇搭配下面提到的 [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh?source=c) 一起使用。 參考資料:[zsh wiki](http://zshwiki.org/home/) ### 2.2. 安裝 zsh 1. 下載 zsh。 ``` $ sudo apt-get install zsh ``` 2. 檢查一下 zsh 版本。 ``` $ zsh --version zsh 5.4.2 (x86_64-ubuntu-linux-gnu) ``` 3. 查看已安裝的 shell。 ``` $ cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/bash /bin/rbash /bin/dash /usr/bin/tmux /usr/bin/screen /bin/zsh /usr/bin/zsh ``` 4. 將 zsh 設為預設 shell。 ``` $ chsh -s $(which zsh) ``` 5. 先關掉 App 再重開。 6. 第一次設定完後會看到下面畫面,請**直接按 0** 建立空白含註解的 `.zshrc`,只要沒有此檔案都會一直回到這個畫面。 <img src="https://i.imgur.com/TLowA79.png" width=90%> 7. 檢查 zsh 是否變為預設,以及版本是否一致。 ``` $ echo $SHELL /usr/bin/zsh $ $SHELL --version zsh 5.4.2 (x86_64-ubuntu-linux-gnu) ``` 8. 安裝 [oh-my-zsh](https://ohmyz.sh/),強大的 zsh 框架,下面擇一種方式安裝即可。 ``` $ sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" ``` ``` $ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" ``` ### 2.3. 安裝 Powerline 字型 由於部分主題像是 [agnoster](https://github.com/agnoster/agnoster-zsh-theme) 系列,都會用到特殊符號,這種時候就要安裝[ Powerline ](https://github.com/powerline/fonts)字型來解決,一部分原因也是因為 Windows 內建字型較少等寬 (monospace)。 無論是 App 或 VSC 來執行 WSL,字型都是從 Windows 安裝的來選擇,**安裝在 WSL 並沒有意義**。 下載好的 ttf 或 otf 可以直接執行並安裝,筆者是使用 `Ubuntu Mono derivative Powerline.ttf`。 <img src="https://i.imgur.com/21OK6LN.png" width=90%> 如果是使用 App 的,在內容設定中只能選擇 True Type 字型 (ttf)。 <img src="https://i.imgur.com/dJdKDjQ.png" width=60%> > 注意 App 字型只會影響外層的顯示,一些程式像 vim、htop 等會切換畫面的,會自動變成細明體。 並非所有字型都可以正常顯示符號,下面為測試符號: ``` $ echo "⮀ ± ⭠ ➦ ✔ ✘ ⚡" ``` App 和 VSC 即便使用相同文字仍略有差異,但無論如何基本上還是以 Powerline 為主。 <img src="https://i.imgur.com/Z4TXiNm.png" width=80%> <img src="https://i.imgur.com/tTONP3j.png" width=80%> ### 2.4. 設定主題 先輸入以下指令開啟設定檔,由於我們初始設定選擇 0,所以會看到滿滿註解的 `.zshrc`,同時也可以看到 oh-my-zsh 的安裝路徑。 ``` $ vim ~/.zshrc ``` <img src="https://i.imgur.com/A8iVUIp.png" width=90%> > 使用 App 在 `.zshrc` 暫時沒有高亮,筆者是在 VSCode 下使用。 內建的 [Themes](https://github.com/robbyrussell/oh-my-zsh/wiki/Themes) 會位於 `~/.oh-my-zsh/themes` ,可以直接在上圖 `.zshrc` 中的 `ZSH_THEME` 替換想要的主題,並套用變更。 <img src="https://i.imgur.com/J6ycRQ1.png" width=100%> ``` $ source ~/.zshrc ``` 啟用終端機的 256 色模式。 ``` $ echo 'export TERM="xterm-256color"' >> ~/.zshrc ``` 如果是在 VSC 裡執行 WSL,內部顏色會**被 VSC 的佈景顏色影響**,App 則不會有太大影響,以下是 [ 24 bits color ](https://github.com/gnachman/iTerm2/blob/master/tests/24-bit-color.sh)測試結果: <img src="https://i.imgur.com/MgluEAy.png" width=100%> <img src="https://i.imgur.com/xGXTCEw.png" width=100%> > 如果是像 [powerlevel9k](https://github.com/bhilburn/powerlevel9k) 這類 agnnoster 主題,尾端或是游標的顯示在 App 或 VSC 有可能跑掉,這必須自己測試主題了。 > 目前 VSC 的終端機顏色只能透過佈景主題去調整,詳見 [Color theme for VS Code](https://stackoverflow.com/questions/42307949/color-theme-for-vs-code-integrated-terminal)。 其他需要下載的主題可以從[ awesome-zsh-plugins ](https://github.com/unixorn/awesome-zsh-plugins#themes)查看,目前筆者使用的是 [bullet-train](https://github.com/caiogondim/bullet-train.zsh),以下教學都可以類推適用。 先切換目錄到 `$ZSH_CUSTOM/themes` 底下,再使用 `wget` 下載**該主題的 raw 檔**。 ``` $ cd $ZSH_CUSTOM/themes $ wget https://raw.githubusercontent.com/caiogondim/bullet-train-oh-my-zsh-theme/master/bullet-train.zsh-theme ``` 確認下載至對應路徑後,回到 `~/.zshrc` 更改主題並套用,結果如下,雖然有受到 VSC 佈景影響,但整體效果仍相當不錯。 <img src="https://i.imgur.com/wcdeXZN.png" width=90%> 需要注意的是主題和套件都會影響 zsh 的**啟動速度**,請自行衡量。 ### 2.5. 安裝套件 各種支援套件都可以在此找到:[plugins 列表](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins)、[plugins 分類](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins-Overview),內建套件會位於 `~/.oh-my-zsh/plugins`。 如同上面提到,[awesome-zsh-plugins](https://github.com/unixorn/awesome-zsh-plugins) 詳列許多 zsh 框架,以及各式套件與主題,想簡化安裝步驟的可以使用[ Antigen ](https://github.com/zsh-users/antigen)等套件管理工具。 #### 需要另外下載的套件: 安裝於 `$ZSH_CUSTOM/plugins` 底下。 * [zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions) ``` $ git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions ``` * [zsh-completions](https://github.com/zsh-users/zsh-completions) ``` $ git clone https://github.com/zsh-users/zsh-completions $ZSH_CUSTOM/plugins/zsh-completions ``` * [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) ``` $ git clone https://github.com/zsh-users/zsh-syntax-highlighting $ZSH_CUSTOM/plugins/zsh-syntax-highlighting ``` * [fast-syntax-highlighting](https://github.com/zdharma/fast-syntax-highlighting):優化上面套件 ``` $ git clone https://github.com/zdharma/fast-syntax-highlighting $ZSH_CUSTOM/plugins/fast-syntax-highlighting ``` * [autoupdate-zsh-plugin](https://github.com/TamCore/autoupdate-oh-my-zsh-plugins):自動更新位於 `$ZSH_CUSTOM` 的 git repos ``` $ git clone https://github.com/TamCore/autoupdate-oh-my-zsh-plugins $ZSH_CUSTOM/plugins/autoupdate ``` * [zsh-navigation-tools](https://github.com/psprint/zsh-navigation-tools):提供 UI 來篩選歷史紀錄、資料夾、刪除工作等等,以下指令會自動設定至 `.zshrc`,所以不用特別啟用,但務必確保設定在檔案最底端。 ``` $ sh -c "$(curl -fsSL https://raw.githubusercontent.com/psprint/zsh-navigation-tools/master/doc/install.sh)" ``` | 指令 | 說明 | | --- | --- | | n-aliases | browses aliases, relegates editing to vared | | n-cd | browses dirstack and bookmarked directories, allows to enter selected directory | | n-functions | browses functions, relegates editing to zed or vared | | n-history | browses history, allows to edit and run commands from it | | n-kill | browses processes list, allows to send signal to selected process | | n-env | browses environment, relegates editing to vared | | n-options | browses options, allows to toggle their state | | n-panelize | loads output of given command into the list for browsing | > 可以不用加 `-`,`Ctrl`+`R` 可以快速使用 `nhistory`。 #### 內建好但需要關聯的: * [extract](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/extract):`x` 等同 `extract`,只要加上要解壓縮的檔名,剩下就會自動處理,需要先安裝 unzip ``` $ sudo apt-get install unzip ``` * [fasd](https://github.com/clvv/fasd):提供一些快捷去搜尋和切換最近使用的檔案或目錄,提供互動式的選擇,指令也能互相搭配使用,需要先安裝 fasd **目前 18.04 無法使用 ppa** ``` $ cd ~ $ git clone https://github.com/clvv/fasd.git $ cd fasd $ sudo make install # 可能會需要安裝 make $ echo 'eval "$(fasd --init auto)"' >> ~/.zshrc ``` 除了直接呼叫 `fasd` 加上參數, 一般會使用內建的縮寫: | 指令 | 說明 | | --- | --- | | a | any | | s | show / search / select | | d | directory | | f | file | | sd | interactive directory selection | | sf | interactive file selection | | z | cd, same functionality as j in autojump | | zz | cd with interactive selection | * [debian](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#debian):提供一些管理 package 的快捷,需要先安裝 aptitude ``` $ sudo apt-get install aptitude ``` | 指令 | 說明 | | --- | --- | | as [search term] | Search for packages | | ad | Update packages | | adg | Updgrade packages | | ai [packages to install] | Install package(s) | | ar [package to remove] | Remove package | | app | Apt policy | | acs [search term] | Search packages in cache | | ac | Clean apt cache | | age [parameters] | apt-get [parameters] | | api [parameters] | aptitude [parameters] | | aps [search term] | Search with aptitude | | afs [search term] | Search files in packages | | asrc [parameters] | apt-get source [parameters] | | aac | Autoclean | | abd | Build dependencies | | adu | Update & (safe)upgrade | | afu | Update & full-upgrade | | ag | Upgrade (safe) | | ail [list of packages] | Install all packages in list | | ap | Purge | | ads | Dselect upgrade | | dia | Install all ./*.deb | | di [glob] | Install all glob | | kclean | Remove unused kernel images | | allpkgs | Print all installed packages | | mydeb | Create .deb package | | apt-list-packages | List packages by size | | kerndeb | Kernel-package building shortcut | | apt-copy | Creates script to install all current packages on other machine | | apt-history | Prints apt history | #### 可以直接啟用的: * [last-working-dir](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/last-working-dir):每次開啟終端機會自動回到上次路徑 * [colored-man-pages](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/colored-man-pages):改善 manual 的可讀性 * [command-not-found](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#command-not-found):找不到 command 時會提供相關建議 * [common-aliases](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#common-aliases):提供一些常用指令的快捷,主要有各式 `ls` 的搭配 * [sudo](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#sudo):按 `Esc` 兩次,可以直接在 command 前加上 `sudo` #### 最後步驟: 在 `~/.zshrc` 這地方依序打上需要啟用的套件 (資料夾名稱) 並套用變更。 ``` plugins=( git zsh-autosuggestions zsh-completions zsh-syntax-highlighting fast-syntax-highlighting autoupdate extract fasd debian last-working-dir colored-man-pages command-not-found common-aliases sudo ) ``` > 可以發現 plugins 後面才 `source oh-my-zsh.sh`。 ### 2.6. 注意事項 * 在 1703 版後,用戶的 Windows 環境變數會自動加到 WSL 裡,所以可以很容易地透過 WSL 開啟 Winodws 的程式,所以在 WSL 執行 `code` 會直接開啟 VSC。 <img src="https://i.imgur.com/aB8MH4X.png" width=100%> * 1805 新版的 oh-my-zsh,啟用 completion 相關的套件可能顯示如下警告,詳見 [Folder permission issue](https://github.com/robbyrussell/oh-my-zsh/issues/6835#issuecomment-390216875)。 <img src="https://i.imgur.com/WIEqv5o.png" width=100%> 請直接在 `~/.zshrc` 前面加上下面指令,務必要**在載入 oh-my-zsh 之前**。 ``` ZSH_DISABLE_COMPFIX=true ``` * 更新 oh-my-zsh: ``` $ upgrade_oh_my_zsh ``` * 刪除 oh-my-zsh: ``` $ uninstall_oh_my_zsh ``` * `~/.profile` 和 `~/.bashrc` 由於我們已更改預設 shell,所以不會被 zsh 載入,一般前者為 **login** 載入,後者為 **non-login** 載入。 * `zsh` 有專屬的 `~/.zprofile` 和 `~/.zshrc`,一般只會修改後者。 參考資料:[鳥哥](http://linux.vbird.org/linux_basic/0320bash.php#settings_bashrc)、[Zsh not hitting ~/.profile](https://superuser.com/questions/187639/zsh-not-hitting-profile)