Windows开发环境搭建
一开始接触到程序开发时,使用的就是 Windows 系统,那是已经是 Windows 8.1 了吧。从那时开始,总是喜欢折腾重装系统,强迫症迫使总想装一个十分干净的系统,或者哪里配置错了就立马想着重装。重装解决一切问题,真不是说着玩玩的,但是也浪费了大把时间。嗯,把这个时间用来干啥不好......
系统安装
下载 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 导出目录:
/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\DockerDesktopWSL\disk\docker_data.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
Git for Windows
下载解压至 D:\Program Files,然后将 D:\Program Files\PortableGit\cmd 加入 Windows 环境变量 PATH 中。不要将 D:\Program Files\PortableGit\bin 加入 PATH,这样会给各种 CLI 工具带来干扰。
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 两者字符处理的,路径处理的方式不同也可能会带来一些问题。如果交叉使用某些命令遇到了问题,需要优先考虑是不是这样用带来的问题。
生成公私/钥
在日常开发中,或多或少都会使用SSH登录远端机器,或者在Docker。这时比起设置密码来说,使用公私/钥进行登录就会比密码便捷安全的多(前提是一定要保护好私钥,不要泄漏出去)。
在构建Docker镜像时,如果我们想未某个用户添加密码,那么通过何种方式(环境变量,或者脚本),密码都是不安全的(不考虑 Docker Swarm),能被通过一些方式查看到(例如 docker inspect)。
ssh-keygen -C "168062547@qq.com"
系统将提示你输入文件保存路径。如果你不想覆盖现有的SSH密钥,可以指定一个新的文件名:
Enter file in which to save the key (/home/amass/.ssh/id_ed25519): /root/amass/id_ed25519_amass
然后提示输入密钥密码(passphrase),为了使用的便捷性,我们选择留空,接受略微降低安全性的损失。
步骤完成之后,会在 /home/amass 目录下生成公钥文件id_ed25519_amass.pub以及私钥文件id_ed25519_amass。
我们可以将公钥添加到远端服务器:
ssh-copy-id -i /home/amass/id_ed25519_amass.pub user@hostname
然后尝试登录:
ssh -i /home/amass/id_ed25519_amass user@hostname
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),这些就是下拉框中显示的连接历史记录 。将它们全部删除即可清除下拉列表。