--- 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 />啟用虛擬機器功能 &amp; 重新開機 ```=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`