wsl2安装启动mysql

wsl2安装启动mysql

启动

1
sudo /etc/init.d/mysql start

配置文件

1
sudo cat /etc/mysql/debian.cnf

用户名密码就在这

1
2
3
[client]
host = localhost

复制到用户名文件夹可以免输入用户名密码

1
sudo cp /etc/mysql/debian.cnf .my.cnf

要改变文件的所有者为用户

1
sudo chown cgz .my.cnf

遇到报错

1
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

问题就是没启动

运行上面的启动命令就行

1
root 的密码: 123456
1
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
1
CREATE USER 'mufeng'@'%' IDENTIFIED BY '123456';

wsl的代理如何与主机共享

wsl的代理如何与主机共享

需要拉取docker镜像,但是curl无效

设置配置文件.wslconfig后仍然ping不通

ping,ping的是ip,用的是icmp协议,在osi七层模型中用的是第三层(网络层)

其实是curl google.com

直接得到的就是

1
2
3
4
5
6
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

用浏览器访问一下就知道了

1
curl https://www.google.com.hk/  

这个才是正确的

在使用wsl时,突然不能用code打开vscode

在使用wsl时,突然不能用code打开vscode

加一行配置环境变量可以解决

1
export PATH="$PATH:/mnt/c/Users/86147/AppData/Local/Programs/Microsoft VS Code/bin"

但是不够优雅

/etc/wsl.conf 中明确追加 PATH 配置

1
2
[interop]
appendWindowsPath = true

设置完以上方法后,发现还是一样因为本来就默认共享环境变量

发现vscode文件路径名称有空格

wsl执行

1
echo $PATH

出现

1
/mnt/c/Users/86147/AppData/Local/Programs/Microsoft:VS:Code/bin

空格被识别成分割

所以可能是更新后路径名出现了这个bug导致无法正常识别环境变量

解决方案是用短路径

Windows 文件系统有短路径名(8.3 格式)支持,通常无空格,可以兼容在 WSL 和 Windows 下使用。你可以先找到短路径名,然后将其添加到环境变量中。

  1. 获取短路径名: 打开 Windows 命令提示符(cmd),输入以下命令以获取 Microsoft VS Code 文件夹的短路径名:

    1
    2
    3
    cmd

    dir "C:\Users\86147\AppData\Local\Programs\" /x

    你可能会看到一行输出类似:

    1
    03/12/2024  09:00 AM    <DIR>          MICRO~1    Microsoft VS Code

    MICRO~1 就是此文件夹的短路径名。用这个名字可以避免空格问题。

  2. 将短路径名添加到 PATH: 在 Windows 的环境变量设置中,将 VS Code 的路径设置为短路径格式。例如,将路径设置为:

    1
    C:\Users\86147\AppData\Local\Programs\MICRO~1\bin

    在 WSL 中,这个路径会自动被映射到 /mnt/c/Users/86147/AppData/Local/Programs/MICRO~1/bin,WSL 能正确解析。

安装虚拟python环境,采用轻量化的方案

安装虚拟python环境,采用轻量化的方案

创建一个轻量化的 Python 虚拟环境可以通过 venvvirtualenv 实现。这里我将介绍使用 venv 的方法,因为它是 Python 自带的模块,并且通常更简单。以下步骤适用于基于 Debian 的 Linux 发行版(例如 Ubuntu 和 WSL 的 Ubuntu 版本)。

1. 安装 Python 和 venv

确保你安装了 Python 和 venv 模块。在大多数情况下,Python 会默认包含 venv 模块,但你可以通过以下命令确认:

1
2
sudo apt update
sudo apt install python3 python3-venv

2. 创建虚拟环境

选择一个目录来存放你的虚拟环境,例如在你的项目文件夹中。

1
2
cd /path/to/your/project
python3 -m venv myenv

myenv 替换为你希望给虚拟环境起的名字。

3. 激活虚拟环境

激活虚拟环境,以便你在这个环境中安装的任何 Python 包都不会影响系统的全局 Python 设置。

1
source myenv/bin/activate

当虚拟环境激活后,你的命令行提示符通常会显示环境名称,例如 (myenv)

4. 安装所需的包

