血的教训

新电脑和当前电脑具有不同的平台和操作系统
  • 导出 environment_name.yml 文件:conda env export > environment.yml
  • 在新电脑上,利用生成的 environment_name.yml 文件复现环境:conda env create -f environment.yml
折腾虚拟机(一定要养成创建系统还原点和定期备份注册表的好习惯 T…T)

主播的软硬件环境

我一直用的是 VirtualBox-7.1.6-167084-Win 版本的 VirtualBox。但是在其上安装了 ubuntu-24.04.2-desktop-amd64

运行完:

sudo apt install build-essential dkms linux-headers-$(uname -r)

准备好了安装增强包前的编译环境后,安装了 VirtualBox 的增强包,可还是无法使用双向文件拖拽、无缝模式、共享文件夹这三大功能。

image-20250625181024804

一开始该问题怀疑可能与 Ubuntu 的版本有关,于是又下载了 ubuntu-22.04.5-desktop-amd64 结果该版本安装好后竟然连 Terminal 都打不开,更别提安装增强包了。经过多次反复重装 ubuntu 后还是没解决问题。

于是我怀疑或许是 VBoxGuestAdditions.iso 增强包与 VirtualBox 版本不一致?(可能性极小)于是我抱着试一试的态度便升级了 VirtualBox 到其最新版 VirtualBox-7.1.10-169112-Win 这时还能正常安装 VirtualBox,我将它安装到了上一个版本 VirtualBox 的安装目录下(安装前未卸载上个版本)。结果用新版 VirtualBox 启动虚拟机时出现了以下错误:

image-20250625181111641

我无奈,想着是不是我的 Windows11(我前一天刚从 Windows10 更新到 Windows11)和 VirtualBox 不兼容?而且我用不惯 Windows11,在文件夹中右键居然没有刷新按钮!于是我又利用官方的系统恢复回到了 Windows10。

恢复完运行虚拟机还是报以上的那个相同错误:

image-20250625181111641

我只能怀疑是旧版本的 VB 的残留影响了新的 VB,我于是准备全部卸载掉重装,结果一卸载发现,卸载也报错,卸载不了 VB 了:

image-20250625181637551

根据 Gemini,我怀疑是两个版本的.msi 文件互相干扰,我便尝试了解压旧版本 VB 的安装包,尝试找到.msi 文件替代不知道出了什么问题的.msi 文件,结果一解压完旧 VB 的安装程序在里面根本没找到.msi 文件。我又尝试不卸载了,直接换个安装目录,再装一遍新版,结果安装也是报和卸载同样的错误。

事情到这个地步,我顿感大事不妙,心态开始变化。

我又折腾了一通各种卸载和清理注册表的软件,那些破软件全是广告,要不就是收费太贵。下次还是用 winget 吧。

这时我心态已经爆炸了,抱着明天就去创建完系统还原点后暴力修改注册表的最糟打算,就上床睡觉了,此时已深夜了。

