跳到主要内容

Windows

系统安装​

下载 Windows 11 ISO文件,准备一个8G或以上的U盘,使用 Rufus 创建USB启动盘。

在对硬盘进行分区的时候,每个磁盘分区在格式化之后都会少100MB(或200MB,不清楚原因,可以尝试),所以如果我们想正好分配250G(资源管理器看到的磁盘总大小)给D盘的话,那么需要分配总大小 :

100MB+250*1024MB=256100MB

在安装过程中,我们希望跳过网络连接和微软账户登录。因为这样会使得用户目录不太优雅,极有可能我们的用户目录是 C:\Users\16806 这样的邮箱前缀,或者 C:\Users\张三 这样带中文的目录,给编程有些程序调试带来障碍(有些程序不能很好的兼容非ASCII字符路径)。所以我们在安装的过程中,一定要记住断开网络,在安装引导界面键入Shift + F10 调出CMD窗口,然后输入:

OOBE\BYPASSNRO

跳过网络连接。

安装WSL2​

安装完系统后,推荐立马安装WSL2,目前我觉得这是一个非常不错的Windows下开发工具套件。但是此前安装过程中,因为网络等问题出现过各种稀奇古怪且在Google搜不到的问题,所以推荐安装完系统后立马安装WSL2,这样一来如果出现问题我们可以立马选择重装系统重新来一遍。

wsl --install

# 重装
wsl --unregister Ubuntu
wsl --install Ubuntu

移动位置​

安装完WSL之后,为了避免占用C盘过多空间,一般选择移动到其他几个磁盘分区中:

D: # 进入根目录 D:/
wsl --shutdown
wsl --list
wsl --export Ubuntu Ubuntu.tar
wsl --unregister Ubuntu
wsl --import Ubuntu D:\Ubuntu D:\Ubuntu.tar
ubuntu config --default-user amass

如果需要配置WSL2,例如限制占用最大内存等等,可创建C:\Users\%YourName%\.wslconfig文件然后参考 WSL 中的高级设置配置进行配置。

中文设置​

参考 Ubuntu 开发环境搭建 中文设置。

OpenSSH Server​

参考 Ubuntu 开发环境搭建 OpenSSH Server 安装配置后,我们还需打开端口的 Windows 防火墙:

New-NetFirewallRule -DisplayName "WSL2 SSH" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1022

创建 Powershell 文件启动 sshd 服务,然后对该 SSHD 端口流量进行转发:

# 启动 sshd 服务
wsl -u root -e sh -c "service ssh start"

$wsl_ip = (wsl hostname -I).trim()
netsh interface portproxy delete v4tov4 listenport=1022
netsh interface portproxy add v4tov4 listenport=1022 connectport=1022 connectaddress=$wsl_ip

该脚本需要以管理员权限运行。

另外,WSL 如果监测到系统处于空闲状态,会自动结束系统进程,所以我们在运行上述脚本使用 ssh 访问之前,最好在 Windows 先打开一个 Ubuntu 终端让系统一直保持非空闲被使用的状态。

NFS​

sudo apt install nfs-kernel-server

配置 NFS 导出目录:

/etc/exports
/home/amass/Projects/100ask_stm32mp157_pro-sdk *(rw,sync,no_subtree_check,no_root_squash,insecure)
  • * 允许所有 IP 访问,也可替换为特定 IP 或网段(如 192.168.1.0/24)。
  • rw:允许读写。
  • sync:同步写入。
  • no_root_squash:允许客户端 root 用户保留权限(谨慎使用)。
  • 客户端 mount 失败时,可尝试加上 insecure。

重新加载 NFS 配置:

sudo exportfs -rav
sudo service nfs-kernel-server restart

在管理员权限终端配置 Windows 防火墙:

New-NetFirewallRule -DisplayName "NFS Port 2049" -Direction Inbound -Protocol TCP -LocalPort 2049 -Action Allow
New-NetFirewallRule -DisplayName "NFS Port 2049" -Direction Inbound -Protocol UDP -LocalPort 2049 -Action Allow