在激活的虚拟环境中,你可以使用 pip 安装任何你需要的 Python 包。例如,安装 requests 库:

1
pip install requests

5. 清理不必要的包

如果你希望保持环境轻量化,可以在使用完后移除不再需要的包。可以使用以下命令检查已安装的包:

1
pip list

并使用以下命令卸载不需要的包:

1
pip uninstall package_name

6. 退出虚拟环境

完成工作后,可以通过以下命令退出虚拟环境:

1
deactivate

总结

通过以上步骤,你可以创建一个轻量化的 Python 虚拟环境,并在其中安装所需的包。venv 提供了一个相对简单的方式来管理项目所需的依赖,同时保持系统 Python 环境的干净。在项目开发和测试中使用虚拟环境是良好的实践。

清理wsl磁盘空间

清理wsl磁盘空间

先以管理员身份运行powershell

1
diskpart

查看wsl发行版本

1
wsl -l  -v
1
2
3
4
 NAME              STATE           VERSION

* Ubuntu-22.04 Stopped 2
docker-desktop Stopped 2

查找 Linux 发行版的 .vhdx 文件和目录路径,

请打开 PowerShell 并使用以下脚本,将 <distribution-name> 替换为实际的发行版名称:

1
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<Ubuntu-22.04>' }).GetValue("BasePath") + "\ext4.vhdx"

结果将显示类似于 %LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState\<disk>.vhdx 的路径。 例如:

1
C:\Users\86147\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx

这是与你列出的 Linux 发行版关联的 ext4.vhdx 文件的路径。

先关掉

1
wsl --shutdown

压缩磁盘文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//4-3 依次输入下列命令
//选择目标磁盘文件
diskpart

select vdisk file="C:\Users\86147\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx"
//以只读模式连接虚拟磁盘文件
attach vdisk readonly

//开始压缩虚拟磁盘文件
compact vdisk

//分离虚拟磁盘文件
detach vdisk

//退出diskpart工具
exit

显示与此虚拟磁盘关联的详细信息,包括虚拟大小,表示当前分配给 VHD 的大小上限

1
detail vdisk

扩展空间

如何管理 WSL 磁盘空间 | Microsoft Learn

清理docker

Windows WSL2 占用磁盘空间清理释放_wsl占用空间太大-CSDN博客

1
2
3
4
5
6
7
8
9
docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- unused build cache

Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

连接问题

1
2
3
4
Socket error Event: 32 Error: 10053.
Connection closing...Socket close.

Connection closed by foreign host.

用手机连热点遇到的问题

推测不是负载过高导致的

端口:22,用手机和电脑上xshell连接有问题

刚进的时候可以,但是输入两到三行命令后会突然退出显示以上报错

排除xshell问题,因为手机端也不能正常连接

猜想排除网络问题,因为用4g网络,5g网络,wifi,都会出现以上情况

不是ip冲突导致的

输入last命令后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Last login: Wed Jun 26 00:23:36 2024 from 223.104.40.248
stydent@nihao:~$ last
stydent pts/0 223.104.40.248 Wed Jun 26 00:30 still logged in
stydent pts/0 223.104.40.248 Wed Jun 26 00:23 - 00:24 (00:00)
stydent pts/0 223.104.40.248 Wed Jun 26 00:16 - 00:17 (00:00)
stydent pts/0 223.104.40.248 Wed Jun 26 00:09 - 00:10 (00:00)
stydent pts/0 223.104.40.248 Wed Jun 26 00:02 - 00:03 (00:00)
stydent pts/0 120.244.62.97 Tue Jun 25 23:20 - 23:21 (00:00)
stydent pts/0 223.104.40.248 Tue Jun 25 16:23 - 16:32 (00:09)
stydent pts/1 223.104.40.248 Tue Jun 25 16:16 - 16:25 (00:08)
stydent pts/0 223.104.40.248 Tue Jun 25 16:10 - 16:19 (00:08)
stydent pts/0 223.104.40.248 Tue Jun 25 16:02 - 16:09 (00:06)
stydent pts/0 223.104.40.248 Tue Jun 25 15:55 - 15:58 (00:03)
stydent pts/2 223.104.40.248 Tue Jun 25 15:32 - 15:46 (00:14)
stydent pts/1 120.244.62.221 Tue Jun 25 14:56 - 15:38 (00:42)
stydent pts/0 120.244.62.221 Tue Jun 25 14:55 - 15:36 (00:40)
reboot system boot 5.15.0-1064-azur Tue Jun 25 14:53 still running

