跳到主要内容

Windows开发环境搭建

· 阅读需 10 分钟

一开始接触到程序开发时,使用的就是 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 导出目录:

/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\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 相比 PuTTYMobaXterm 等调试工具有一个突出的优点,它的log功能非常好用,可以在每行log都加入时间戳,精确到毫秒,以下是 SecureCRT 的log配置设置:

打开 OptionsConfigureDefault Session...TerminalLog File

  • Log file name 设置为:E:\Downloads\%S-%Y%M%D%h%m%s.log
  • 勾选 Options 下的:Overwrite fileStart 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),这些就是下拉框中显示的连接历史记录 。将它们全部删除即可清除下拉列表。

评论

欢迎补充上下文、指出问题,或者留下进一步讨论的线索。

正在加载留言板…