Skip to content

WSL2使用

约 1057 字大约 4 分钟

WSL2

2025-01-08

前言

Windows Subsystem for Linux (WSL) 是 Windows 的一项功能,允许您在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双重启动。 WSL 旨在为想要同时使用 Windows 和 Linux 的开发人员提供无缝且高效的体验。 WSL2 使用虚拟化技术在轻量级实用虚拟机 (VM) 内运行 Linux 内核,与 WSL 架构相比,WSL2 提高了文件系统性能并增加了完整的系统调用兼容性。

1. 安装 WSL2

以管理员身份运行PowerShell输入以下命令:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  • 这将启用 WSL 功能,但不会立即重启计算机。

接着输入命令:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  • 这将启用虚拟机平台,这是运行 WSL2 所必需的。完成后需要重启电脑。

然后打开Microsoft Store并搜索wsl,选择一个发行版下载安装,例如选择Ubuntu 20.04.6 LTS

然后在 PowerShell 中运行以下命令,将 WSL2 设置为默认的 Linux 版本:

wsl --set-default-version 2
  • 这将确保你安装的任何新的 Linux 发行版都将默认使用 WSL2。

然后按照 Ubuntu 系统提示设置好用户名和密码即可。

wsl 常用命令:

# 启动子系统
wsl
# 列出所有子系统状态
wsl -l -v
# 关闭子系统 
wsl --shutdown

2. 安装 Docker

2.1 安装 Docker Engine

参照 Docker 官网 操作。

2.2 设置 Docker 命令无需 sudo

参照 Docker 官网 操作。

2.3 安装 Docker-Compose

参照 Docker 官网 操作。

2.4 配置镜像源

编辑 /etc/docker/daemon.json文件,没有就创建一个,文件内容如下:

{
    "registry-mirrors": [
       "https://registry.docker-cn.com",
       "https://docker.mirrors.ustc.edu.cn",
       "https://hub-mirror.c.163.com"
    ]
}

3. 优化 WSL2 启动

默认情况下有两个问题:

  • 打开命令行输入wsl等待几秒钟就会启动子系统,同时也会自启 Docker,一旦关闭命令行后,子系统也会自动关闭,Docker 也就无法访问了;
  • 子系统默认会占用主机一半的资源(如CPU、内存等);

上述问题解决方式,创建一个文件如wsl-startup.vbs,填写如下内容:

set ws=wscript.CreateObject("wscript.shell")
ws.run "wsl -d Ubuntu-20.04", 0

其中发行版的名称根据实际情况写,我这里是Ubuntu-20.04,根据wsl -l -v命令下显示的名称写的。双击运行会开启 WSL 实例,它会永久等待输入,不会关闭。所以当你下次再使用WSL命令时,就不会遇到需要重新唤醒 WSL 的耗时。 也可以设置为开机启动,win+R运行shell:startup打开启动目录,将脚本放进去,这样当系统启动登录系统后,Windows会自动执行脚本。

在 Windows 的用户目录,即%USERPROFILE%下有个.wslconfig文件,没有就创建一个,填写如下内容:

[wsl2]
memory=4GB 
processors=2

资源限制根据自己电脑实际配置调整,这样当子系统启动时就会读取这个文件。更多配置请参考官网

附加

记录下dcoker-compose.yaml文件配置:

version: '3.3'

networks:
  net:
    driver: bridge

services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: unless-stopped
    environment:
      MYSQL_CHARACTER_SET_SERVER: utf8mb4
      MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    networks:
      - net
    ports:
      - 3306:3306
    volumes:
      # 数据目录
      - ${ROOT_PATH}/mysql/data:/var/lib/mysql
      # 配置文件
      - ${ROOT_PATH}/mysql/conf/my.cnf:/etc/my.cnf
      # 日志
      - ${ROOT_PATH}/mysql/log:/var/log/mysql

  redis:
    image: redis:6.0
    container_name: redis
    restart: unless-stopped
    networks:
      - net
    ports:
      - 6379:6379
    # 设置访问密码
    command: redis-server --requirepass ${REDIS_PASSWORD}
    volumes:
      # 数据目录
      - ${ROOT_PATH}/redis/data:/data

  # nginx:
  #   image: nginx:1.23
  #   container_name: nginx
  #   restart: unless-stopped
  #   networks:
  #     - net
  #   ports:
  #     - 80:80
  #   volumes:
  #     # 配置文件目录
  #     - ${ROOT_PATH}/nginx/conf:/etc/nginx
  #     # 静态文件
  #     - ${ROOT_PATH}/nginx/html:/usr/share/nginx/html
  #     # 日志目录
  #     - ${ROOT_PATH}/nginx/log:/var/log/nginx

同级目录下创建.env文件:

ROOT_PATH=~/.docker/develop
#
# mysql
MYSQL_ROOT_PASSWORD=8le0snJvDn
MYSQL_DATABASE=develop
MYSQL_USER=mayee
MYSQL_PASSWORD=LpotkYvf26
# redis
REDIS_PASSWORD=KQglpfgWgZ

文件目录即为 compose stack 的名称,创建的网络名称会在前面加 stack 名称前缀。

使用docker-compose up -d可创建并启动全部容器,docker-compose up -d mysql redis 启动指定容器,docker-compose down停止并销毁 compose stack 中定义的所有容器即网络。

可在 ~/.bashrc文件中定义指令别名,达到简写的目的,如:

alias dk='docker'
alias dkcp='docker-compose'
alias dev='cd ~/.docker/develop'