更换ip后依然不行,停止后重启暂时修复

启动机器人后突然挂掉,应该是负载问题

真相了

连接校园网就没问题

应该是手机热点导致的ip冲突

彻底真相了

1
lastb

随便截取一些记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
user     ssh:notty    43.134.171.154   Tue Jun 25 16:03 - 16:03  (00:00)
user ssh:notty 43.134.171.154 Tue Jun 25 16:03 - 16:03 (00:00)
root ssh:notty 43.163.200.19 Tue Jun 25 16:03 - 16:03 (00:00)
oracle ssh:notty 43.163.247.189 Tue Jun 25 16:03 - 16:03 (00:00)
oracle ssh:notty 43.163.247.189 Tue Jun 25 16:02 - 16:02 (00:00)
root ssh:notty 105.28.108.165 Tue Jun 25 16:02 - 16:02 (00:00)
daniel ssh:notty 201.234.7.122 Tue Jun 25 16:02 - 16:02 (00:00)
daniel ssh:notty 201.234.7.122 Tue Jun 25 16:02 - 16:02 (00:00)
test ssh:notty 43.134.171.154 Tue Jun 25 16:02 - 16:02 (00:00)
test ssh:notty 43.134.171.154 Tue Jun 25 16:02 - 16:02 (00:00)
root ssh:notty 43.163.200.19 Tue Jun 25 16:02 - 16:02 (00:00)
daniel ssh:notty 43.163.247.189 Tue Jun 25 16:02 - 16:02 (00:00)
daniel ssh:notty 43.163.247.189 Tue Jun 25 16:02 - 16:02 (00:00)
ubuntu ssh:notty 43.163.200.19 Tue Jun 25 16:01 - 16:01 (00:00)
root ssh:notty 201.234.7.122 Tue Jun 25 16:01 - 16:01 (00:00)
root ssh:notty 105.28.108.165 Tue Jun 25 16:01 - 16:01 (00:00)
ubuntu ssh:notty 43.163.200.19 Tue Jun 25 16:01 - 16:01 (00:00)
root ssh:notty 43.134.171.154 Tue Jun 25 16:01 - 16:01 (00:00)
root ssh:notty 43.163.247.189 Tue Jun 25 16:01 - 16:01 (00:00)
root ssh:notty 43.163.200.19 Tue Jun 25 16:00 - 16:00 (00:00)
root ssh:notty 43.134.171.154 Tue Jun 25 16:00 - 16:00 (00:00)
root ssh:notty 201.234.7.122 Tue Jun 25 16:00 - 16:00 (00:00)
root ssh:notty 43.163.247.189 Tue Jun 25 15:59 - 15:59 (00:00)
root ssh:notty 105.28.108.165 Tue Jun 25 15:59 - 15:59 (00:00)
root ssh:notty 140.246.109.211 Tue Jun 25 15:57 - 15:57 (00:00)
Admin ssh:notty 43.163.200.19 Tue Jun 25 15:56 - 15:56 (00:00)

看1panel的ssh登录日志,发现有两千多条和我无关的ip尝试登录,估计是被挤占的

linux问题解决:多种方法处理ssh暴力攻击_sshd:all:deny-CSDN博客

配置zsh遇到的问题

配置zsh遇到的问题

今天打开wsl,发现外观莫名其妙全变了,修改powershell的外观设置后,发现zsh的命令行颜色怎么改还是舒服,文件夹是蓝底白字的,想修改成蓝底黑字,网上搜索之后发现并没有关于配置文件的教程

我就又去查找了我安装的主题p10k,找到了这篇博客,powerlevel10k 颜色和图标的自定义设置-CSDN博客

打开~/.p10k.zsh搜索关键词DIR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
############################[ dir: 当前目录 ]###########################
# 当前目录的背景色。
typeset -g POWERLEVEL9K_DIR_BACKGROUND=4

