前沿拓展:
1 概述
作為一名使用 win10 的開(kāi)發(fā)者,搭建開(kāi)發(fā)環(huán)境往往是一件比較痛苦的事,需要從網(wǎng)上下載各種軟件,在電腦上配置不同軟件運(yùn)行環(huán)境,對(duì)軟件進(jìn)行各種設(shè)置,不僅耗時(shí),而且容易出現(xiàn)各種問(wèn)題。搭建的環(huán)境還會(huì)存在下面一些問(wèn)題:
安裝大量程序造成路徑污染。安裝和卸載比較麻煩。開(kāi)發(fā)環(huán)境不能遷移,重裝系統(tǒng)或者換電腦需要重新搭建開(kāi)發(fā)環(huán)境。軟件版本不好控制。
為了解決上面這些問(wèn)題,我們可以使用 WSL+Docker+Scoop 搭建開(kāi)發(fā)環(huán)境,取代通過(guò)圖形界面安裝軟件和 VMware 安裝 Linux 環(huán)境的傳統(tǒng)方式。
WSL 是適用于 Linux 的 Windows 子系統(tǒng), 可讓開(kāi)發(fā)人員按原樣運(yùn)行 GNU/Linux 環(huán)境 – 包括大多數(shù)命令行工具、實(shí)用工具和應(yīng)用程序 – 且不會(huì)產(chǎn)生傳統(tǒng)虛擬機(jī)或雙啟動(dòng)設(shè)置開(kāi)銷(xiāo)。
Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的容器中,第二發(fā)布到任何流行的 Linux 機(jī)器或 Windows 機(jī)器上。
Scoop 是 Windows 的命令行安裝程序,可以讓我們從命令行以最小的安裝量安裝程序, 它消除了安裝界面和安裝程序造成的路徑污染,它安裝和卸載軟件只需一行命令就可以完成,它還可以隨意切換軟件的版本。
一個(gè)完整的開(kāi)發(fā)環(huán)境組成:第一使用 WSL 搭建一個(gè) Linux 環(huán)境,第二在 Linux 環(huán)境里安裝 Docker 應(yīng)用,使用 Docker 來(lái)安裝一些常用軟件,比如數(shù)據(jù)庫(kù)、web 環(huán)境等,Scoop 則是在本機(jī)上安裝一些開(kāi)發(fā)用到的軟件,比如 jdk、maven、idea 等。WSL 和 Scoop 都是比較容易備份和還原的,這兩個(gè)搭建好了,我們利用備份還原可以快速在另一臺(tái)機(jī)器上搭建同樣的一套環(huán)境,下面是搭建環(huán)境的具體流程。
2 WSL2.1 WSL 安裝使用 WINDOWS 鍵 + R,輸入 winver,檢查 win10 版本,確保內(nèi)部版本號(hào)是 18362.1049 以上,否則更新 win10 到最新版本。
以管理員身份打開(kāi) PowerShell 并運(yùn)行下面命令:di**.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
di**.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重新啟動(dòng)計(jì)算機(jī)。下載 Linux內(nèi)核更新包[1],第二安裝。將 wsl2 設(shè)置為默認(rèn)版本, 以管理員身份打開(kāi) PowerShell 并運(yùn)行下面命令:wsl –set-default-version 2
安裝 Ubuntu 20.04 LTS, 打開(kāi) Microsoft Store[2],搜索 Ubuntu 20.04 LTS[3] 安裝, 安裝完成后打開(kāi) Ubuntu 20.04 LTS, 等候幾分鐘會(huì)提示設(shè)置用戶(hù)名和密碼,如果不設(shè)置用戶(hù)名和密碼直接關(guān)閉窗口則默認(rèn)以 root 登錄,這里我們直接關(guān)閉窗口,不設(shè)置用戶(hù)名和密碼。
第二重新打開(kāi) Ubuntu 20.04 LTS 就會(huì)進(jìn)入 Ubuntu 20.04 LTS了,我們也可以在 powershell 使用 wsl 這個(gè)命令進(jìn)入 Ubuntu 20.04 LTS。2.2 WSL 配置
WSL 每次啟動(dòng)后,windows 都會(huì)給它分配一個(gè)隨機(jī)的 IP 地址,這樣是不利于我們?cè)L問(wèn) docker 里的服務(wù)的,為了解決這個(gè)問(wèn)題,我們可以創(chuàng)建一個(gè)腳本文件 wsl2-ip.bat來(lái)給 wsl 分配一個(gè)固定的 IP,在每次啟動(dòng) wsl 后用管理員權(quán)限運(yùn)行這個(gè)腳本,文件內(nèi)容如下:
@echo off
setlocal enabledelayedexpansion
:: set wsl2 ip
wsl -u root ip addr | findstr "192.168.169.2" > nul
if !errorlevel! equ 0 (
echo wsl ip has set
) else (
wsl -d Ubuntu-20.04 -u root ip addr add 192.168.169.2/28 broadcast 192.168.169.15 dev eth0 label eth0:1
echo set wsl ip success: 192.168.169.2
)
:: set windows ip
ipconfig | findstr "192.168.169.1" > nul
if !errorlevel! equ 0 (
echo windows ip has set
) else (
netsh interface ip add address "vEthernet (WSL)" 192.168.169.1 255.255.255.240
echo set windows ip success: 192.168.169.1
)
pause
其中 192.168.169.2 表示 Linux 的 IP 地址, 192.168.169.1 表示主機(jī)的 IP 地址。
有時(shí)會(huì)遇到 Ubuntu 20.04 LTS 無(wú)法連接網(wǎng)絡(luò),這個(gè)非常重要,我們可以運(yùn)行下面命令解決:
sed -i '4d' /etc/resolv.conf
sed -i '3anameserver 8.8.8.8' /etc/resolv.conf
sed -i '4anameserver 114.114.114.114' /etc/resolv.conf2.3 Ubuntu 配置2.3.1 替換鏡像源備份 sources.list 文件,運(yùn)行下面命令:mv /etc/apt/sources.list /etc/apt/sources.list.bak創(chuàng)建 source.list 文件,運(yùn)行下面命令:vim /etc/apt/sources.list第二在文件里添加下面內(nèi)容,下面源任選其一即可。# 清華源
# 默認(rèn)注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 預(yù)發(fā)布軟件源,不建議啟用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# 阿里源
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
# 中科大源
deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
#deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
#網(wǎng)易163源
deb http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
#deb-src http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse進(jìn)行更新,運(yùn)行下面命令:apt update
apt upgrade -y2.3.2 開(kāi)啟 systemctl安裝 daemonize 和fontconfig 軟件,運(yùn)行下面命令:apt install -y fontconfig daemonize運(yùn)行 vim /etc/profile 命令,在末尾添加下面內(nèi)容:SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd –system-unit=basic.target#39; | 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#39; | 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運(yùn)行 vim /etc/sudoers 命令,在末尾添加下面內(nèi)容:%sudo ALL=(ALL) NOPASSWD: /usr/**in/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]*刷新 profile 文件,運(yùn)行下面命令:source /etc/profile2.3.2 開(kāi)啟 ssh設(shè)置 root 賬號(hào)的密碼,用作后續(xù)登陸使用,運(yùn)行下面命令:passwd root
備份原始的 sshd_config,運(yùn)行下面命令:cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak修改 sshd_config 文件,運(yùn)行下面命令:sed -i '15c Port 22' /etc/ssh/sshd_config
sed -i '17c ListenAddress 0.0.0.0' /etc/ssh/sshd_config
sed -i '34c PermitRootLogin yes' /etc/ssh/sshd_config
sed -i '58c PasswordAuthentication yes' /etc/ssh/sshd_config重啟 sshd,運(yùn)行下面命令systemctl restart sshd2.4 Docker 安裝與配置
官方和阿里的源選擇其一,建議使用阿里源,速度快。
2.4.1 官方安裝卸載舊版本,運(yùn)行下面命令:apt-get remove docker docker-engine docker.io containerd runc更新 apt 軟件包索引并安裝軟件包以允許 apt 通過(guò) HTTPS 使用存儲(chǔ)庫(kù),運(yùn)行下面命令:apt-get install -y apt-transport-https ca-certificates curl gnupg l**-release添加 Docker 的官方 GPG 密鑰,運(yùn)行下面命令:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg設(shè)置穩(wěn)定的存儲(chǔ)庫(kù),運(yùn)行下面命令:echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(l**_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安裝最新版本的 Docker Engine 和容器,運(yùn)行下面命令:apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
apt-mark hold docker-ce docker-ce-cli containerd.io2.4.2 阿里源安裝卸載舊版本,運(yùn)行下面命令:apt-get remove docker docker-engine docker.io containerd runc更新 apt 軟件包索引并安裝軟件包以允許 apt 通過(guò) HTTPS 使用存儲(chǔ)庫(kù),運(yùn)行下面命令:apt-get install -y apt-transport-https ca-certificates curl gnupg l**-release添加 Docker 的阿里 GPG 密鑰,運(yùn)行下面命令:curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add –設(shè)置穩(wěn)定的存儲(chǔ)庫(kù),運(yùn)行下面命令:add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(l**_release -cs) stable"安裝最新版本的 Docker Engine 和容器,運(yùn)行下面命令:apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
apt-mark hold docker-ce docker-ce-cli containerd.io2.4.3 配置鏡像加速
創(chuàng)建 /etc/docker/daemon.json 文件,并填寫(xiě)以下內(nèi)容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}3 Scoop3.1 Scoop 安裝以管理員權(quán)限打開(kāi) PowerShell 。自定義用戶(hù)軟件和全局軟件安裝位置,運(yùn)行下面命令:$env:SCOOP='D:SoftwaresScoopLocalApps'
[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')
$env:SCOOP_GLOBAL='D:SoftwaresScoopGlobalApps'
[Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')
配置安全策略以及安裝 Scoop,運(yùn)行下面命令:Set-ExecutionPolicy RemoteSigned -scope CurrentUser
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
3.2 安裝失敗解決方案如果發(fā)生下面錯(cuò)誤,這是因?yàn)榫W(wǎng)絡(luò)原因無(wú)法訪(fǎng)問(wèn) GitHub。
訪(fǎng)問(wèn) IP地址查詢(xún)網(wǎng)站[4],輸入raw.githubusercontent.com域名,查詢(xún)對(duì)應(yīng)的 IP 地址。
配置 C:WindowsSystem32driversetchosts文件,在修改前賦予 hosts 文件讀寫(xiě)權(quán)限。
修改 host 文件內(nèi)容如下,第一列是查詢(xún)出來(lái)的ip地址,第二列是其對(duì)應(yīng)的域名,中間有個(gè)空格。
保存后重新運(yùn)行安裝命令。Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')3.3 Scoop 配置安裝 Scoop 運(yùn)行所需要的基礎(chǔ)軟件:scoop install sudo
sudo scoop install 7zip git innounp dark -g
運(yùn)行下面命令,檢查Scoop還存在的問(wèn)題,輸入提示運(yùn)行的命令,來(lái)解決存在的問(wèn)題,如果你使用的安裝路徑不是我的路徑,請(qǐng)修改命令中的軟件安裝位置:scoop checkup
Add-MpPreference -ExclusionPath 'D:SoftwaresScoopLocalApps'
Add-MpPreference -ExclusionPath 'D:SoftwaresScoopGlobalApps'
Set-ItemProperty 'HKLM:SYSTEMCurrentControlSetControlFileSystem' -Name 'LongPathsEnabled' -Value 1
配置軟件倉(cāng)庫(kù),官方軟件倉(cāng)庫(kù)目前收錄的軟件很少,不足以支持我們的使用,添加下面的軟件倉(cāng)庫(kù),能讓我們安裝更多的軟件:scoop bucket add extras
scoop bucket add versions
scoop bucket add nightlies
scoop bucket add nirsoft
scoop bucket add php
scoop bucket add nerd-fonts
scoop bucket add nonportable
scoop bucket add java
scoop bucket add games
scoop bucket add jetbrains
scoop bucket add dorado https://github.com/chawyehsu/dorado
scoop bucket add Ash258 https://github.com/Ash258/Scoop-Ash258.git
scoop bucket add pleiades https://github.com/jfut/scoop-pleiades.git
scoop bucket add Scoop-Apps https://github.com/ACooper81/scoop-apps
scoop bucket add scoop-zapps https://github.com/kkzzhizhou/scoop-zapps
scoop bucket add lemon https://github.com/hoilc/scoop-lemon
scoop bucket add raresoft https://github.com/L-Trump/scoop-raresoft
如果軟件倉(cāng)庫(kù)添加失敗,還是因?yàn)榫W(wǎng)絡(luò)的原因,大家可以把這些倉(cāng)庫(kù) fork 到自己的碼云賬戶(hù)下,第二再添加。
使用 aria2 來(lái)加速軟件的安裝:scoop install aria2 -g
scoop config aria2-max-connection-per-server 16
scoop config aria2-split 16
scoop config aria2-min-split-size 1M
如果想關(guān)閉 aria2,可以運(yùn)行 scoop config aria2-enabled false命令。
3.4 Scoop 常用命令# 搜索app
scoop search <應(yīng)用名>
# 檢查哪些軟件有更新
scoop status
# 版本切換
scoop reset <應(yīng)用名>@<版本切換>
# 禁止某app更新
scoop hold <應(yīng)用名>
# 更新所有app
scoop update *
# 安裝app
scoop install <應(yīng)用名>
#全局安裝app
scoop install -g <應(yīng)用名>
#安裝extras軟件源下的app
scoop install extras/<應(yīng)用名>
# 卸載app
scoop uninstall <應(yīng)用名>
# 卸載全局安裝的app
scoop uninstall -g <應(yīng)用名>4 小編綜合來(lái)說(shuō)
開(kāi)發(fā)環(huán)境軟件的安裝與配置到這里就完成了,利用上面這些軟件,你可以快速搭建 Java、Go、C++、Python等開(kāi)發(fā)環(huán)境。
參考資料
[1] Linux內(nèi)核更新包: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
[2] Microsoft Store: https://aka.ms/wslstore
[3] Ubuntu 20.04 LTS: https://www.microsoft.com/store/apps/9n6svws3rx71
[4] IP地址查詢(xún)網(wǎng)站: https://www.ipaddress.com/
拓展知識(shí):
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http://m.xiesong.cn/130451.html