wsl2環境搭建

2022-06-09 15:03:20

序言

我電腦設定不高,開虛擬機器器跑linux總覺得太卡。最近才瞭解到windows早就上了wsl2——一款較為輕量的虛擬機器器軟體。所以本篇部落格偏筆記向,存粹記錄以便多次使用。

環境

  1. 宿主機windows11
  2. 目標:安裝基於WSL2的Ubuntu20.04虛擬機器器以及一些常用軟體環境。

WSL2安裝

可直接參考Microsoft官網手冊,輸入命令wsl --install一次性預設安裝完畢。不過我本機設定不高,所以自己採用分步安裝,以達到自定義存放虛擬機器器位置的目的。

  1. 啟用windows功能
    設定->應用和功能 ->程式和功能 ->啟用或關閉windows功能

  2. 啟動windows的linux子系統和虛擬機器器平臺,管理員身份開啟Powershell,執行命令

    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    
  3. 重啟電腦讓設定生效。

  4. 下載linux核心更新包並且執行更新。

    https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

  5. (可選)如果想預設使用wsl2,則設定命令wsl --set-default-version 2 。如果想同時使用wsl1和wsl2,則可以對下載好不同的linux發行版設定version

    wsl --set-version Ubuntu-18.04 2
    wsl --set-version Ubuntu-20.04 1
    
  6. 下載ubuntu20.04 https://aka.ms/wslubuntu2004。(可能是網路問題下載很慢,我改用微軟商店下載很快)

  7. 將檔案字尾改為.zip,然後解壓

  8. 雙擊exe啟動,根據提示設定賬號密碼,安裝完成。

設定阿里雲映象

  1. 為了提高Linux包管理器下載軟體速度,修改apt-get映象源。開啟阿里雲的ubuntu映象網站 https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.3e221b11YfnocC
  2. 根據提示將設定內容覆蓋到 /etc/apt/sources.list檔案中(記得先備份)。
  3. 然後執行命令 sudo apt-get update

------------------------------------以下安裝內容為可選向-----------------------------------------

安裝jdk

直接在apt源內找一個下載。

sudo apt search jdk
udo apt install openjdk-11-jdk
java -v #下載好後測試一下

安裝maven

  1. 下載:可以直接用apt源下載maven3.6.3。不過由於我曾經用3.6.3版本各種構築出bug,所以還是老實上官網下。(進入maven官網,下載字尾為bin.tar.gz的版本)

    wget https://dlcdn.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz #下載包
    tar -zxf apache-maven-3.8.5-bin.tar.gz
    
  2. 設定環境變數

    sudo vim /etc/profile
    export M2_HOME=/opt/apache-maven-3.8.5
    M2_HOME = /opt/apache-maven-3.8.5
    export PATH=${M2_HOME}/bin:$PATH #新增到檔案結尾
    退出後執行 source /etc/profile讓變數生效
    mvn -v #列印出版本號說明設定成功
    
  3. 設定maven阿里雲映象,此處獲取映象地址

    cd /opt/apache-maven-xxx/conf  #進入安裝目錄下的conf資料夾
    vim settings.xml
    在指定位置貼程式碼就行。
    

安裝mysql

  1. 下載mysql 8.0的安裝設定包->解壓->更新apt源->安裝mysql 8.0 server

    wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb #下載
    sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb #解壓並且選擇設定
    sudo apt update #更新
    sudo apt install mysql-server #下載mysql 8.0
    
  2. 建立使用者,支援遠端連線

    1. 執行 sudo service mysql start 啟動資料庫。
    2. 因為mysql8的root賬戶加密外掛預設採用sock外掛(即mysql root賬戶在登陸時只會允許外部系統使用者名稱為同名root的使用者登陸)。所以安裝mysql時有沒有初始化密碼無所謂,直接sudo mysql開啟即可。
    sudo mysql
    use mysql;
    create user '#userName'@'#host' identified by '#passWord'; #建立角色,#host設定為%,代表該賬戶允許其他ip地址連線
    grant all on *.* to '#username'@'%'; #圖省事,給了所有許可權。
    flush privileges; #重新整理授權
    
  3. 修改組態檔

    sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
    將 bind-address 註釋
    重啟mysql服務即可
    

安裝python3

因為筆者的linux環境自帶python,所以暫時直接用。在此也備份一個網路上的方法(新增源然後下載)。

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.6

安裝c和 c++

sudo apt update
sudo apt install build-essential #一次安裝gcc,g++和make