结果第二天又是一顿折腾,都已经创建好系统还原点了,抱着再试试的想法最后还是根据 Gemini 的建议到微软官方下载了 修复无法安装或删除程序的问题 - Microsoft 支持 疑难解答,安装和卸载故障排除程序。结果真的修复成功了,可以正常安装和卸载 VirtualBox 了。如果又天使的话那一定是 安装和卸载故障排除程序 一切又回到了折腾之初,然鹅我的``Ubuntu`还是不能用扩展包的功能…

最后附上和 Gemini 的对话记录:https://g.co/gemini/share/0e98a69490b5(VirtualBox 安装/卸载错误)


2025.11.20 更新


此次参考资料汇总:

VMware下载:https://github.com/yanghao5/VM-download

Ubantu下载:Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

Kali下载:Get Kali | Kali Linux

VirtualBox共享文件夹设置全面解析和实际操作:https://www.bilibili.com/video/BV1Lt4y1x7M4

VMware虚拟机三种网络模式:VMware虚拟机三种网络模式

VMware入门视频:https://www.bilibili.com/video/BV1bU411U7rp/

linux C socket–raw socket:https://www.bilibili.com/video/BV1b94y1W75N

黑马SSH链接虚拟机教学:https://www.bilibili.com/video/BV15N411T7nT/

之前的二手机械革命蛟龙7(1800购入)用了7个月成功报废…无奈只得含泪换了天选6pro ultra7 + 5060版本。因为是新机并恰巧赶上要在Linux环境下用row socket做计网的课程设计,所以就又开始折腾起了虚拟机…(痛苦的回忆开始攻击我了…)

因为之前的Virtual Box实在莫名其妙的Bug太多,故我吸取教训直接下了VMware Workstation Pro。但是VMware也不是什么好鸟,首先在官网下载需要注册账号、注册要填一堆东西、填完下软件还得填一堆、主要是折腾完还不立马给你下验证个账号pending了整整俩天还没结束…我忍不了——上Github!

我先下的Kali的VMware & VirtualBox pre-built版本。下好了一顿折腾结果不仅连客机增强功能都没debug完、网也连不上…于是又换Ubuntu_24.04.3一顿折腾还是一个鬼样子(我的半下午+一晚上啊啊啊啊啊啊啊)。得,还是换VirtualBox吧。VirtualBox比VMware不稳定很多,经常在启动Ubuntu时卡住。但好在它的NAT模式不用自己设置,安好了系统直接就能联网、甚至在主机软路由时可以科学上网。但是还是之前那个问题:扩展功能不太行…又折腾了一个下午除了拖拽文件的问题还是没解决,其它的问题都边查资料边解决了。

以下为具体步骤:

安装 Guest Additions:

适用版本: Ubuntu 18.04 / 20.04 / 22.04 / 24.04 都可以
功能: 全屏、自适应分辨率、共享剪贴板、拖拽文件、共享文件夹等

在 Ubuntu 终端输入:

sudo apt update
sudo apt upgrade -y
sudo apt install build-essential dkms linux-headers-$(uname -r) -y

Guest Additions 需要编译内核模块,因此必须装这些依赖(这一步是最常见的坑)。

在虚拟机窗口的菜单中:

设备(Devices)
→ Insert Guest Additions CD Image...

或者中文版:

设备
→ 安装增强功能...

📌 如果提示下载 ISO,点“下载”即可。

你会看到桌面出现一个类似 VBox_GAs_7.x.x 的 CD 图标。

安装完后运行 Guest Additions 安装脚本:

方式 A(最简单)

在 CD 图标上右键 → Run Software运行软件


方式 B(终端运行脚本)

打开终端,执行:

cd /media/$USER/VBox_GAs_*/ 
sudo ./VBoxLinuxAdditions.run

运行几分钟后若显示:

Installing the Window System drivers ...
Installing modules ...

然后没有报红色大错误 → 就成功。


重启系统:

sudo reboot

五、验证是否安装成功

1.分辨率是否能自动拉伸?

拖动虚拟机窗口 → 分辨率是否自动变化?

2.查看内核模块是否已加载:

lsmod | grep vboxguest

如果有类似:

vboxguest   xxxx   ...

就是成功。

常见错误与解决

❌ 1. 运行脚本时报错:

Building kernel modules ...failed

原因:没装 build-essential / headers
解决:回到第一步重新安装依赖


❌ 2. 没看到 VBox_GAs 镜像

按:

设备 → Insert Guest Additions CD Image...

若仍没有,说明 ISO 下载失败 → 重新下载。


❌ 3. Wayland 桌面导致拖拽失效(Ubuntu 22.04+ 常见)

改回 Xorg:

登录界面左下角选择:

Ubuntu on Xorg

我之前怎么弄都不能自动随窗口变化调整分辨率大小就是没用Xorg版的Ubuntu

Ubuntu 中的 WaylandXorg 是两套 图形显示系统(Display Server),负责处理键鼠输入、窗口显示、绘图等。

它们的关系可以理解为:

Xorg = 老、但兼容性最好

Wayland = 新、更安全、更流畅,但兼容性不够

可以自动调整分辨率后在VirtualBox的相关设置中开启双向共享文件夹、双向剪贴板共享后双向剪贴板共享应该可以直接用了,而双向共享文件夹需要再配置一下。具体的内容看视频,这里把用到的命令和注意点总结一下:

命令:

sudo su
cd ./mnt
mkdir ./Share_P
mount -t vboxsf -o uid=1000,gid=1000 Share_P /mnt/Share_P/ #挂载共享文件夹
#mount:挂载; -t:指定挂载的文件类型; vboxsf:VirtualBox特定的共享文件类型; -o:option的意思; uid:user id(默认当前用户的uid为1000); gid:group id(默认当前用户的gid为1000)uid和gid这俩个参数为了保证不同Ubuntu版本的兼容性最好加上;Share_P:host物理主机中创建的Share_P文件夹; /mnt/Share_P/:虚拟机中Share_P文件夹标准的全路径
umount /mnt/Share_P #卸载共享文件夹

#没下vim的先下vim
sudo vim /etc/fstab # 修改fstab文件以实现启动虚拟机时的自动挂载,在VirtualBox设置开启共享文件功能的GUI界面中不要勾选自动挂载,因为那个很不稳定,还是推荐以修改该文件的方式实现自动挂载

Share_P(手动注释:这是host机中共享文件夹的名字,这个例子中host机中的共享文件夹和虚拟机中的共享文件夹的名字一样,注意不要搞混): /mnt/Share_P vboxsf uid=1000,gid=1000,auto 0 0

视频中打开fstab文件并修改后的例子:

image-20251120233517594

至此共享文件夹便已大功告成。

注意:1.临时共享文件夹在虚拟机关闭或重启后会消失;2.固定(permanent)共享文件不会消失;3.要用哪个文件夹就挂载哪个文件夹

2025.11.21更新:

今天在VMware中安装了Ubuntu并配置了VScode和row socket开发环境。

bash中输入以安装VMtools:

sudo apt update
sudo apt install open-vm-tools open-vm-tools-desktop -y

安装完成后在虚拟机中设置开启拖放和复制黏贴后便可正常使用,但是和VirtualBox相比拖放只能从主机到虚拟机中反过来却不行(但VMware各方面的稳定性真是比VirtualBox强太多了)。

image-20251121202602426

接着开启共享文件夹,和在VirtualBox中一样开启后需要挂载:

sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=$(id -u),gid=$(id -g)
#需要先到/mnt目录下创建hgfs文件夹
ls /mnt/hgfs
#应该可以看到宿主机共享的目录。

若要开机自动挂载,同样要在/etc/fstab,添加一行:.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,uid=1000,gid=1000 0 0

然后执行:

sudo systemctl daemon-reload
sudo mount -a

注意:uid=1000,gid=1000 替换为你当前用户的 UID 和 GID(id 命令可以查看)。 现代 VMware + Ubuntu 22.04+ 时,有时 fstab 挂载会报 hint,这是正常的,只要 vmhgfs-fuse 命令能挂载即可。

太棒了!很高兴看到 (zato_env) 终于出现了!🎉

这次你遇到的问题非常经典,涉及到 Scoop(包管理器)Anaconda(虚拟环境工具)PowerShell(终端 Shell) 三者之间的“爱恨情仇”。

为了让你下次遇到类似情况能从容应对,我为你整理了一份技术总结。你可以把它保存在你的笔记里(比如 Obsidian 或 Notion)。


📝 问题排查总结:Scoop 安装 Anaconda 导致无法激活环境

1. 问题描述 (Symptom)

在 Windows 的 PowerShell (VS Code) 中,尝试使用 conda activate <env_name> 激活虚拟环境时失败。

  • 现象 A:运行 conda init powershell 显示配置已修改,但重启终端后依然无效。
  • 现象 B:报错信息包含 usage: conda-script.py ...Invoke-Expression: Cannot bind argument to parameter 'Command' because it is an empty string.
  • 现象 Cconda 命令本身可以用(比如 conda list),但涉及环境切换的 activate 命令失效。

2. 原因解释 (Root Cause)

这是典型的 “环境变量优先级冲突” (Path Precedence Conflict) 问题。

  1. Scoop 的垫片机制 (Shims)

    Scoop 为了让你在任何地方都能用软件,会在系统 PATH 环境变量中放入“垫片文件”(Shims)。对于 Anaconda,它放了一个 conda.ps1conda.exe 的快捷方式。

  2. Conda 的激活机制

    标准的 conda activate 需要修改当前 Shell 会话的环境变量(比如改变 PATH 指向虚拟环境的 Python)。这需要加载 Conda 自带的 Shell 函数(Function),而不是简单的运行一个 exe。

  3. 冲突点

    当你输入 conda 时,PowerShell 优先 找到了 Scoop 的垫片(因为 Scoop 把它的路径加在了最前面)。这个垫片只是简单地转发命令,它没有权限也没有能力去修改父进程(PowerShell)的环境变量

    因此,Conda 试图执行激活操作时,被 Scoop 的垫片拦截并转发成了一个错误的脚本调用(conda-script.py),导致报错。

3. 解决方案 (Solutions)

针对这种情况,按推荐程度排序:

方案 A:暴力直连法(最稳妥,本次成功方案)

直接绕过 PowerShell 的函数机制,调用 Windows CMD 层的底层激活脚本。

  • 命令

    cmd /k "C:\Users\你的用户名\scoop\apps\anaconda3\current\App\Scripts\activate.bat <环境名>"
    cmd /k "C:\Users\jh\scoop\apps\anaconda3\current\App\Scripts\activate.bat zato_env"

    (注意:路径中的 App 目录是 Scoop 安装版的特有结构)

  • 原理cmd /k 表示启动一个 CMD 子进程并保留窗口,直接运行批处理文件完成激活。

方案 B:不激活,直接调用(最硬核)

不切换环境,直接指定绝对路径来运行程序。

  • 查找路径conda env list 找到环境路径(如 C:\...\envs\zato_env)。

  • 命令

    # 安装库
    C:\...\envs\zato_env\python.exe -m pip install xxx
    # 运行代码
    C:\...\envs\zato_env\python.exe my_script.py
  • 原理:直接使用目标环境的二进制文件,完全规避了环境变量配置问题。

方案 C:修正 PowerShell Profile(一劳永逸但易出错)

强制 PowerShell 加载 Conda 的钩子,覆盖 Scoop 的垫片。

  • 操作:在 PowerShell 配置文件 ($PROFILE) 的末尾添加:

    # 路径可能因版本而异,需自行核对
    & "C:\Users\jh\scoop\apps\anaconda3\current\App\shell\condabin\conda-hook.ps1"
  • 原理:在终端启动时强制注册 Conda 的 Shell 函数,使其优先级高于 Scoop 的垫片。


💡 学弟/学妹的经验卡

以后如果在 Windows 上用 Scoop 管理开发环境,遇到类似 “命令能用,但涉及环境切换/状态改变的命令失效” 的情况,通常都是 Scoop 的 Shim 拦截了 Shell 原生函数 导致的。

解决思路永远是: 既然快捷方式(Shim)不好用,那就找到它原本的安装位置,直接运行本体!