# 当前目录的默认前景色。
typeset -g POWERLEVEL9K_DIR_FOREGROUND=232

# 如果目录过长,缩短其中一些段为最短的唯一前缀。缩短后的目录仍可通过 Tab 键补全为原来的完整路径。
typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique

# 用此符号替换被移除的目录段后缀。
typeset -g POWERLEVEL9K_SHORTEN_DELIMITER=

# 缩短后的目录段的颜色。
typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=232

# 锚点目录段的颜色。锚点段永远不会被缩短。第一个段始终是锚点。
typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=232

# 将锚点目录段以加粗方式显示。
typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true

注释交给gpt翻译了一下,修改即可

按照上面教程的方法,颜色代码可以输入以下命令查看

1
for code ({000..255}) print -P -- "$code: %F{$code}最左侧三位数字即颜色值Text Color%f"

每次修改配置后一定要输入

1
source ~/.p10k.zsh

修改之后遇到问题,发现缩短后的锚点文件夹不能加粗显示,修改配置文件也不行。

经检查发现是powershell外观配置问题,把外观->文本格式强调文本格式部分设置成加粗字体即可

还有一个意外发现就是在复制上面配置文件时,发现vim不能和windows共享剪贴板

于是搜索得到以下解决方案

clipboard - How to copy/paste from Vim in WSL - Stack Overflow

1.按v进入可视模式,滑动鼠标或者输入行数选中

2.按:,输入以下命令即可

1
:'<,'>w !clip.exe

如果要复制全部文本则直接输入该命令

1
:w !clip.exe

10-并发控制同步

10-并发控制:同步 (2)

可以用互斥锁来实现同步

在约定的状态上锁,然后同时解锁

(mutex库规定不能在一个线程获得锁,在另一个线程释放锁)

初始时都上锁,等待就是请求锁,

(信号量)P是取,V是放

拓展互斥锁,多个

happens-before

acquire-release

口袋和球,如果是一个球,那就是互斥锁

适用于可计数的资源

可以创建n个口袋

信号量用来实现生产者消费者

哲学家吃饭问题

刚开始的实现,简单使用信号量表示叉子,会出现死锁,即哲学家都拿起左手边的叉子或右手边的叉子,然后桌子上没有叉子,也没人放下

而用条件变量可以简单解决这个问题(哲学家会同时拿起或放下两只手的叉子)

信号量解决方法:

赶走桌子上的一个人,哲学家取到一个球才能上桌吃饭,吃完饭放回

但是问题更复杂,要求更多就很难了

给叉子编号也行,

条件变量是万能模板

用信号量实现条件变量

该例子是一个生产者一个消费者,缓冲区是1,如果缓冲区很大这个问题就会被忽视了,如果生产者和消费者数量增加,那么死锁概率也会增加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//错误的
void wait(struct condvar *cv, mutex_t *mutex){
mutex_lock(&cv -> lock);
cv -> nwait++;
mutex_unlock(&cv -> lock);
//理想状态是球在生产者和消费者之间传递
mutex_unlock(mutex);
//但是如果在这里broadcast抢占,先唤醒了,然后nwait=0了,
//就相当于唤醒了另一个同样是生产者或者是消费者线程甚至是自己把球抢走了,再检查条件再进入wait,但是没有线程再放球了就会死锁
P(&cv -> sleep);//这个睡眠和解锁顺序不能更改


mutex_lock(mutex);
}

