---
title: wsl2
categories:
  - CS
status: done
abbrlink: 47686
---

# 安装 wsl

前置条件，主板 bios 开启 `intel 虚拟化`

> ms app store如果打不开、转圈 -> 关闭小飞机，也可以试试 改 ipv4 host 4.2.2.2

- windows terminal 必备，ms store 下载

[巨硬官方文档](https://docs.microsoft.com/en-us/windows/wsl/install)

# ubuntu软件源

[阿里开源镜像站](https://developer.aliyun.com/mirror/)

下面是 ubuntu20.04 用的

```bash
# 备份apt默认源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list
# 替换 /srouces.list
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


# 更新apt
sudo apt upgrade
sudo apt update
```

# 安装 zsh

> 注意`.zshrc`在安装的`用户`目录下，别和`root`搞混了

```bash
# 安装
sudo apt install zsh
# 将 zsh 设置为默认 shell
chsh -s /bin/zsh
# 检查，若没成功，重启试试看
echo $SHELL
```

# 安装 oh-my-zsh

```bash
# 443 confused 手动 vim oh-my-zsh.sh 然后 bash ./oh-my-zsh.sh 
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```

# 配置 oh-my-zsh 主题/插件/alias

安装插件

- 自动补全: 

```bash
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
```

- 代码高亮: 

```bash
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```

修改`当前用户`目录下的 `.zshrc`

```bash
# 主题
ZSH_THEME="ys"
# 引入插件
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
# alias
alias cls='clear'
alias ga='git add'
alias gc='git commit -m'
alias gp='git push'
alias gf='git fetch'
alias update='sudo apt update'
alias upgrade='sudo apt upgrade'
alias install='sudo apt install'
# windows文件管理器打开wsl文件
alias open='explorer.exe'
```

# 安装 Nodejs

[巨硬文档赛高](https://docs.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-wsl)

安装完注意文字提示

```bash
# =>Appending nvm source string to /home/mozzie/.zshrc
# => Appending bash_completion source string to /home/mozzie/.zshrc
# => Close and reopen your terminal to start using nvm or run the following to use it now:
```
照它说的做

```bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
```

验证`nvm`安装 `nvm ls`，会看见类似

```bash
iojs -> N/A (default)
node -> stable (-> N/A) (default)
unstable -> N/A (default)
```

安装 `nodejs stable`

```bash
nvm install node
# node -v | npm -v 验证安装版本
```

# 子系统使用宿主机代理

1. clash为例，勾选 `允许局域网` 

2. wsl2 子系统 root 权限

```bash
export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"
# 生效
# source ~/.bashrc
# source ~/.zshrc
```

# 外网/LAN 访问 wsl2 服务

[巨硬官方解释](https://docs.microsoft.com/en-us/windows/wsl/networking)

When using a WSL 1 distribution, if your computer was set up to be accessed by your LAN, then applications run in WSL could be accessed on your LAN as well.

This isn't the default case in WSL 2. WSL 2 has a virtualized ethernet adapter with its own unique IP address. Currently, to enable this workflow you will need to go through the same steps as you would for a regular virtual machine. (We are looking into ways to improve this experience.)

Here's an example PowerShell command to add a port proxy that listens on port 4000 on the host and connects it to port 4000 to the WSL 2 VM with IP address 192.168.101.100

```bash
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100
```
> 注意端口覆盖的问题，避免 windows 端口和端口 wsl2 冲突

## netsh 端口映射

- listenaddress: 监听地址, 0.0.0.0 表示匹配所有地址
- listenport: 监听的 windows 端口

- connectaddress: 转发到 wsl2 的 ip地址, 这里设置为localhost，默认从 windows 可以通过localhost 访问 wsl2
- connectport: 转发到 wsl2 的端口

例如 windows 的 ip 为 `192.168.1.100`，监听  windows 的 3000 端口，转发到 wsl2 ip localhost 的 3000 端口

```bash
# windows-terminal 管理员权限执行
netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=localhost
# 删除端口监听
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=3000
```

## 配置 windows defender 防火墙入站规则

新建规则 -> 端口 -> TCP / 特定本地端口(3000) -> 允许链接 -> 下一步 -> 取个名字 -> Done

# docker 

windows 宿主机安装 `docker desktop`，`设置 -> 资源 -> WSL INTEGRATION` 打开 对应的 linux发行版，即使用

## mysql 容器

```bash
# brdige
docker network create --driver bridge --subnet=172.21.0.0/16 wsl2
# pull
docker pull mysql:5.7.38
# 生产 mysql 5.7.38 容器
docker run --restart=always --privileged=true -p 3306:3306 --name mysql --net wsl2 --ip 172.21.0.5 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.38
```

## mongo 容器

```bash
docker pull mongo:5.0
# 宿主机 /mongo/data
docker run --restart=always -d -p 27017:27017 -v /mongo/data:/data --name mongo --net wsl2 --ip 172.21.0.6 mongo:5.0 --auth
# 初始化
docker exec -it mongo /bin/bash
# 进入 mongo shell
mongo
# admin
use admin
# 创建root用户，管理全部数据库的权限，这会可以navicat等gui链接数据库，用户名密码root，验证数据库admin
db.createUser({
   user: "root",
   pwd: "root",
   roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
# 退出
exit
# 再次进入
mongo
# 使用root登录授权，正确返回 1
db.auth("root","root")
# 创建 testDB 数据库
use testDB
# 创建 test 用户 管理 testDB
db.createUser({user:'test',pwd:'test',roles:[{role:'dbOwner',db:'testDB'}]})
```

使用 navicat 登录，验证数据库 `admin` ，用户名密码 `test`


# 默认 wsl root 用户登录

```bash
# wsl -l 查看 ubuntu版本，例如 Ubuntu-20.04
Ubuntu2004 config --default-user root
```
