---
title: Install CentOS8 on Win10 WSL2
---
# Install Win10 WSL2 and CentOS8 distro
:::danger
**注意:**
啟動 Windows 10 `WSL2` (或是 `WSL`) 功能, 會使需要**獨佔** Hypervisor 的應用程式 (如: v5 版的 VirtualBox, WMware WorkStation Player, 或 Pro v15.5 以前的) 無法啟動. 甚至目前 VirtualBox (v6.1.14) 雖然可以執行已安裝好的 VM, 但是用來安裝全新的 CentOS8 VM 依然會有錯誤產生, 無法完成 VM 安裝.
:::
:::warning
**Update (2020/11/05):**
VirtualBox v.6.1.16 已經可以在 WSL2 啟動的狀態下順利完成 CentOS8 (8.2.2004). VMWare Workstation 16 Player (16.0.0) 也 OK 了.
**Update (2021/01/28):**
如果你啟動 WSL2 之後, 發現原本可以執行的 VMWare VM 和 VirtualBox VM 卻不能執行了, 你可能還需要試著更改下列二者的組合設定:
* 選取 (啟用) VM 的 "Disable side channel migrations for Hyper-V enable hosts" (設定位置: VM Settings --> Options --> Advanced)
* 不選取 (關閉) "Virtualize Intel VT-x/EPT or AMD-V/RVI" (設定位置: VM Settings --> Hardware --> Processors)
如果依然無法開啟 VM, 那就需要麻煩你申請 Windows Insider 帳號, 至少改成 **"Beta 版通道"**, (操作順序: "Windows 設定" --> "更新及安全性" --> "Windows 測試人員計畫" --> "挑選您的測試人員設定") 並更新至 20H2 (目前的版本).
:::
## 安裝 WSL2
>Ref: https://docs.microsoft.com/zh-tw/windows/wsl/install-win10
:::info
**Update (2021/04/25):**
現在只要安裝 Windows 10 OS 的預覽組建 20262 或更新版本 (需要加入 Windows 測試人員計畫), 就可以直接使 `wsl --install` 指令將 WSL2 安裝好喔!! (以下步驟的 Step1~Step5)
:::
<div style='text-align:center'>
<img style='width:95%' src="https://pic.pimg.tw/magicjackting/1632134072-1564271603-g_l.png">
<p>wsl --install</p>
</div>
### Step 0:<br />檢查系統需求
WSL2 用的是**虛擬化**技術, 需要電腦的**硬體** (CPU) 和**軟體** (Hyper-V) 的支援.
* **硬體**上, 需要 CPU 有支援**虛擬化**. 除非你的電腦非常的舊 (2005年以前生產的, 十幾年了還在 RUN?), 基本上現下的 x86 CPU 都是有支援的, 不論是 Intel (VT-x) 或者是 AMD (AMD-V) 都可以的. 不過有些機器的 BIOS 預設是把這個功能關閉的, 我們還需要在 BIOS 中把**虛擬化**這個功能**啟用**.
:::info
如果你對於 x86 架構虛擬化技術的演進過程有興趣, 可以參考維基百科上 ["x86虛擬化"](https://zh.wikipedia.org/wiki/X86%E8%99%9A%E6%8B%9F%E5%8C%96) 這一篇文章.
:::
* **軟體**上則需要作業系統上有 **Hyper-V**. 所以 Windows 10 必需是**專業版**以上, 或者是 Windows Server 2012 以上.
:::info
Windows 10 **家用版**基本上是沒有 Hyper-V 功能.
不過, 如果你真的只有 Win10 **家用版**的話, 還是可以參考 DayKing 先生的 "<u>[UH 教你如何在 Windows 10 家用版上開啟 Hyper-V 虛擬機功能](https://unikoshardware.com/2020/10/enable-hyper-v-on-windows10-home-edition.html)</u>" 這一篇貼文, 把 Hyper-V 功能安裝並啟動起來.
或者你也可以直接下載以下這個 [**批次檔**](https://onedrive.live.com/download?cid=25DF31F5B07B0B51&resid=25DF31F5B07B0B51%212322&authkey=AKmGfoDnVHQPR3Y) (和貼文裡的內容是一致的), 然後以**系統管理者身份**在 PowerShell 中執行, 完成後你的 win10 **家用版**就可以像**專業版**一樣有 Hyper-V 功能.
:::
在 Command Console 或者 Powershell 裡輸入 `systeminfo` 指令, 可以查到目前 Hyper-V 的狀態.
```ps
PS> systeminfo
...
Hyper-V 需求: VM 監視器模式擴充: 是
韌體中己啟用虛擬化: 是
第二層位址轉譯: 是
具有資料執行防止: 是
```
新一點的 CPU 上述的 4 項應該都會是 **`是`**. 其中最重要的是 **`韌體中己啟用虛擬化`** 這一項**不可以為 `否`**. 否則就會啟動不了 Hyper-V. 它就是前面提到的 BIOS 的預設值把**虛擬化**這個功能關掉了. 這時我們需要關機, 然後進入 BIOS 把**虛擬化**功能打開 (這裡指的是 Intel CPU 的 `VT-x` 功能或者是 AMD CPU 的 `AMD-V`).
如果是出現 `偵測到 Hypervisor` 則表示 Hyper-V 功能已經啟動了. (這種狀況也是 OK 的)
```ps
PS> systeminfo
...
Hyper-V 需求: 偵測到 Hypervisor。將不會顯示 Hyper-V 所需的功能。
```
### Step 1:<br />啟用 Windows 子系統 Linux 版
```powershell
PS> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```
### Step 2:<br />更新至 WSL 2 支援的 win10 版本 (需求版本 1903)
目前已經不再需要加入 **windows insider** 計劃, 只要更新到 1903 之後即可. 想試一下新版, 請連線到[這個 URL](https://insider.windows.com/zh-tw/getting-started)註冊登記即可成為 windows insider. 完成註冊登記之後 windows 會自動更新成新的體驗版, 更新完成之後再進行下一步.
>**注意:** 安裝 insider 的更新會將你的一些喜好設定回復為 windows 的原本的預設值. ~~服用前請就近咨詢醫師~~ (請先備份啦!)
#### 檢查 windows 的版本資訊:
Windows 10 的版本資訊可以從 Windows 的 '設定' 選單進入, 選擇 '系統', 然後選擇左邊最後一個子頁籤 '關於', 右邊 '裝置規格' 的下方 'Windows 規格' 裡查到.
另外, 你也可以使用下列 registry 在 Winodws 10 桌面的右下角直接顯示 win10 的版本資訊. 不過它顯示的是 OS 組建的版本號, 和 MS 每半年公布一次的版本號碼不同但有一定的關係. (本方法不適合使用破解版的同鞋喔)
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Control Panel\Desktop]
"PaintDesktopVersion"=dword:00000001
<img src="https://pic.pimg.tw/magicjackting/1604467553-2054199650-g.png">
### Step 3:<br />啟用虛擬機器功能 & 重新開機
```=powershell
PS> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
:::danger
進行下一步之前, 請務必重新開機. 否則會有奇怪的錯誤.
:::
### Step 4:<br />下載 Linux 核心更新套件 並執行
`https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi`
### Step 5:<br />將 WSL 2 設定為預設版本
```=powershell
PS> wsl --set-default-version 2
```
### Step 6:<br />開啟 Microsoft Store,然後選取您最愛的 Linux 發行版本進行安裝
MS store 裡有許多 Linux 的發行版本, 但是就是沒有 CentOS. 如果你 search CentOS, 也會發現一些人製作了 CentOS 上架到 MS store 裡, 但是要收費, 不過下面這個不用錢, 我們就將就一下, 用這個吧.
[CentWSL on Github](https://github.com/yuk7/CentWSL)
下載 CentOS8 的版本, 解開壓縮檔, 執行 CentOS8.exe 就完成安裝了.
這裡所謂的**安裝**的其實是向 `WSL2` 註冊某個 `<Distro>` 的 filesystem image 在哪裡而已.
### Step 7:<br>啟動 `<Distro>`
安裝好 `<Distro>` 之後, `wsl -l -v` 就可以看到你已經安裝了哪些 `<Distro>`.
```plaintext
NAME STATE VERSION
* CentOS8 Stopped 2
```
接著就可以**連線**了. 你沒看錯, 不是**啟動**, 而是直接**連線**.
使用 power shell (或者 cmd console 也行) 視窗直接連線:
```powershell
PS> bash
# 或者是
PS> wsl bash
```
當然, 裝個 windows terminal 來用會比直接在 powershell (或者 cmd console) 視窗中用 `bash` 指令好一點 (可以分割畫面喔).
Windows terminal 可以從[這裡下載/安裝]( https://www.microsoft.com/zh-tw/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab).
**注意:** windows terminal 預設的視窗和 windows cmd console 視窗有點像, 不要把它弄錯了. (像我就是弄錯了, 以為系統出了問題, 什麼也沒有安裝...orz)
---
## 問題與解答:
* Error Code: 0x8007019E
這個錯誤是 "Windows子系统 Linux 版" 未安裝或未安裝成功.
* 如果你是用 `wsl --install` 安裝的很可能是 BIOS 設定裡沒有將 "虛擬化功能" 開啟.
* 可以輸入以下指令解決
```powershell
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```
<div style='text-align:center'>
<img src="https://pic.pimg.tw/magicjackting/1632134110-1903379604-g_l.png">
<p>BIOS 設定未開啟 "虛擬化功能".</p>
</div>
* Error Code: 0x8000000D
這個錯誤是 Ubuntu 安裝失敗.
* 請至 Microsoft Store 重 **下載** 並 **安裝** Ubuntu 的映像檔.
* Error Code: 0x80370102
這個錯誤是 WSL 啟動失敗.
* 請確定已在電腦的 BIOS 內啟用虛擬化功能.
<div style='text-align:center'>
<img src="https://pic.pimg.tw/magicjackting/1632134129-1080224857-g_n.png">
<p>啟動 WSL2 所需的 Windows 元件</p>
</div>
---
## WSL2 需知
* 在 WSL 裡啟動一個 Linux `<Distro>` 並不會有冗長的開機過程. 也是和 `docker` 一樣的**飛快**.
* Windows 10 的 WSL 使用的並不是純 VM 技術, 而是類似 `docker` 的東西. 所以在 WSL 裡, `<Distro>` 不會有冗長的開機過程. 同時開完機後, 也看不到傳統 Linux 背後執行的一長串 daemon 程式.
* 還有一個很重要的是在 WSL 的世界裡並沒有 login 這回事, WSL 預設使用 `root` 直接 run bash 連線到 `<Distro>` 裡, 沒有**輸入 passwrod** 這回事. 那…該怎麼辦呢?
* 在 `<Distro>` 上增加一個新的 user, 指定為 group wheel 的一員 (才能執行 su, sudo)
* 設定 root (以及新 user 的) password
* 設 `root` 密碼是為了指令 `su -`
* 設新 user 密碼是為了指令 `sudo`
* 將 `<Distro>` 預設的帳號重新設定成新的 user
```powershell
PS> <Distro>.exe config --default-user <namename>
```
---
## 修正中文語系設定及中文顯示問題
由於這個 CentOS8 的安裝包裡沒有其他語系的支援包, 所以中文路徑的顯示都是中文的裸碼 (俗稱亂碼). 除此之外, 有些指令還會出現如下的錯誤訊息:
Fail to set locale, defaulting to C.UTF-8
安裝以下 package 即可解決這個問題.
```bash
$ sudo yum install langpacks-zh_TW.noarch
$ sudo yum install glibc-all-langpacks
```
---
## WSL 指令常用參數
* 列出已安裝的 `Linux distro`
```powershell
PS> wsl -l -v
# 或者是
PS> wsl --list --verbose
```
輸出結果類似如下 (有 ``*`` 那個是預設的 linux Distro)
```plaintext
NAME STATE VERSION
CentOS7 Stopped 2
* CentOS8 Stopped 2
Ubuntu Stopped 2
```
* 設定預設使用 `WSL2` (而非原本的 `WSL`)
```powershell
PS> wsl --set-default-version 2
```
>**接下來的指令請把 `<Distro>` 換成你自已安裝的 linux 名字, 像是 `CentOS8` 或者是 `Ubuntu` ...**
* 設定特定 `<Distro>` 使用 `WSL2`
例如: `Ubuntu`, `Ubuntu-18.04`...
```powershell
PS> wsl --set-version <Distro> 2
```
* 設定預設連線的 Linux `<Distro>`
```powershell
PS> wsl --setdefault <Distro>
# 或者是
PS> wsl -s <Distro>
```
* 關機 (terminate) `<Distro>`
```ps
PS> wsl -t <Distro>
```
* 刪除 (unregister) 某 `<Distro>`
```ps
PS> wsl --unregister <Distro>
```
舊版指令:
```ps
# PowerShell (admin)
PS> Restart-Service LxssManager
# or CMD (admin)
> net stop LxssManager
> net start LxssManager
```
* 搬動 Linux `<Distro>` 的 Disk Image
* step 1: **export** fs image of `<Distro>`
* step 2: **unregister** `<Distro>`
* step 3: **import** fs image of `<Distro>`
**Step 1:** export
```powershell
PS> mkdir D:\backup
PS> wsl --export <Distro> D:\backup\<distro>.tar
```
**Step 2:** unregister
```powershell
PS> wsl --unregister <Distro>
```
**Step 3:** import (`D:\wsl` 是新位置, `D:\backup` 剛才 export 的位置)
```powershell
PS> mkdir D:\wsl
PS> wsl --import <Distro> D:\wsl\ D:\backup\<distro>.tar
```
* 即刻連線至指定的 Linux `<Distro>`, 使用預設帳號.
```powershell
PS> wsl -d <Distro>
# 或者是
PS> wsl --distribution <Distro>
```
* 即刻連線預設 Linux `<Distro>`, 改用其他帳號.
```powershell
PS> wsl --user <username>
```
* 設定 Linux `<Distro>` 的預設連線用戶名
```powershell
PS> .\<Distro>.exe config --default-user <yourname>
```
>**註:** `<Distro>.exe` 來自你下載的 Linux <Distro> 安裝包.
* 由 Win10 存取 Linux `<Distro>` 內的檔案
檔案路徑寫法:
* `/` 改為 `\`
* 前面加一段 `\\wsl$\<Distro>`
例如: 想存取我在的 `CentOS8` home 目錄裡的檔案 `/home/myName/sample.txt` 則應該將檔案路徑改為
```cmd
\\wsl$\CentOS8\home\myName\sample.txt
```
* 由 Linux `<Distro>` 存取 Win10 裡的檔案
檔案路徑寫法:
* 磁碟機代號改為 `/mnt/<drive>`
例如: `C:` 應改為 `/mnt/c`
* `\` 改為 `/`
例如: 想存取 `D:\Data\mySQL\test.sql` 應該改為
```bash
/mnt/d/Data/mySQL/test.sql
```
* 直接執行 Linux 指令
```powershell
PS> wsl <linux-command>
```
例如:
```
wsl ls -l /etc
```
* 在 Linex 裡, 打開 windows 應用程式
```bash
# 打開檔案總管
$ explorer.exe .
# 打開 Notepad.exe
$ notepad.exe
# 用 vsCode 開啟專案
$ code ~/projects/mywebsite
```
---
## 安裝 Linux 應用程式
理論上, window 和 Linux 二邊的應用程式是不通用的, 所以 Linux 這邊的應用程式要另外安裝.
但是也有例外: `docker` 就是這麼一個例外. 想要在 WSL2 的 Linux 環境中使用 `docker` 並**不需要在 linux 中安裝**, 而是在 Windows 安裝 `Docker Desktop` 之後, 經由設定就可以直接在 WSL 的 `Distro` 中使用 (開啟 Windows `Docker Desktop`, **設定** --> **Resources** --> **WSL INTEGRATION**, 選擇要使用 `docker` 的 `<Distro>` 即可). 這是由於 `docker` 直接支援了 `WSL2`. 所以只要安裝 'Docker Desktop for Windows' (以前叫做 'Docker for Windows'), Linux `<Distro>` 裡也可以直接用 docker. 這樣的好處是 images, container 二邊是共用的 (也就是在任何一邊都可以操作 images, 和 container. 在 windows 開啟的 container, 可以在 linux 直接 docker exec, docker rm, ...)
例一. 安裝 git
Ubuntu 環境
```bash
$ sudo apt-get install git
```
CentOS 環境
```bash
$ sudo yum install https://packages.endpoint.com/rhel/7/os/x86_64/endpoint-repo-1.7-1.x86_64.rpm
$ sudo yum install git
```
例二. 安裝 nodejs
Ubuntu 環境
```bash
$ sudo apt-get install build-essential
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt-get install -y nodejs
```
CentOS 環境
```bash
$ sudo yum install epel-release
$ sudo yum install nodejs
```
---
## CentOS8 最小安裝加裝其他 packages
第一次用 CentOS 最小安裝的人, 有很多人會抓狂, 因為有許多指令都不見了.
所以特別記下這一段, 給沒用過 Linux 最小安裝, 又不是很熟 `yum` 的人 (現在改成 `dnf` 指令了).
安裝 package 請用:
```bash
$ sudo dnf install <package>
```
至於某一個 command 是在哪一個 package 呢? 請用以下指令查:
```bash
$ sudo dnf whatprovides <command>
```
下面是我在 WSL CentOS8 上加裝的 package:
語系相關的 package:
langpacks-zh_TW.noarch : 正體中文語言包
glibc-all-langpacks : glibc 的語系支援包
常用工具指令 package:
man, man-db, man-pages : 指令 man 及手冊
ncurses : 指令 clear
net-tools : 指令 ifconfig, netstat
traceroute : 指令 tracert
openssh-client : 指令 ssh (及 ssl 相關 library)
wget : 指令 wget
curl : 指令 curl
unzip : 指令 unzip
passwd : 指令 passwd
sudo : 指令 sudo
which : 指令 which
psmisc : 指令 pstree
硬體相關的 package:
hwinfo : 指令 hwinfo
lshw : 指令 lshw
hwloc : 指令 hwloc
有時會有某些 man pages 被刪掉了, 可以用:
```bash
$ sudo dnf reinstall <package>
```
###### tags: `WSL2`, `CentOS8`, `Windows insider`