feat: v1.0.0 祀梦笔记:从 0 到 1 的数字化花园建设

This commit is contained in:
祀梦
2026-01-09 10:03:40 +08:00
commit a5fd8545f4
75 changed files with 15529 additions and 0 deletions

View File

@@ -0,0 +1,149 @@
---
title: 在 Windows10 上部署 WSL2 并启动 ubuntu 虚拟机
createTime: 2025/09/29 07:13:17
cover: /images/elysia/3.jpg
coverStyle:
layout: right
permalink: /article/deploying-wsl2-on-windows-10/
---
嗨呀~让我们在 Windows10 专业版上部署 WSL2 并启动 ubuntu 20.04 虚拟机吧~
最好使用 Windows10 专业版,并且在物理机上部署呢,在虚拟机上部署的话可能会有小麻烦,所以不太推荐啦~
<!-- more -->
## Windows10 镜像
大家好呀今天要教大家如何在Windows10上部署WSL2并启动ubuntu虚拟机哦
首先呢我们需要准备一个Windows10的镜像文件虽然Microsoft官方有提供不过很容易下载失败呢所以建议大家去[MSDN](https://msdn.itellyou.cn/)下载会更稳定哦~
在MSDN官网找到「操作系统」→「Window10」→「Windows 10 (Multiple Editions) (x64)」这个版本它包含了专业版呢要注意哦WSL2只支持专业版、企业版或教育版不支持家庭版呢所以建议大家直接安装专业版会更方便
## 启用WSL2和虚拟机平台
接下来我们需要启用WSL2和虚拟机平台的功能哦首先以管理员身份打开PowerShell然后依次运行下面的命令
```powershell
# 启用 WSL 功能
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 启用虚拟机平台WSL2 必需)
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
运行完成后记得要重启电脑哦重启之后我们还要把WSL2设置为默认版本呢
```powershell
# 设置 WSL2 为默认版本
wsl --set-default-version 2
```
## 在 WSL2 中安装 ubuntu 20.04 LTS 虚拟机
现在到了安装Ubuntu虚拟机的环节啦还是以管理员身份打开PowerShell然后依次运行这些命令
```powershell
# 查看可用的 Ubuntu 版本
wsl --list --online
# 安装 Ubuntu 20.04 虚拟机
wsl --install -d Ubuntu-20.04
```
安装过程大概是这样的哦~让我们一起来看看:
```powershell :collapsed-lines
wsl: 使用旧分发注册。请考虑改用基于 tar 的分发。
正在下载: Ubuntu 20.04 LTS
Ubuntu 20.04 LTS 已下载。
已成功安装分发。可以通过 “wsl.exe -d Ubuntu 20.04 LTS” 启动它
正在启动 Ubuntu 20.04 LTS...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: simeng
New password:
Retype new password:
passwd: password updated successfully
操作成功完成。
wsl: Failed to start the systemd user session for 'root'. See journalctl for more details.
Installation successful!
wsl: Failed to start the systemd user session for 'simeng'. See journalctl for more details.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 6.6.87.2-microsoft-standard-WSL2 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Tue Sep 30 14:27:51 CST 2025
System load: 0.48 Processes: 74
Usage of /: 0.1% of 1006.85GB Users logged in: 1
Memory usage: 7% IPv4 address for eth0: 172.31.237.99
Swap usage: 0%
Expanded Security Maintenance for Applications is not enabled.
0 updates can be applied immediately.
Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
This message is shown once a day. To disable it please create the
/home/simeng/.hushlogin file.
simeng@localhost:~$
```
这样我们就成功安装好Ubuntu虚拟机啦可以开始使用了哦
### 安装过程中可能会出现的错误
在安装过程中,可能会遇到一些小问题呢~不过不用担心,已经帮大家准备好了解决方案哦~
#### 错误码 0x800701bc 缺少更新包
如果看到这样的错误信息:
```txt
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x800701bc
Error: 0x800701bc WSL 2 ?????????????????? https://aka.ms/wsl2kernel
Press any key to continue...
```
这说明系统缺少WSL2所需的Linux内核更新包哦这时候我们可以打开微软官网的[下载 Linux 内核更新包](https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package)页面,下载最新的包安装就可以解决啦~
#### 错误码 0x80370102 虚拟化技术没有开启
如果遇到这个错误可能是因为虚拟化技术没有开启哦如果是在真实机上操作的话需要进入BIOS开启虚拟化技术呢开启之后可以在任务管理器 -> 性能 -> CPU 的详情页面中,看到下方的虚拟化状态显示为「已启用」哦~
![虚拟化技术启用](https://image.simengweb.com/blog/technology/20250930140716_251_27.png)
如果是在虚拟机中操作的话就需要启用嵌套虚拟化技术啦以VMware为例
先关闭虚拟机,然后找到虚拟机的.vmx配置文件通常在虚拟机目录下在文件末尾添加一行`vhv.enable = "TRUE"`
保存之后再启动虚拟机就可以啦如果还是失败的话建议尝试换用WSL1或者使用Hyper-V来部署Windows10虚拟机哦
## 通过 WSL2 操作 ubuntu 20.04 LTS 虚拟机
安装完成后我们该如何操作Ubuntu虚拟机呢很简单哦以管理员身份打开PowerShell然后运行这个命令查看已安装的虚拟机
```powershell
# 查看已安装的虚拟机
wsl -l -v
```
如果前面的步骤都正确的话这里应该可以看到一个Ubuntu-20.04的虚拟机啦~
另外在文件资源管理器中会多出一个Linux文件夹里面有一个Ubuntu-20.04文件夹,这就是虚拟机的根目录哦~
想要启动并进入Ubuntu虚拟机的话可以运行这个命令
```powershell
wsl -d Ubuntu-20.04
```
如果直接退出终端或者关闭窗口,虚拟机实例就会进入挂起状态,下次需要重新启动才能继续使用哦~当然,也可以通过指令强制终止虚拟机:
```powershell
wsl --terminate Ubuntu-20.04
```
## 通过 VS Code 开发
接下来我们还可以通过VS Code来进行开发哦不过需要先安装一些扩展呢'Remote - SSH'和'WSL'
安装好扩展后在VS Code左侧打开远程资源管理器就可以看到Ubuntu20.04虚拟机啦~直接点击连接就可以了哦~不过第一次连接可能需要启动一下虚拟机,会有点慢呢,耐心等待一下吧~
![连接 WSL2 虚拟机](https://image.simengweb.com/blog/technology/20250930144329_252_27.png)
连接成功之后,就可以愉快地进行开发啦~是不是很简单呢~

View File

@@ -0,0 +1,120 @@
---
title: WSL2 核心操作指南
createTime: 2025/09/30 16:08:32
cover: /images/elysia/4.jpg
permalink: /article/operate-wsl2/
---
这篇文章主要讲WSL2虚拟机核心操作哦它基于轻量级Hyper-V运行像贴心小精灵默默工作还能用命令行精细控制接下来讲启动/关闭、实例管理、资源配置、网络操作、备份迁移这五大操作,是不是很期待呢~♪
<!-- more -->
## 启动/关闭 WSL2 虚拟机
WSL2的虚拟机平时是由Windows自动管理的呢不过我们也可以通过命令手动控制它的生命周期哦
```
# 启动指定的发行版
wsl -d Ubuntu-20.04
# 关闭指定的发行版
wsl --terminate Ubuntu-20.04
```
如果想要完全关闭WSL2的所有虚拟机也是可以的哦
使用这个命令后,所有的发行版都会被强制终止,内存、网络、文件句柄都会被全部释放呢~
```
wsl --shutdown
```
## 管理正在运行的 WSL 实例
想知道当前有哪些WSL实例在运行吗很简单哦使用下面这个命令就可以查看啦
```
wsl -l -v
```
输出结果大概是这个样子的哦~
```text
NAME STATE VERSION
* Ubuntu Running 2
docker-desktop Running 2
Ubuntu-20.04 Stopped 2
```
看到那个带星号(*)的了吗?那就是当前的默认系统哦~如果想要设置新的默认发行版,可以使用这个命令:
```
wsl --set-default Ubuntu-20.04
```
嘿嘿~接下来讲讲怎么删除一个 WSL 实例哦如果想和某个WSL实例说拜拜就可以用下面这个命令哒
```
wsl --unregister Ubuntu-20.04
```
注意,删除后无法恢复哦~请谨慎操作~
## 配置 WSL2 资源
WSL2的资源也是可以自定义配置的哦我们可以通过编辑`%USERPROFILE%\.wslconfig`文件来设置内存、CPU核心数等参数呢
```
[wsl2]
# 内存限制默认80% 物理内存)
memory=4GB
# CPU 核心数限制(默认:全部核心)
processors=2
# 交换空间大小默认25% 内存)
swap=2GB
# 是否启用 localhost 端口转发(默认 true
localhostForwarding=true
```
要注意哦修改完配置后必须重启WSL2虚拟机才能让这些设置生效呢
## 网络相关配置
WSL2使用的是虚拟NAT网络哦它和Windows主机是相互隔离的但又可以互相通信呢是不是很神奇
| 方向 | 访问方式 | 说明 |
| --- | --- | --- |
| Windows -> WSL2 | localhost:port | 自动端口转发(需要`localhostForwarding=true` |
| WSL2 -> Windows | `host.docker.internal``$(cat /etc/resolv.conf \| grep nameserver \| awk '{print $2}')` | 获取主机的IP地址 |
| 外部机器 -> WSL2 | 默认不可达 | 需要手动端口转发或使用 Windows 防火墙规则 |
想知道WSL2的IP地址吗可以用这个命令查看哦不过要注意每次启动WSL2后IP地址可能会变呢
注意哦这个命令需要进入到WSL2虚拟机内部执行才行呢
```
hostname -I
```
如果需要访问WSL2中的服务多亏了`localhostForwarding`的配置,我们直接访问[localhost:port](http://localhost:port)就可以啦~超方便的~
如果需要手动设置端口转发可以在Powershell中添加防火墙规则和端口转发哦不过要记得以管理员方式打开Powershell呢
```
# 获取 WSL2 当前IP地址
$wslIp = (wsl hostname -I).Trim()
$wslIp
# 添加端口转发(以 8000 端口为样例)
netsh interface portproxy add v4tov4 listenport=8000 listenaddress=0.0.0.0 connectport=8000 connectaddress=$wslIp
# 开放 Windows 防火墙
New-NetFirewallRule -DisplayName "WSL2 Port 8000" -Direction Inbound -LocalPort 8000 -Protocol TCP -Action Allow
# 撤销端口转发
netsh interface portproxy delete v4tov4 listenport=8000 listenaddress=0.0.0.0
# 撤销开放的防火墙规则
Remove-NetFirewallRule -DisplayName "WSL2 Port 8000"
```
## 备份和迁移
WSL2发行版也是可以备份和迁移的哦我们可以把整个发行版导出成tar文件这样就可以用于备份、迁移或者分享给其他小伙伴啦
```
# 导出指定发行版到 tar 文件
wsl --export <发行版名称> <输出文件路径.tar>
wsl --export Ubuntu-20.04 D:\backups\ubuntu-2004.tar
# 导入 tar 文件为新的发行版
wsl --import <新发行版名称> <安装目录> <tar 文件路径> [选项]
wsl --import Ubuntu-Backup C:\wsl\Ubuntu-Backup D:\backups\ubuntu-2004.tar --version 2
```
要注意哦导入完成后默认用户会变成root呢如果想要设置回原来的用户可以使用这个命令
```
ubuntu2004.exe config --default-user username
```
悄悄告诉大家一个小秘密WSL2是可以同时存在多个同源发行版的哦这样我们就可以在不同的环境中进行不同的实验啦是不是很方便呢

View File

@@ -0,0 +1,118 @@
---
title: 原码、反码、补码
createTime: 2026/01/08 16:34:05
cover: /images/elysia/6.jpg
coverStyle:
layout: right
permalink: /archives/6f41cabe-41e6-4a09-9f1c-af7dd709a35d/
---
欢迎来到 0 与 1 的魔法派对!这篇文章将带你揭开原码、反码与补码的奥秘,看计算机如何巧妙地用补码化减为加。让我们一起翻开这页,去捕捉二进制底层那份迷人的理性之美吧♪
<!-- more -->
## 一、 前置概念
计算机底层存储数据的时候使用的是二进制数字,但是计算机在存储一个数字的时候并不是直接存储该数字对应的二进制数,而是存储该数字对应的**二进制数的补码**。
在了解原码、反码和补码之前,我们要了解**机器数**和**真值**的概念。
### 1) 机器数
一个数在计算机的存储形式是二进制数,我们称这些二进制数为**机器数**。机器数是有符号的,在计算机中用机器数的最高位存放符号位,`0` 表示正数,`1` 表示负数。
### 2) 真值
因为机器数带有符号位,所以机器数的形式值不等于其真实表示的值(真值)。
- 以机器数 `1000 0001` 为例,其真正表示的值(首位为符号位)为 `-1`,而形式值(首位就是代表 1`129`
- 因此将带符号的机器数的真正表示的值称为机器数的**真值**。
## 二、 原码、反码与补码
### 1) 原码
原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值。
- **正数**:就是它对应的二进制数。
- **负数**:将绝对值对应的二进制最左边位变为 `1`
例如十进制的正负 1用 8 位二进制的原码表示如下:
- `[+1]` = 原: `[ 0000 0001 ]`
- `[-1]` = 原: `[ 1000 0001 ]`
### 2) 反码
- **正数**:和原码相同。
- **负数**:在其原码的基础上,**符号位不变,其余各位取反**。
示例:
- `[+1]` = 原: `[ 0000 0001 ]` = 反: `[ 0000 0001 ]`
- `[-1]` = 原: `[ 1000 0001 ]` = 反: `[ 1111 1110 ]`
### 3) 补码
- **正数**:补码是其原码本身。
- **负数**:补码是在其原码的基础上,**符号位不变,其余各位取反后加 1**(即在反码的基础上加 1
示例:
- `[+1]` = 原: `[ 0000 0001 ]` = 反: `[ 0000 0001 ]` = 补: `[ 0000 0001 ]`
- `[-1]` = 原: `[ 1000 0001 ]` = 反: `[ 1111 1110 ]` = 补: `[ 1111 1111 ]`
## 三、 数据在计算机中的存储形式
计算机实际上只存储**补码**,所以说原码转换为补码的过程,也可以理解为数据存储到计算机内存中的过程。
在原、反、补码中,正数的表示是一模一样的,而负数的表示是不相同的。因此对于负数的补码来说,我们不能直接用进制转换将其转换为十进制数值,因为这样是得不到计算机真正存储的十进制数的。**应该将其转换为原码后,再将转换得到的原码进行进制转换为十进制数**(机器数包含符号位)。
## 四、 为什么会使用原码、反码、补码
对于人脑来说,知道机器数的第一位是符号位是一件很轻松的事情,但对于计算机基础电路设计来说判别第一位是符号位是非常难和复杂的事情。
为了让计算机底层设计更加简单,于是设计将符号位参与运算,并且**只保留加法**的方法,通过**加上一个负数的方式来实现减法**。这样让计算机运算更加简单,并且也让符号位参与到运算中去。
## 五、 使用原码、反码与补码进行运算
### 1) 使用原码运算
计算十进制表达式:`1 - 1 = 0`
```text
1 - 1 = 1 + (-1)
= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]
= 原:[ 1000 0010 ] = -2
```
**结论**:如果用原码表示,让符号位也参与计算,对于减法来说,结果是不正确的。这也是计算机内部在存储数据时不使用原码的原因。为了解决这一问题,出现了反码。
### 2) 使用反码运算
计算十进制表达式:`1 - 1 = 0`
```text
1 - 1 = 1 + (-1)
= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]
= 反:[ 0000 0001 ] + 反:[ 1111 1110 ]
= 反:[ 1111 1111 ] = 原:[ 1000 0000 ] = -0
```
**结论**:通过计算我们发现用反码计算减法,结果的真值部分是正确的。唯一的问题出现在 "0" 这个特殊的数值上。虽然人们理解上 `+0``-0` 是一样的,但是 0 带符号是没有任何意义的,而且会有 `[0000 0000]原``[1000 0000]原` 两个编码表示 0。为了解决这一问题出现了补码。
### 3) 使用补码运算
计算十进制表达式:`1 - 1 = 0`
```text
1 - 1 = 1 + (-1)
= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]
= 补:[ 0000 0001 ] + 补:[ 1111 1111 ]
= 补:[ 0000 0000 ] = 原:[ 0000 0000 ] = 0
```
**结论**:这样 0 用 `[0000 0000]` 表示,而以前出现问题的 `-0` 则不存在了。而且人们还发现可以用 `[1000 0000]` 表示 `-128`
**-128 的推算过程如下**
```text
(-1) + (-127) = -128
= 原:[ 1000 0001 ] + 原:[ 1111 1111 ]
= 补:[ 1111 1111 ] + 补:[ 1000 0001 ]
= 补:[ 1000 0000 ]
```
> **注意**:因为实际上是使用以前的 `-0` 的补码来表示 `-128`,所以 `-128` 并没有原码和反码表示。只要补码是 `[1000 0000]`,其十进制数值就为 `-128`。
### 4) 小结
因为补码能多存储一个 `-128`,而且在计算机底层中存储的是补码,所以在计算机中一个 8 位的二进制数的存储范围是用补码表示的 `[-128, 127]`,而不是用原码或反码表示的 `[-127, 127]`。这也可以解释为什么计算机中一个字节的取值范围是 `[-128, 127]`
## 六、 总结(牢记)
- **二进制的最高位是符号位**`0` 表示正数,`1` 表示负数。
- **正数三码合一**:正数的原码、反码、补码都一样。
- **负数反码**:它的原码符号位不变,其它位取反。
- **负数补码**:它的反码 + 1反之负数反码 = 负数补码 - 1。
- **0 的表示**`0` 的反码、补码都是 `0`
- **运算方式**:在计算机运算的时候都是以 **“补码”** 的方式来运算的。
- **查看结果**:当我们看运算结果的时候,要看它的**原码**(重点)。