问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Producer: Broadcast
Consumer: begin, execution count: 1449
Consumer: Waiting
waiting at 32
Producer: begin, execution count: 1450
(
depth = 1
//nwait: 1
//broadcast end
//Producer: Broadcast
Producer: begin, execution count: 1451
Producer: Waiting
waiting at 32
waiting out
Producer: Waiting
waiting at 32

现在的问题是,为什么前一个线程执行完的broadcast后,新建的produce线程为什么球会取走,不应该是执行完一个线程再执行同一种线程吗,而且例子中只有一个生产者和一个消费者,缓冲区大小为1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Producer: begin, execution count: 14397
(
depth = 1
//Producer: Broadcast
//start broadcast
nwait: 0
//broadcast end
//Consumer: Broadcast
Producer: begin, execution count: 14398
Producer: Waiting
in wait nwait: 1
waiting at 32
//start broadcast
nwait: 1
waiting out
Producer: Waiting
//broadcast end
in wait nwait: 1
waiting at 32
Consumer: begin, execution count: 14399
)
depth = 0
//Consumer: Broadcast
//start broadcast
nwait: 1
broadcast end
Consumer: begin, execution count: 14400
Consumer: Waiting
in wait nwait: 1
waiting at 32
waiting out
Consumer: Waiting
in wait nwait: 2
waiting at 32

09-并发控制

09-并发控制:同步

希望可以控制顺序

  • 控制并发,使得 “两个或两个以上随时间变化的量在变化过程中保持一定的相对关系”

1.开始同时执行

2.最后等待同时执行

互相已知

从一个简单状态到另一个简单状态(状态分支聚起来)

简单->复杂->简单……..

先到先等,先完成等待

sync

每个线程都有wait_next_beat等待下一个拍子再执行

1
2
3
4
5
void wait_next_beat() {
retry:
if (!next_beat_has_come) {
goto retry;
}

同步(synchronization)指的是多个线程在执行时保持协调,以确保它们在预期的时间点上执行特定的操作。具体来说,这里的同步是指:

  1. 开始时间一致:确保某些操作在多个线程中同时开始。例如,wait_next_beat 函数确保 T_player 线程在预期的节拍时开始播放音符。
  2. 协调执行:确保线程在执行过程中保持协调。例如,release_beat函数由 T_conductor线程调用,以通知 T_player线程可以继续到下一个节拍。

在这个代码中,T_conductor线程通过调用 release_beat来增加节拍计数 n,而 T_player线程通过 wait_next_beat来等待节拍计数达到预期值,从而实现同步。

生产者-消费者问题

共享缓冲区

打印左括号的条件:缓冲区未满就可以

打印右括号的条件:当前有左括号就可以

等到达成同步条件再执行

错误1:ready是共享变量,可能已经在解锁时被其他线程改变了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void T_produce() {
while (1) {
retry:
mutex_lock(&lk);
int ready = (depth < n);
mutex_unlock(&lk);
if (!ready) goto retry;

// assert(depth < n);

mutex_lock(&lk);
printf("(");
depth++;
mutex_unlock(&lk);
}
}

正确:但是如果条件不满足,就会不断锁上再解锁,浪费资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void T_produce(){
while(1){
retry:
mutex_lock(&lk);
if(!(deepth < n)){
mutex_unlock(&lk);
goto retry;
}

assert(depth < n);

printf("(");
depth++;
mutex_unlock(&lk);
}
}

条件变量

1
2
#define CANPRODUCE (depth < n)
#define CANCONSUME (depth > 0)

不符合条件时,睡眠,等待被唤醒

生产者和消费者是两个不同的线程

所以以下是错误的,因为生产者和消费者的条件变量不相同,唤醒不一定满足自己的条件,所以会使断言不一定正确(详见ostep)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void T_produce() {
while (1) {
mutex_lock(&lk);
if (!CAN_PRODUCE) {
cond_wait(&cv, &lk);
}
// assert(CAN_PRODUCE);
printf("(");
depth++;

cond_signal(&cv);
mutex_unlock(&lk);
}
}

条件变量的正确使用,每次改动后都通知所有线程

1
2
3
4
5
6
7
8
mutex_lock(&mutex);
while (!COND)
{
wait(&cv, &mutex);
}
assert(cond);
...
mutex_unlock(&mutex);

并行编程的本质

把任务分解

生成有向无环图

并行计算,每个节点满足条件就计算

拓扑排序,计算

打印鱼

把状态图画出来,根据状态图得到条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const char roles[] = ".<<<<<<<>>>>>>>______";
//每个线程获得一个字符,如果太少就不能等到下一个状态,就会阻塞
void fish_thread(int id) {
char role = roles[id];
while (1) {
mutex_lock(&lk);
while (!can_print(role)) {
cond_wait(&cv, &lk);
}

putchar(role); // Not lock-protected

current = next(role);
assert(current);
cond_broadcast(&cv);
mutex_unlock(&lk);
}
}