对该 NFS 端口流量进行转发:

$wsl_ip = (wsl hostname -I).trim()
netsh interface portproxy delete v4tov4 listenport=2049
netsh interface portproxy add v4tov4 listenport=2049 connectport=2049 connectaddress=$wsl_ip

# 查看所有代理规则
netsh interface portproxy show all

客户端挂载:

mkdir /root/100ask_stm32mp157_pro-sdk
sudo mount -t nfs 192.168.3.6:/home/amass/Projects/100ask_stm32mp157_pro-sdk /root/100ask_stm32mp157_pro-sdk

虚拟磁盘文件​

WSL 的虚拟磁盘 ext4.vhdx 文件,如果虚拟机被损坏(例如不小心删掉了一些配置文件,导致无法运行WSL),可以将 ext4.vhdx 备份,然后使用 7-Zip 打开该文件,将重要文件拷贝出来。

.vhdx 虚拟硬盘文件大小会越来越大,我们可以使用磁盘管理工具diskpart 将文件大小变小,首先在停止 WSL,然后在 PowerShell 输入 diskpart 打开工具,然后在新的 diskpart 控制台传入输入如下:

select vdisk file="D:\Ubuntu\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

WSL 容器​

Windows 下运行 Linux 容器不再安装 Docker Desktop,改用 WSL 内置的容器 CLI wslc,无需另装引擎,要求 WSL 2.9.3 或更高版本(wsl --version 查看,wsl --update 升级)。

命令与 Docker CLI 基本一致,另带 container.exe 别名:

wslc run --rm -it ubuntu:latest bash # 前台交互,退出即删除
wslc run -d --rm -p 8080:80 --name web nginx # 后台运行并映射端口
wslc run --rm -it -v D:\Projects:/workspace -w /workspace ubuntu:latest bash # 挂载 Windows 目录
wslc exec web cat /etc/os-release
wslc container list --all
wslc container stop web
wslc build -t myimage .
  • 容器运行在独立于 WSL 发行版的会话虚拟机中,镜像、容器、网络和卷存放在 %LOCALAPPDATA%\wslc\sessions 下的会话虚拟磁盘里,不占用发行版的 ext4.vhdx。
  • 会话的 CPU、内存等配置执行 wslc settings 修改,首次执行会生成 %LOCALAPPDATA%\wslc\settings.yaml,所有配置项以注释形式列出默认值。
  • 为避免占用 C 盘,可修改 settings.yaml 的 storagePath,它替换的是 %LOCALAPPDATA%\wslc\sessions 中的 %LOCALAPPDATA% 部分,会话虚拟磁盘随之落在 <storagePath>\wslc\sessions。
  • 回收空间使用 wslc container prune 清理已停止的容器,wslc image prune 清理未使用的镜像。
  • 暂不支持 Docker Compose,依赖 compose.yaml 的项目需要逐个 wslc run 启动。

Git for Windows​

下载解压至 D:\Program Files,然后将 D:\Program Files\PortableGit\cmd 加入 Windows 环境变量 PATH 中。不要将 D:\Program Files\PortableGit\bin 加入 PATH,这样会给各种 CLI 工具带来干扰。

PowerShell​

在 Windows 环境下,推荐升级至最新版本的 PowerShell,以获得对各类 CLI 工具的最佳兼容性和交互体验:

# 安装
winget install --id Microsoft.PowerShell --source winget

# 更新
winget upgrade --id Microsoft.PowerShell

也可以在 GitHub 下载,然后将其添加至系统 Path 环境变量,VS Code 作如下设置:

%APPDATA%\Code\User\settings.json
{
"editor.minimap.enabled": false,
"workbench.editor.enablePreview": false,
"security.workspace.trust.enabled": false,
"terminal.integrated.profiles.windows": {
"PowerShell 7": {
"path": "D:\\program files\\powershell-7.6.6-win-x64\\pwsh.exe"
}
},
"terminal.integrated.defaultProfile.windows": "PowerShell 7",
"terminal.integrated.fontFamily": "MesloLGS NF",
"C_Cpp.intelliSenseEngine": "disabled",
"C_Cpp.autocomplete": "disabled",
"C_Cpp.errorSquiggles": "disabled",
"C_Cpp.formatting": "disabled"
}

