玩转 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
接下来会呈现一段用户协议, 一路回车即可, 在遇到 \
安装完成后输入以下命令来更新环境变量
~$ source ~/.bashrc
(base) ~$
之后就可以正常使用所有 conda 命令了
在 sudo 状态下使用 python,可能出现 python: command not found
的错误
这是因为 sudo 会清空 PATH
环境变量,这导致基于环境变量运行的 conda 无法使用
解决办法
~$ sudo env PATH=$PATH python script.py
安装 docker-desktop 后使用 wsl
命令报错
这是因为使用 wsl
和 bash
命令会尝试启动默认的 wsl 发行版
在安装 docker-desktop 后,默认的 wsl 发行版被更换成了 docker-desktop,这是不能直接启动的
解决方法是将默认 wsl 发行版改回原样(这不会对 docker 的运行有任何影响)
PS > wsl --list
PS > wsl --set-default Ubuntu