玩转 WSL 之前的痛苦踩坑

MySQL8.x 在 WSL 中的登录须知

这个版本要在终端登录 MySQL, 不仅需要输入正确密码, 还需要管理员权限

~$ mysql -u root -p
Enter password:******
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
~$ sudo mysql -u root -p
[sudo] password for <username>:
Enter password:******
Welcome to the MySQL monitor.

mysql>

所以咱还是乖乖地使用 MySQL5.x 或 6.x 吧, 不仅方便/稳定, 也更接近实际工程

WSL重置 root/user 密码

设置默认登录

将ubuntu子系统设置为:默认以root用户登录

PS > ubuntu config --default-user root

进入 ubuntu 更改密码

进入ubuntu后会发现已经拥有root权限, 可以输入下面的命令重置指定用户的密码

~# passwd <username>

输入后会弹出重置密码的提示, 输入新密码即可
成功重置后退出 ubuntu

~# exit

恢复权限

PS > ubuntu config --default-user <username>

此时再进入 ubuntu 就会以普通用户登录

Ubuntu/Debian 重置数据库密码

获取备用用户

ubuntu 和 Debian 服务器会在系统中创建一个备用用户, 可以在拿到管理员权限后使用备用用户进行密码重置
首先我们要拿到备用用户的 username 和 password

~$ sudo cat /etc/mysql/debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = <password>
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = <password>
socket   = /var/run/mysqld/mysqld.sock

一般来讲, username 都是 debian-sys-maint
然后下面的 password 就是登录密码了

通过备用用户修改密码

先用备用用户登录

~$ sudo mysql -u debian-sys-maint -p
[sudo] password for <username>:
Enter password:******
Welcome to the MySQL monitor.

mysql>

依次执行以下 SQL 语句

use mysql;
update user set authentication_string='<newpassword>' where user='<user>';
flush privileges;
exit;

退出后对 MySQL 服务进行重启 (记得开启管理员权限)

sudo service mysql restart

然后就可以使用新密码进行登录了

VSCode 连接 WSL 进行项目开发

安装 WSL 扩展

VSCode扩展商店,搜就完事了

建立项目

进入ubuntu子系统,创建项目文件夹,并使用code打开

~$ mkdir WSLtest
~$ ls
WSLtest
~$ cd WSLtest
~/WSLtest$ code .

文件操作授权

连接后在 VSCode 可以直接创建、修改、删除文件
但是可能需要权限,否则会报错
在 VSCode 打开 ubuntu 终端, 输入:

sudo chown -R <username> /home/<username>/

即可获取文件操作权限

关于 MySQL 的远程连接

WSL 上的 MySQL 和windows宿主机上的 MySQL 都使用 3306 端口, 并不冲突

查看宿主机ip

在 powershell 输入

PS > ipconfig
···
···
以太网适配器 vEthernet (WSL):

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : <IPv6>
   本地链接 IPv4 地址. . . . . . . . : <IPv4>
   子网掩码  . . . . . . . . . . . . : 255.255.240.0
   默认网关. . . . . . . . . . . . . :

获取到的 IPv4 地址即为宿主机提供 WSL 访问的 ip 地址
还有一种方法, 可以在 WSL 中查询宿主机的ip
在 ubuntu 终端输入:

~$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver <windows ip>

最后显示的 nameserver 即为宿主机的ip

查看 ubuntu(WSL) 的ip

在 ubuntu 终端输入

~$ ifconfig

如果提示没有这个命令, 则执行下面的命令安装网络服务

~$ sudo apt install net-tools

接下来重试 ifconfig 即可

~$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.241.101  netmask 255.255.240.0  broadcast 172.17.255.255
        inet6 fe80::215:5dff:fe67:5c77  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:67:5c:77  txqueuelen 1000  (Ethernet)
        RX packets 101030  bytes 237377098 (237.3 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 68158  bytes 5950642 (5.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 72890  bytes 73188479 (73.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 72890  bytes 73188479 (73.1 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0 即为 WSL 的内网ip, 可以在 windows 宿主机通过此 ip 访问部署在子系统中的 MySQL
上面这段示例中, 172.17.241.101 是 WSL 的内网ip

配置 MySQL (windows宿主机)

需要 root 权限, 主要目的是将用户的 host 属性从 “localhost” 改为 “%”
这就相当于开放了指定用户的远程访问权限

PS > mysql -u root -p
Enter password:******
Welcome to the MySQL monitor.

mysql> update 

配置 MySQL (WSL)

与宿主机步骤类似

~$ sudo mysql -u root -p
[sudo] password for <username>:
Enter password:******
Welcome to the MySQL monitor.

mysql>

WSL 配置 conda 环境

在 windows 下载 miniconda, 然后从文件管理器将 .sh 安装文件拷贝到 WSL 的文件目录中(别学,我大一时候写的,不推荐的操作)

可以先在 windows 的浏览器里找到下载地址,然后在 wsl 使用 wget 来下载。miniconda 清华镜像

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_24.4.0-0-Linux-x86_64.sh

从 WSL 进入该目录, 然后执行:

/path/to/miniconda$ sudo bash <miniconda安装包的名字>.sh

接下来会呈现一段用户协议, 一路回车即可, 在遇到 \ 的地方输入 yes 然后回车, 然后就会开始安装, 等待安装完毕即可

安装完成后输入以下命令来更新环境变量

~$ source ~/.bashrc
(base) ~$

之后就可以正常使用所有 conda 命令了

在 sudo 状态下使用 python,可能出现 python: command not found 的错误

这是因为 sudo 会清空 PATH 环境变量,这导致基于环境变量运行的 conda 无法使用

解决办法

~$ sudo env PATH=$PATH python script.py

安装 docker-desktop 后使用 wsl 命令报错

这是因为使用 wslbash 命令会尝试启动默认的 wsl 发行版

在安装 docker-desktop 后,默认的 wsl 发行版被更换成了 docker-desktop,这是不能直接启动的

img

解决方法是将默认 wsl 发行版改回原样(这不会对 docker 的运行有任何影响)

PS > wsl --list
PS > wsl --set-default Ubuntu