安装完成后,在 Windows Terminal 的 设置 ➡ 启动 中,将 默认配置文件 从 Windows PowerShell 更改为 PowerShell。

可以通过在终端中执行以下命令来验证 PowerShell 的更新情况(例如在 Developer PowerShell for VS 2022 等环境下):

$PSVersionTable

MSYS2​

MSYS2 在Windwos上提供了一个 Linux 命令环境。安装完成后,使用Windows Terminal作为终端。在Terminal Tab下拉框,找到设置,点击左下角的打开JSON文件,在profiles.list加入如下item:

{
"guid": "{17da3cac-b318-431e-8a3e-7fcdefe6d114}",
"name": "UCRT64 / MSYS2",
"commandline": "D:/msys64/msys2_shell.cmd -defterm -here -no-start -ucrt64",
"startingDirectory": "D:/msys64/home/%USERNAME%",
"icon": "D:/msys64/ucrt64.ico",
"font":
{
"face": "Lucida Console",
"size": 14
}
}

MSYS2更新包:

pacman -Q # 查看已安装的软件包
pacman -Suy # 更新 msys2及其所有已安装的包
pacman -S diffutils # 安装常用命令

继承 Windows 环境变量​

需要修改 D:\msys64\msys2_shell.cmd 中的 rem set MSYS2_PATH_TYPE=inherit。去掉rem,以取消这⼀句的注释。使MSYS2的环境变量继承 Windows 的 PATH 环境变量。这样就可以在 MSYS2 的终端使用诸如 code VS Code 这样的 Windows 终端命令了。

加入 Windows 环境变量​

注意

不建议将 msys2 的命令加入环境变量中,在一些复杂的命令使用情况会遇到一些莫名奇妙问题。

Windows 本地环境和 MSYS2 两者字符处理的,路径处理的方式不同也可能会带来一些问题。如果交叉使用某些命令遇到了问题,需要优先考虑是不是这样用带来的问题。

OpenSSH Server​

以管理员身份运行如下命令:

# 安装
dism.exe /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0

# 启动 SSH 服务
Start-Service sshd

# 设置为自动启动
Set-Service -Name sshd -StartupType 'Automatic'

# 查看服务状态
Get-Service sshd

服务启动后,还需在管理员 PowerShell 中放行默认的 TCP 22 入站连接,否则远程 SSH 可能无法访问。安装时通常会自动创建 OpenSSH-Server-In-TCP 规则,参见微软说明。以下命令在规则缺失时创建,已有时确保启用:

if (Get-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -ErrorAction SilentlyContinue) {
Set-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -Enabled True -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22 -Profile Any
} else {
New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22 -Profile Any
}

-Profile Any 使规则适用于域、专用和公用网络。若在 sshd_config 中修改了 Port,需将上述 -LocalPort 22 同步替换为实际端口。

从另一台 Windows 电脑验证端口连通性,将示例 IP 替换为服务器地址;使用自定义端口时也需替换 -Port 22:

Test-NetConnection -ComputerName 192.168.1.100 -Port 22

TcpTestSucceeded 为 True 表示 TCP 端口可达。

修改 sshd_config 文件(C:\ProgramData 为隐藏目录),找到如下两行注释掉 :

C:\ProgramData\ssh\sshd_config
# Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

重启 OpenSSH Server 使配置生效:

Restart-Service sshd

在 C:\Users\你的用户名\.ssh 创建 authorized_keys 文件,将公钥 id_ed25519.pub 的内容复制粘贴进去。

将 SSH Shell 由 CMD 替换为 PowerShell 7:

# 1. 自动获取 winget 安装的 pwsh.exe 绝对路径
$pwshPath = (Get-Command pwsh).Source

# 或者手动指定
$pwshPath = 'D:\Program Files\PowerShell-7.6.5-win-x64\pwsh.exe'