安裝redis

  1. 可以直接使用 sudo apt install redis 下載倉庫自帶的版本,比較方便。這裡演示一下下載官網版本。
  2. 下載安裝
    wget https://github.com/redis/redis/archive/7.0.0.tar.gz #下載安裝包
    tar -zxf 7.0.0.tar.gz #解壓
    mv redis /opt/ # 移動到自定義位置
    sudo make ; #安裝 (可選)
    sudo make install PREFIX=/opt/redis-7.0.0 #自定義安裝位置並且安裝(可選)
    ./opt/redis-7.0.0/bin/redis-server  #執行redis-server,如果出現執行畫面則成功
    
  3. 建立組態檔和服務指令碼檔案
    cd /opt/redis-7.0.0
    cp redis.conf ./bin/6379.conf#將組態檔複製一份到軟體目錄下,埠號作為名字是為了之後註冊指令碼服務時方便用到。
    cp /opt/redis-7.0.0/utils/redis_init_script /etc/init.d/redis #複製指令碼檔案,方便service命令啟動
    
  4. 修改指令碼檔案
    以下幾個引數根據自己實際情況修改。
    sudo vim /etc/init.d/redis
         14	REDISPORT=6379
         15 EXEC=/opt/redis-7.0.0/bin/redis-server
         16 CLIEXEC=/opt/redis-7.0.0/bin/redis-cli
         17
         18 PIDFILE=/var/run/redis_${REDISPORT}.pid
         19 CONF="/opt/redis-7.0.0/bin/${REDISPORT}.conf"
    
  5. 修改組態檔
    sudo vim /opt/redis-7.0.0/bin/6379.conf
    protected-mode no #關閉保護模式,允許遠端連線的寫入讀取。
    daemonize yes #後臺執行
    # bind 127.0.0.1 -::1 #註釋此行,允許遠端連線
    
  6. 執行 sudo service redis start

固定ip

我感覺wsl2目前比較受人詬病的其中一點是wsl2的ip是動態的,每次完全關閉再開啟wsl2都會更新ip,儘管目前可以使用localhost存取wsl2內執行的伺服器,可是還是想嘗試固定ip。翻閱論壇、部落格以及開源社群,找到一個比較精簡的方法。在宿主機上寫個指令碼(可以自行修改linux發行版名稱以及ip)

wsl -d Ubuntu-20.04 -u root ip addr add 192.168.50.16/24 broadcast 192.168.50.255 dev eth0 label eth0:1 #注意必須是root
netsh interface ip add address "vEthernet (WSL)" 192.168.50.88 255.255.255.0

每次重啟wsl後以管理員許可權執行一下該指令碼即可。

ps :不用每次右擊指令碼使用管理員許可權的方法。

  1. 右鍵建立快捷方式
  2. 進入屬性,點選快捷方式下的高階
  3. 勾上管理員身份執行即可。

自啟動指令碼

wsl2目前還沒有systemctl,所以軟體不能開機自啟,開源社群提供一些自己開發的仿Systemctl軟體,不過目前還不夠完善,所以我用開機+自動執行指令碼來達到傻瓜式自啟。

  1. 在宿主機建立指令碼(或者直接新增到上面固定ip指令碼後面)
  2. 輸入wsl /home/allworldg/startup.sh
  3. 在虛擬機器器內同樣位置建立 /home/allworldg/startup.sh
  4. 根據自己情況編輯startup.sh ,例如
     echo '123123'| sudo -S service mysql start #自動輸入sudo的密碼
     echo '123123'| sudo -S service redis start
    

踩坑

  1. 因為修改 /etc檔案的許可權,導致sudo無法使用。
    1. 原因:每次編輯/etc檔案都得加 sudo,太不爽,圖痛快直接來了一句 sudo chown "myusername" -R /etc ,結果後來使用sudo命令時報錯。
      sudo: /etc/sudoers is owned by uid 1000, should be 0
      sudo: no valid sudoers sources found, quitting
      sudo: unable to initialize policy plugin
      
    2. 解決方式:執行 pkexec /usr/sbin/visudo命令即可。
    3. 由於本次環境是在wsl2下,使用以上命令並不能成功執行,所以還需要別的方法。經過查閱得知,對於 WSL 而言,可以在 CMD 或者 Windows PowerShell 中使用以下命令登陸 root 賬號:wsl -u root 。然後修改sudoerssudoers.e即可。
      chown root:root /etc/sudoers
      chown -R root:root /etc/sudoers.d