背景
由于新款Mac性價比走低,近期轉為使用Windows作為主力開發系統。但是在開發過程中需要上Linux測試,或者說部署一些服務,例如MySQL,Nexus OSS等。本人又是一個Docker重度依賴者。之前一直是長期在Windows下啟動一個Linux虛擬機輔助開發操作。占用大量磁盤內存資源不說,操作和維護也極為繁瑣。
直到近期了解到Win10 2004正式版版本支持WSL2,問題得到了完美的解決。WSL2相比WSL1來說可以完美支持Docker。與WSL1的模擬Linux API不同的是,WSL2采用在Hyper-V虛擬機中運行的方案??梢哉fWSL2和原汁原味的Linux已經十分接近。本人實驗了一番,安裝部署成功,將整個步驟分享給大家。
步驟
下面為大家詳細介紹具體的操作步驟。
更新 Win10 到2004版本
使用Windows Update自動更新到2004版本。如果沒有檢測到更新,可以去微軟官網下載“易升”工具并安裝運行。工具會檢測到更新并安裝。
啟用Linux子系統
打開 控制面板 -> 程序 -> 啟用或關閉Windows功能。找到“適用于Linux的Windows子系統”和“虛擬機平臺”,勾選這兩項之后確定,并重新啟動計算機。
切換系統WSL默認版本到2
使用管理員用戶打開CMD,運行:
wsl --set-default-version 2
注意,有可能會出現如下提示:
WSL 2 需要更新其內核組件。有關信息,請訪問 https://aka.ms/wsl2kernel
出現這個提示,說明需要更新WSL2的內核。按照提示打開https://aka.ms/wsl2kernel鏈接。點擊下圖中的下載鏈接,下載并安裝WSL2內核。
安裝Ubuntu發行版
打開Microsoft Store,搜索ubuntu,界面如下所示:
根據自己的需要,選擇對應的Ubuntu版本并安裝。
完成之后在開始菜單會出現Ubuntu菜單項。打開它,Ubuntu將會進行初始化操作。等待幾分鐘后按照提示,為Ubuntu設置用戶名和密碼。
最后,我們需要驗證Ubuntu是否在WSL2的環境下啟動。以管理員用戶打開CMD,執行:
wsl -l -v
如果看到如下信息:
NAME STATE VERSION
* Ubuntu-20.04 Running 2
說明Ubuntu在WSL2環境下運行。到此為止安裝完畢。
如果發現VERSION為1,說明Ubuntu運行在WSL1下。需要手工切換。
首先關閉WSL下運行的Linux,執行:
wsl --shutdown
然后執行:
wsl --set-version <Linux發行版名稱> 2
其中Linux發行版名稱為前面安裝的Linux名稱,可以通過wsl -l -v
命令查看。執行命令后等待片刻。等命令行提示轉換完成,我們已經成功將Linux切換到WSL2環境。
安裝Docker
首先進入Ubuntu shell,更換Ubuntu官方源為國內源,加快下載速度。執行。
vim /etc/apt/sources.list
將內容替換為下方:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal universe
deb http://mirrors.aliyun.com/ubuntu/ focal-updates universe
deb http://mirrors.aliyun.com/ubuntu/ focal multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal-security universe
deb http://mirrors.aliyun.com/ubuntu/ focal-security multiverse
接下來添加Docker源:
依次執行如下命令:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt update
配置完成軟件源之后下一步是安裝Docker,命令如下:
sudo apt install -y docker-ce
最后一個步驟,啟動Docker daemon。但是此處有一個問題,WSL2經過測試無法使用systemctl
命令(此問題已經解決,參見博客末尾FAQ),因此我們使用service
命令啟動Docker daemon。命令如下所示:
sudo service docker start
至此,Docker 在WSL2下安裝完畢。
注:WSL2 Docker最爽的地方是和宿主機Win10共享network,我們在宿主機Win10使用localhost加端口號就可以訪問Docker中對應container中的服務,十分方便。
關閉虛擬機
WSL2實際上是在虛擬機中運行。我們一旦進入WSL2 Linux的命令行,虛擬機會自動啟動運行。如果我們查看任務管理器,會發現一個Vmmem進程。如下所示:
該進程是虛擬機的進程。它比較占內存。不使用WSL2的時候我們可以關閉它以節省內存。關閉WSL2 Linux的方法如下。使用管理員打開CMD,運行:
wsl --shutdown
卸載發行版
有時候某個Linux發行版不再使用,或者是環境被搞壞需要重裝,這時候我們可以卸載掉這個Linux發行版。方法如下。
首先使用:
wslconfig /l
命令查看系統內安裝的Linux發行版。
然后使用:
wslconfig /u <發行版名稱>
卸載掉指定的發行版Linux。
和宿主機Win10文件系統相互訪問
在Win10下訪問Linux子系統文件
進入CMD或者PowerShell,輸入:
cd \\wsl$\Ubuntu-20.04\
可以進入到Linux子系統根目錄。如下圖所示:
或者打開文件資源管理器,在地址欄輸入\\wsl$\Ubuntu-20.04
,也可以跳轉到Linux子系統根目錄。
Linux子系統訪問Win10文件
進入Linux子系統運行df -h
,看到如下輸出:
注意觀察后兩行。本人電腦有兩個分區。
/mnt/c
和/mnt/d
正好分別對應本機的C盤和D盤。
和VMWare的共存問題
目前VMWare 15版本無法在啟用Hyper-V虛擬機,即啟用WSL2的Win10上運行。但是經過本人實驗,VMWare最新的測試版是可以和Hyper-V共存的。下面是測試版VMWare的下載鏈接:
https://download3.vmware.com/software/wkst/file/VMware-workstation-full-e.x.p-16227267.exe
下載安裝包之后,按照向導提示升級安裝VMWare即可。該版本VMWare可以和WSL2完美共存。
更新內容:
VMWare Workstation 16 正式版本已經發布,無需再使用測試版。已經安裝測試版的用戶建議升級為正式版。
Docker Desktop for Windows
后來發現Docker Desktop windows版已經能夠支持WSL作為Docker Engine運行,可以同時支持在Linux和Windows命令行下操作docker,這樣遠比前文中單獨安裝Linux Docker使用起來靈活。下面將安裝Docker Desktop for Windows的方法分享。
瀏覽器打開https://www.docker.com/products/docker-desktop
點擊Download for Windows (stable),下載Docker安裝程序。確保WSL內的Docker已經卸載,如果沒有卸載,可以執行:
sudo apt remove docker-ce
sudo apt remove docker-ce-cli
雙擊下載的安裝程序安裝,記住選擇使用WSL作為Docker引擎。
在Windows注銷當前用戶重新登錄。到此Docker Desktop for Windows安裝完畢。
注意:如果發現在WSL下無法執行docker命令,可以通過如下操作打開:
進入Docker Desktop的settings,如下所示:
依次點擊Resources -> WSL INTEGRATION,打開右側的Ubuntu開關,點擊對話框右下角的Apply & Restart按鈕
遷移WSL 到非系統盤
默認WSL總是安裝到C盤,這樣對于C盤空間緊張的用戶完全不友好。
我們可以使用LxRunOffline工具來遷移WSL到其他磁盤分區。
LxRunOffline的下載鏈接:https://github.com/DDoSolitary/LxRunOffline/releases。在Win10 PowerShell運行需要下載LxRunOffline-vx.x.x-msvc.zip
版本。解壓到任意目錄即可使用。
LxRunOffline是一個第三方WSL Linux發行版管理工具,可以認為是wsl命令的增強版。它可以安裝和卸載Linux發行版,遷移,復制,導入導出和設置環境變量等。具體的使用幫助可執行
.\LxRunOffline.exe \h
查看命令介紹。
遷移過程分為3步:
- 獲取準備遷移的發行版名稱。執行:
PS C:\Users\xxx\Desktop> .\LxRunOffline.exe list
Ubuntu-20.04
獲取系統當前已安裝的發行版。例子中返回的發行版名稱為Ubuntu-20.04
。
- 執行遷移命令。格式如下:
.\LxRunOffline.exe m -n <發行版名稱> -d <目標路徑>
比如我們要將Ubuntu-20.04
移動到D:\Ubuntu-20.04
,執行如下命令:
.\LxRunOffline.exe m -n Ubuntu-20.04 -d D:\Ubuntu-20.04
等待命令執行完畢返回。
- 查看遷移后發行版的安裝路徑。執行:
PS C:\Users\xxx\Desktop> .\LxRunOffline.exe di -n Ubuntu-20.04
D:\Ubuntu-20.04
返回的安裝位置是D:\Ubuntu-20.04
,說明遷移成功。
FAQ
systemctl命令無法使用
現象為在命令行執行systemctl
命令,報如下錯誤:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
參考了https://forum.snapcraft.io/t/running-snaps-on-wsl2-insiders-only-for-now/13033之后給出如下解決方案:
- 安裝daemonize和fontconfig
apt install -y fontconfig daemonize
- 編輯
/etc/profile
腳本,加入如下內容:
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
if [ -z "$SYSTEMD_PID" ]; then
sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi
if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi
- 修改
/etc/sudoers
文件,加入如下內容:
%sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*
- 執行
source /etc/profile
或者是重新打開terminal,執行systemctl
驗證是否能夠正常操作。
Vmmem 進程占用過多內存
我們可以通過WSL的配置文件,限制vmmem進程的內存占用。在%UserProfile%目錄創建.wslconfig
文件,添加如下內容:
[wsl2]
memory=6GB
swap=0
localhostForwarding=true
這里限制了vmmem進程最大內存不超過6GB,不使用交換空間。
創建完配置文件后,執行wsl --shutdown
關閉WSL,再重新啟動即可生效。
參考資料:
https://github.com/microsoft/WSL/issues/4166
https://docs.microsoft.com/en-us/windows/wsl/release-notes#build-18945
(可選)使用Podman取代Docker
Podman已成為CentOS8官方御用容器管理器,并且Kubernetes1.12已經放棄對Docker的支持。相比Docker,Podman無需守護進程,不強制要求使用root用戶來管理容器,具有更好的靈活性和安全性。Podman使用方式和Docker完全相同,兼容Docker的鏡像格式。
經本人試驗Podman可以完美的在WSL2 Ubuntu中運行。
在WSL2中安裝Podman的方法可參考如下鏈接:https://www.redhat.com/sysadmin/podman-windows-wsl2
下面腳本為Podman的安裝腳本:
. /etc/os-release
sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/x${NAME}_${VERSION_ID}/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list"
wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/x${NAME}_${VERSION_ID}/Release.key -O Release.key
sudo apt-key add - < Release.key
sudo apt-get update -qq
sudo apt-get -qq -y install podman
sudo mkdir -p /etc/containers
echo -e "[registries.search]\nregistries = ['docker.io', 'quay.io']" | sudo tee /etc/containers/registries.conf
如果沒有其他報錯信息,到這里Podman已安裝完畢。我們可以執行podman info
命令,驗證是否安裝成功。
WSL2 系統占用磁盤空間不釋放
WSL2本質是虛擬機,它使用的是vhdx虛擬磁盤格式。它支持自動擴容,但是并不會自動縮容。
我們可以使用diskpart
命令,手工執行縮容操作。
diskpart
# open window Diskpart
select vdisk file="D:\WSL\Ubuntu\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
其中D:\WSL\Ubuntu\ext4.vhdx
為WSL2系統虛擬磁盤文件路徑。