# 2. 直接将获取到的路径写入 OpenSSH 的注册表配置中
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name "DefaultShell" -Value $pwshPath -PropertyType String -Force

SSH 登录后的工作目录默认是用户主目录,用 profile 把它切到 D:\Projects,在服务器上以登录 SSH 的那个用户执行:

New-Item -ItemType Directory -Force -Path (Split-Path $PROFILE.CurrentUserAllHosts) | Out-Null

Add-Content -Path $PROFILE.CurrentUserAllHosts -Encoding utf8 -Value @'
if ($env:SSH_TTY -and (Test-Path 'D:\Projects')) {
Set-Location 'D:\Projects'
}
'@

SSH_TTY 只在分配了 pty 时注入,因此仅交互式登录会命中,ssh 主机 "命令" 和本机终端都不受影响。

SecureCRT​

SecureCRT 相比 PuTTY、MobaXterm 等调试工具有一个突出的优点,它的log功能非常好用,可以在每行log都加入时间戳,精确到毫秒,以下是 SecureCRT 的log配置设置:

打开 Options ➡ Configure ➡ Default Session... ➡ Terminal ➡ Log File:

  • 将 Log file name 设置为:E:\Downloads\%S-%Y%M%D%h%m%s.log。
  • 勾选 Options 下的:Overwrite file、Start log upon connect。
  • 将 Custom log data 下的 On each line: 设置为:[%h:%m:%s.%t] (注意在]加上空格以增强日志阅读性)。

日志文件名和自定义日志数据替换:

  • %H:主机名(连接主机的IP地址)
  • %S:会话名
  • %Y:年份
  • %M:月份
  • %D:日
  • %h:小时
  • %m:分钟
  • %s:秒
  • %t:毫秒

Default Session... 是指配置之后,每次创建新的 session 都会导入该配置,无需重复配置,非常方便。

VMware​

VMware Workstation 17 Pro 貌似在兼容性做的不够好,在运行 Windows7、Ubuntu 24.04 时,装好虚拟机运行后就会导致 VMware 直接卡死。这里找到一个临时的解决办法:

在虚拟机的设置中,关闭 加速3D图形 选项。

双系统安装​

出于一些原因,可能有时候需要安装双系统,在原理和使用上是没问么问题的。

但是总不这么推荐,因为很容易一个系统破坏另一个系统。结果导致就是又得来一次重装系统,资料丢失。一直在折腾的路上。有钱且不考虑数量体积的前提下,还是推荐一个终端安装一个系统。

引导项设置​

这里不叙述 Ubuntu 系统的安装,安装完双系统之后,我们一般选择GRUB作为主引导程序,因为我们大部分时间还是使用Windows,所以需要修改其默认启动Windows。

在 Ubuntu 下以管理员权限使用 nano 编辑 /etc/default/grub 文件:

GRUB_DEFAULT= (GRUB默认启动项)
GRUB_TIMEOUT= (GRUB选择项的等待时间)

修改完成后,在终端输入如下命令,并重启即可。

sudo update-grub

时间不一致​

sudo apt install ntpdate
sudo ntpdate time.windows.com
sudo hwclock --localtime --systohc

VirtIOFS共享宿主机文件​

主机如下设置:

在Windows虚拟机内,除了安装 virtio-win-0.1.271 以外,还需要安装 winfsp。

其它​

删除 远程桌面连接 下拉列表选项:

  • 按 Win + R,输入 regedit 并回车,打开注册表编辑器 。
  • 清理连接地址列表:在地址栏导航至 HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default 。在右侧窗格中,你会看到一系列以 MRU 开头的字符串值(如 MRU0, MRU1),这些就是下拉框中显示的连接历史记录 。将它们全部删除即可清除下拉列表。

评论

如果内容有勘误、补充或不同看法,可以直接写在这里。

邮箱用于回复通知和显示头像,地址不会公开

删除评论

将删除 的这条评论,以及它下面的全部回复。删除后无法恢复。