[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fh_sD9SZcDwOgfivAfMqZNhEWpxpeJYVfNOKg6lWP3og":3,"$fJU-4tot_gC5fDkujNeoE-cGsdMy5V_KcdUXLuAnTFgw":16,"$fKXDJ7WE2XLdY3H7OowUQTy6y9wE-cMpOjOM0yLXkh44":423},{"slug":4,"title":5,"description":6,"content":7,"content_html":8,"pub_date":9,"tags":10,"draft":15},"vmware-tools-install","在 VMware 虚拟机中安装 open-vm-tools 完整指南","详解 VMware Tools 的作用、open-vm-tools 与官方 VMware Tools 的区别，以及在 Ubuntu 虚拟机中安装并生效的完整步骤和常见问题排查。","# 在 VMware 虚拟机中安装 open-vm-tools 完整指南\n\nVMware Tools 是 VMware 虚拟机的增强工具包，安装后可以获得更好的显示分辨率、剪贴板共享、文件拖拽、时间同步等功能。本文介绍在 Linux 虚拟机中安装 `open-vm-tools` 的完整流程，以及常见问题的排查方法。\n\n---\n\n## 背景：VMware Tools 与 open-vm-tools\n\nVMware Tools 有两个版本：\n\n| 版本 | 来源 | 推荐场景 |\n|------|------|---------| \n| VMware Tools（官方） | 随 VMware Workstation 附带的 ISO | 旧版 VMware，需要手动安装 |\n| open-vm-tools | 开源版本，各发行版官方仓库收录 | **现代 Linux 发行版，推荐使用** |\n\n### 为什么推荐 open-vm-tools 而不是官方 VMware Tools？\n\n1. **无需手动安装**：各大 Linux 发行版的官方仓库都收录了 `open-vm-tools`，一条命令即可安装，不需要挂载 ISO、解压、运行安装脚本。\n\n2. **内核升级不会失效**：官方 VMware Tools 包含内核模块，每次升级内核后都需要重新编译。`open-vm-tools` 使用发行版统一维护的内核模块，随内核自动更新，不需要额外操作。\n\n3. **更好的系统集成**：作为发行版的一部分，`open-vm-tools` 与 systemd、udev 等系统组件集成更好，启动更可靠。\n\n4. **VMware 官方推荐**：VMware 自 2015 年起官方建议在现代 Linux 发行版中使用 `open-vm-tools`，官方 VMware Tools 主要是为无法使用 `open-vm-tools` 的旧系统提供的备选方案。\n\n5. **社区维护活跃**：`open-vm-tools` 在 GitHub 开源，有活跃的社区，安全漏洞修复更及时。\n\n---\n\n## 安装前提条件\n\n1. **VMware Workstation \u002F Fusion \u002F ESXi**：任意版本均可\n2. **Linux 虚拟机**：Ubuntu、Debian、CentOS、Fedora 等主流发行版\n3. **网络连接**：虚拟机需要能访问软件仓库\n\n---\n\n## Ubuntu \u002F Debian 系安装\n\n### 基础安装\n\n```bash\nsudo apt update\nsudo apt install open-vm-tools -y\n```\n\n### 带图形界面的安装（Desktop 版）\n\n如果虚拟机有桌面环境（GNOME、KDE 等），需要额外安装桌面集成包：\n\n```bash\nsudo apt install open-vm-tools-desktop -y\n```\n\n这个包提供：\n- 窗口自动调整大小\n- 拖拽文件支持\n- 剪贴板双向同步\n\n### 验证安装\n\n```bash\n# 检查服务状态\nsystemctl status open-vm-tools\n\n# 或者用旧命令\nservice open-vm-tools status\n\n# 检查工具版本\nvmware-toolsd --version\n```\n\n正常输出类似：\n```\n● open-vm-tools.service - Service for virtual machines hosted on VMware\n   Loaded: loaded (\u002Flib\u002Fsystemd\u002Fsystem\u002Fopen-vm-tools.service; enabled)\n   Active: active (running) since ...\n```\n\n---\n\n## CentOS \u002F RHEL \u002F Fedora 系安装\n\n### CentOS 7 \u002F RHEL 7\n\n```bash\nsudo yum install open-vm-tools -y\n\n# 带桌面\nsudo yum install open-vm-tools-desktop -y\n\n# 启动并设置开机自启\nsudo systemctl enable open-vm-tools\nsudo systemctl start open-vm-tools\n```\n\n### CentOS 8 \u002F RHEL 8 \u002F Fedora\n\n```bash\nsudo dnf install open-vm-tools -y\n\n# 带桌面\nsudo dnf install open-vm-tools-desktop -y\n\nsudo systemctl enable --now open-vm-tools\n```\n\n---\n\n## Arch Linux \u002F Manjaro 安装\n\n```bash\n# 安装基础包\nsudo pacman -S open-vm-tools\n\n# 带桌面功能\nsudo pacman -S open-vm-tools gtkmm3\n\n# 启用服务\nsudo systemctl enable --now vmtoolsd\nsudo systemctl enable --now vmware-vmblock-fuse\n```\n\nArch 还需要加载内核模块：\n\n```bash\n# 立即加载\nsudo modprobe -a vmw_balloon vmw_pvscsi vmxnet3 vmw_vmci vmwgfx\n\n# 设置开机加载（编辑 \u002Fetc\u002Fmodules-load.d\u002Fvmware.conf）\ncat \u003C\u003CEOF | sudo tee \u002Fetc\u002Fmodules-load.d\u002Fvmware.conf\nvmw_balloon\nvmw_pvscsi\nvmxnet3\nvmw_vmci\nvmwgfx\nEOF\n```\n\n---\n\n## 手动安装方式（无网络环境）\n\n如果虚拟机没有网络连接，可以通过 VMware 提供的 ISO 手动安装。\n\n### 步骤一：挂载 VMware Tools ISO\n\n在 VMware Workstation 菜单中：\n**虚拟机 → 安装 VMware Tools**\n\n这会将 VMware Tools 的 ISO 挂载到虚拟机的光驱。\n\n### 步骤二：挂载并解压\n\n```bash\n# 创建挂载点\nsudo mkdir \u002Fmnt\u002Fcdrom\n\n# 挂载光驱（通常是 \u002Fdev\u002Fcdrom 或 \u002Fdev\u002Fsr0）\nsudo mount \u002Fdev\u002Fcdrom \u002Fmnt\u002Fcdrom\n\n# 复制安装包\ncp \u002Fmnt\u002Fcdrom\u002FVMwareTools-*.tar.gz \u002Ftmp\u002F\ncd \u002Ftmp\n\n# 解压\ntar -xzf VMwareTools-*.tar.gz\n```\n\n### 步骤三：运行安装脚本\n\n```bash\ncd \u002Ftmp\u002Fvmware-tools-distrib\nsudo .\u002Fvmware-install.pl\n```\n\n安装脚本会提示一系列问题，通常一路回车使用默认值即可。\n\n### 步骤四：处理内核头文件依赖\n\n如果提示找不到内核头文件：\n\n```bash\n# Ubuntu\u002FDebian\nsudo apt install linux-headers-$(uname -r) build-essential -y\n\n# CentOS\u002FRHEL\nsudo yum install kernel-devel-$(uname -r) gcc make -y\n```\n\n然后重新运行安装脚本。\n\n---\n\n## 安装后验证\n\n### 基础验证\n\n```bash\n# 检查 open-vm-tools 是否在运行\nsystemctl is-active open-vm-tools\n\n# 查看详细状态\nsystemctl status open-vm-tools -l\n\n# 检查进程\nps aux | grep vmtoolsd\n```\n\n### 检查内核模块\n\n```bash\n# vmhgfs：共享文件夹支持\nlsmod | grep vmhgfs\n\n# vmmemctl：内存气球驱动（VMware 动态内存管理）\nlsmod | grep vmmemctl\n\n# vmw_balloon：较新内核的内存气球驱动\nlsmod | grep vmw_balloon\n\n# vmxnet3：VMware 高性能网络驱动\nlsmod | grep vmxnet3\n```\n\n### 验证版本信息\n\n```bash\n# 查看 open-vm-tools 版本\nvmware-toolsd --version\n\n# 或通过包管理器查看\ndpkg -l open-vm-tools    # Debian\u002FUbuntu\nrpm -qi open-vm-tools    # CentOS\u002FRHEL\n```\n\n---\n\n## 共享文件夹配置（vmhgfs-fuse）\n\n共享文件夹是 VMware 中最实用的功能之一，可以在宿主机和虚拟机之间直接共享目录。\n\n### 在 VMware 中设置共享文件夹\n\n1. 关闭虚拟机（或在运行中添加，但建议关机操作）\n2. **虚拟机 → 设置 → 选项 → 共享文件夹**\n3. 选择\"始终启用\"\n4. 点击\"添加\"，选择宿主机上要共享的目录\n5. 给共享目录起一个名字（如 `shared`）\n\n### 在虚拟机中挂载共享文件夹\n\n```bash\n# 查看可用的共享文件夹列表\nvmware-hgfsclient\n\n# 创建挂载点\nsudo mkdir -p \u002Fmnt\u002Fhgfs\n\n# 手动挂载（一次性）\nsudo vmhgfs-fuse .host:\u002F \u002Fmnt\u002Fhgfs -o allow_other -o uid=$(id -u) -o gid=$(id -g)\n\n# 挂载特定共享目录\nsudo vmhgfs-fuse .host:\u002Fshared \u002Fmnt\u002Fshared -o allow_other\n```\n\n### 设置开机自动挂载\n\n编辑 `\u002Fetc\u002Ffstab`，添加：\n\n```\n.host:\u002F   \u002Fmnt\u002Fhgfs   fuse.vmhgfs-fuse   defaults,allow_other,uid=1000,gid=1000   0   0\n```\n\n将 `uid=1000,gid=1000` 替换为你的实际用户 ID（用 `id` 命令查看）。\n\n验证 fstab 配置：\n\n```bash\n# 测试挂载（不重启）\nsudo mount -a\n\n# 检查是否挂载成功\nls \u002Fmnt\u002Fhgfs\u002F\n```\n\n---\n\n## 剪贴板共享与分辨率自动调整\n\n### 剪贴板双向同步\n\n剪贴板共享需要 `open-vm-tools-desktop` 包和 `vmware-user-suid-wrapper` 进程。\n\n```bash\n# 检查 vmware-user 是否在运行\nps aux | grep vmware-user\n\n# 如果没有运行，手动启动\n\u002Fusr\u002Fbin\u002Fvmware-user-suid-wrapper &\n\n# 或者\nvmware-user &\n```\n\n对于 GNOME 桌面，可能还需要：\n\n```bash\n# 重启 open-vm-tools 桌面服务\nsystemctl --user restart vmware-user\n```\n\n### 自动调整分辨率\n\n当你调整 VMware 窗口大小时，虚拟机的分辨率应该自动跟随。如果没有自动调整：\n\n```bash\n# 检查 vmware-resolutionSet 工具\nwhich vmware-resolutionSet\n\n# 手动触发分辨率更新（通常不需要）\nvmware-resolutionSet 1920 1080\n```\n\n确认 `vmware-vmblock-fuse` 服务也在运行（负责文件拖拽功能）：\n\n```bash\nsystemctl status vmware-vmblock-fuse\n```\n\n---\n\n## 常见问题排查\n\n### 问题 1：安装后分辨率仍然很低（如 800x600）\n\n**原因**：`open-vm-tools-desktop` 没有安装，或者 `vmware-user` 进程没有运行。\n\n```bash\n# 安装桌面包\nsudo apt install open-vm-tools-desktop -y\n\n# 重启虚拟机\nsudo reboot\n```\n\n如果重启后仍然不对：\n\n```bash\n# 检查 Xrandr 输出\nxrandr\n\n# 强制添加分辨率\nxrandr --newmode \"1920x1080_60.00\" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync\nxrandr --addmode Virtual1 \"1920x1080_60.00\"\nxrandr --output Virtual1 --mode \"1920x1080_60.00\"\n```\n\n### 问题 2：拖拽文件和剪贴板不工作\n\n这个问题通常在升级 VMware Workstation 后出现。\n\n```bash\n# 重启 open-vm-tools 服务\nsudo systemctl restart open-vm-tools\n\n# 如果是桌面版，还需要\npkill vmware-user\nvmware-user &\n```\n\n### 问题 3：共享目录不显示（\u002Fmnt\u002Fhgfs 为空）\n\n```bash\n# 检查 vmhgfs-fuse 是否可用\nwhich vmhgfs-fuse\n\n# 检查共享文件夹是否在 VMware 中启用\nvmware-hgfsclient\n\n# 手动重新挂载\nsudo umount \u002Fmnt\u002Fhgfs\nsudo vmhgfs-fuse .host:\u002F \u002Fmnt\u002Fhgfs -o allow_other\n```\n\n如果 `vmhgfs-fuse` 命令不存在：\n\n```bash\n# Ubuntu\u002FDebian\nsudo apt install open-vm-tools fuse -y\n\n# 确保 fuse 内核模块已加载\nsudo modprobe fuse\n```\n\n### 问题 4：黑屏或启动后无图形界面\n\n这通常是显卡驱动冲突。在 GRUB 启动参数中添加：\n\n```\nnomodeset\n```\n\n然后安装 VMware SVGA 驱动：\n\n```bash\nsudo apt install xserver-xorg-video-vmware -y\n```\n\n### 问题 5：Ubuntu 22.04+ 服务名变了\n\n在较新的 Ubuntu 版本中，服务名可能是 `open-vm-tools` 或 `vmtoolsd`：\n\n```bash\nsystemctl status vmtoolsd\n# 或\nsystemctl status open-vm-tools\n```\n\n---\n\n## VMware Workstation vs Fusion vs ESXi 的差异\n\n### VMware Workstation（Windows\u002FLinux 宿主机）\n\n- 个人桌面虚拟化产品\n- `open-vm-tools` 安装后自动启用共享文件夹、剪贴板、拖拽等功能\n- 支持 3D 加速（需要安装 `open-vm-tools-desktop`）\n\n### VMware Fusion（macOS 宿主机）\n\n- Mac 上的 VMware 产品，功能与 Workstation 相近\n- 同样推荐使用 `open-vm-tools`\n- 共享文件夹挂载方式相同（`vmhgfs-fuse`）\n- 有些版本的 Fusion 上剪贴板共享需要额外配置\n\n### VMware ESXi（企业级虚拟化）\n\n在 ESXi 上，`open-vm-tools` 不仅提供桌面功能，还承担重要的企业级职责：\n\n```bash\n# ESXi 环境下的额外功能：\n\n# 1. 向 vCenter 汇报 VM 状态（IP、操作系统信息）\nvmware-toolsd --cmd \"info-get guestinfo.ip\"\n\n# 2. 文件系统 quiescing（执行快照时暂停写入，保证一致性）\n#    这对数据库类 VM 尤其重要\n\n# 3. 优雅关机\u002F重启（vCenter 发出关机命令时，VM 能正确响应）\n\n# 4. 内存气球（vmmemctl），帮助 ESXi 回收 VM 内存\nlsmod | grep vmmemctl\n```\n\n**ESXi 生产环境强烈建议安装 open-vm-tools**，否则快照可能不一致，vCenter 也无法获取 VM 的 IP 地址等信息。\n\n---\n\n## 不同场景推荐方案\n\n| 场景 | 推荐方案 |\n|------|---------| \n| Ubuntu 20.04+ Desktop | `apt install open-vm-tools-desktop` |\n| Ubuntu Server | `apt install open-vm-tools` |\n| CentOS 7 | `yum install open-vm-tools` |\n| CentOS 8+ \u002F Fedora | `dnf install open-vm-tools` |\n| Arch Linux | `pacman -S open-vm-tools` |\n| 无网络环境 | 手动挂载 ISO 安装 |\n| ESXi 生产环境 | `open-vm-tools`（各发行版仓库版本） |\n\n---\n\n## 卸载 VMware Tools\n\n如果需要从手动安装的 VMware Tools 切换到 open-vm-tools：\n\n```bash\n# 卸载手动安装的版本\nsudo vmware-uninstall-tools.pl\n\n# 然后安装 open-vm-tools\nsudo apt install open-vm-tools open-vm-tools-desktop -y\n```\n\n---\n\n## 总结\n\n`open-vm-tools` 是现代 Linux 虚拟机的首选方案，一条命令即可安装：\n\n```bash\n# 服务器\nsudo apt install open-vm-tools -y\n\n# 桌面\nsudo apt install open-vm-tools open-vm-tools-desktop -y\n```\n\n安装后重启虚拟机，即可享受自动分辨率调整、双向剪贴板、文件拖拽等功能。如果遇到问题，优先检查服务是否在运行，以及是否安装了对应桌面包。\n","\u003Ch1>在 VMware 虚拟机中安装 open-vm-tools 完整指南\u003C\u002Fh1>\n\u003Cp>VMware Tools 是 VMware 虚拟机的增强工具包，安装后可以获得更好的显示分辨率、剪贴板共享、文件拖拽、时间同步等功能。本文介绍在 Linux 虚拟机中安装 \u003Ccode>open-vm-tools\u003C\u002Fcode> 的完整流程，以及常见问题的排查方法。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"背景-vmware-tools-与-open-vm-tools\">背景：VMware Tools 与 open-vm-tools\u003C\u002Fh2>\n\u003Cp>VMware Tools 有两个版本：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>版本\u003C\u002Fth>\n\u003Cth>来源\u003C\u002Fth>\n\u003Cth>推荐场景\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>VMware Tools（官方）\u003C\u002Ftd>\n\u003Ctd>随 VMware Workstation 附带的 ISO\u003C\u002Ftd>\n\u003Ctd>旧版 VMware，需要手动安装\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>open-vm-tools\u003C\u002Ftd>\n\u003Ctd>开源版本，各发行版官方仓库收录\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>现代 Linux 发行版，推荐使用\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"为什么推荐-open-vm-tools-而不是官方-vmware-tools\">为什么推荐 open-vm-tools 而不是官方 VMware Tools？\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>无需手动安装\u003C\u002Fstrong>：各大 Linux 发行版的官方仓库都收录了 \u003Ccode>open-vm-tools\u003C\u002Fcode>，一条命令即可安装，不需要挂载 ISO、解压、运行安装脚本。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>内核升级不会失效\u003C\u002Fstrong>：官方 VMware Tools 包含内核模块，每次升级内核后都需要重新编译。\u003Ccode>open-vm-tools\u003C\u002Fcode> 使用发行版统一维护的内核模块，随内核自动更新，不需要额外操作。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>更好的系统集成\u003C\u002Fstrong>：作为发行版的一部分，\u003Ccode>open-vm-tools\u003C\u002Fcode> 与 systemd、udev 等系统组件集成更好，启动更可靠。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>VMware 官方推荐\u003C\u002Fstrong>：VMware 自 2015 年起官方建议在现代 Linux 发行版中使用 \u003Ccode>open-vm-tools\u003C\u002Fcode>，官方 VMware Tools 主要是为无法使用 \u003Ccode>open-vm-tools\u003C\u002Fcode> 的旧系统提供的备选方案。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>社区维护活跃\u003C\u002Fstrong>：\u003Ccode>open-vm-tools\u003C\u002Fcode> 在 GitHub 开源，有活跃的社区，安全漏洞修复更及时。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ch2 id=\"安装前提条件\">安装前提条件\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cstrong>VMware Workstation \u002F Fusion \u002F ESXi\u003C\u002Fstrong>：任意版本均可\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Linux 虚拟机\u003C\u002Fstrong>：Ubuntu、Debian、CentOS、Fedora 等主流发行版\u003C\u002Fli>\n\u003Cli>\u003Cstrong>网络连接\u003C\u002Fstrong>：虚拟机需要能访问软件仓库\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ch2 id=\"ubuntu-debian-系安装\">Ubuntu \u002F Debian 系安装\u003C\u002Fh2>\n\u003Ch3 id=\"基础安装\">基础安装\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo apt update\nsudo apt install open-vm-tools -y\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"带图形界面的安装-desktop-版\">带图形界面的安装（Desktop 版）\u003C\u002Fh3>\n\u003Cp>如果虚拟机有桌面环境（GNOME、KDE 等），需要额外安装桌面集成包：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo apt install open-vm-tools-desktop -y\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>这个包提供：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>窗口自动调整大小\u003C\u002Fli>\n\u003Cli>拖拽文件支持\u003C\u002Fli>\n\u003Cli>剪贴板双向同步\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"验证安装\">验证安装\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 检查服务状态\nsystemctl status open-vm-tools\n\n# 或者用旧命令\nservice open-vm-tools status\n\n# 检查工具版本\nvmware-toolsd --version\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>正常输出类似：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>● open-vm-tools.service - Service for virtual machines hosted on VMware\n   Loaded: loaded (\u002Flib\u002Fsystemd\u002Fsystem\u002Fopen-vm-tools.service; enabled)\n   Active: active (running) since ...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"centos-rhel-fedora-系安装\">CentOS \u002F RHEL \u002F Fedora 系安装\u003C\u002Fh2>\n\u003Ch3 id=\"centos-7-rhel-7\">CentOS 7 \u002F RHEL 7\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo yum install open-vm-tools -y\n\n# 带桌面\nsudo yum install open-vm-tools-desktop -y\n\n# 启动并设置开机自启\nsudo systemctl enable open-vm-tools\nsudo systemctl start open-vm-tools\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"centos-8-rhel-8-fedora\">CentOS 8 \u002F RHEL 8 \u002F Fedora\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo dnf install open-vm-tools -y\n\n# 带桌面\nsudo dnf install open-vm-tools-desktop -y\n\nsudo systemctl enable --now open-vm-tools\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"arch-linux-manjaro-安装\">Arch Linux \u002F Manjaro 安装\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 安装基础包\nsudo pacman -S open-vm-tools\n\n# 带桌面功能\nsudo pacman -S open-vm-tools gtkmm3\n\n# 启用服务\nsudo systemctl enable --now vmtoolsd\nsudo systemctl enable --now vmware-vmblock-fuse\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Arch 还需要加载内核模块：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 立即加载\nsudo modprobe -a vmw_balloon vmw_pvscsi vmxnet3 vmw_vmci vmwgfx\n\n# 设置开机加载（编辑 \u002Fetc\u002Fmodules-load.d\u002Fvmware.conf）\ncat &lt;&lt;EOF | sudo tee \u002Fetc\u002Fmodules-load.d\u002Fvmware.conf\nvmw_balloon\nvmw_pvscsi\nvmxnet3\nvmw_vmci\nvmwgfx\nEOF\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"手动安装方式-无网络环境\">手动安装方式（无网络环境）\u003C\u002Fh2>\n\u003Cp>如果虚拟机没有网络连接，可以通过 VMware 提供的 ISO 手动安装。\u003C\u002Fp>\n\u003Ch3 id=\"步骤一-挂载-vmware-tools-iso\">步骤一：挂载 VMware Tools ISO\u003C\u002Fh3>\n\u003Cp>在 VMware Workstation 菜单中：\n\u003Cstrong>虚拟机 → 安装 VMware Tools\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>这会将 VMware Tools 的 ISO 挂载到虚拟机的光驱。\u003C\u002Fp>\n\u003Ch3 id=\"步骤二-挂载并解压\">步骤二：挂载并解压\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 创建挂载点\nsudo mkdir \u002Fmnt\u002Fcdrom\n\n# 挂载光驱（通常是 \u002Fdev\u002Fcdrom 或 \u002Fdev\u002Fsr0）\nsudo mount \u002Fdev\u002Fcdrom \u002Fmnt\u002Fcdrom\n\n# 复制安装包\ncp \u002Fmnt\u002Fcdrom\u002FVMwareTools-*.tar.gz \u002Ftmp\u002F\ncd \u002Ftmp\n\n# 解压\ntar -xzf VMwareTools-*.tar.gz\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"步骤三-运行安装脚本\">步骤三：运行安装脚本\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">cd \u002Ftmp\u002Fvmware-tools-distrib\nsudo .\u002Fvmware-install.pl\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>安装脚本会提示一系列问题，通常一路回车使用默认值即可。\u003C\u002Fp>\n\u003Ch3 id=\"步骤四-处理内核头文件依赖\">步骤四：处理内核头文件依赖\u003C\u002Fh3>\n\u003Cp>如果提示找不到内核头文件：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># Ubuntu\u002FDebian\nsudo apt install linux-headers-$(uname -r) build-essential -y\n\n# CentOS\u002FRHEL\nsudo yum install kernel-devel-$(uname -r) gcc make -y\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>然后重新运行安装脚本。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"安装后验证\">安装后验证\u003C\u002Fh2>\n\u003Ch3 id=\"基础验证\">基础验证\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 检查 open-vm-tools 是否在运行\nsystemctl is-active open-vm-tools\n\n# 查看详细状态\nsystemctl status open-vm-tools -l\n\n# 检查进程\nps aux | grep vmtoolsd\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"检查内核模块\">检查内核模块\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># vmhgfs：共享文件夹支持\nlsmod | grep vmhgfs\n\n# vmmemctl：内存气球驱动（VMware 动态内存管理）\nlsmod | grep vmmemctl\n\n# vmw_balloon：较新内核的内存气球驱动\nlsmod | grep vmw_balloon\n\n# vmxnet3：VMware 高性能网络驱动\nlsmod | grep vmxnet3\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"验证版本信息\">验证版本信息\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 查看 open-vm-tools 版本\nvmware-toolsd --version\n\n# 或通过包管理器查看\ndpkg -l open-vm-tools    # Debian\u002FUbuntu\nrpm -qi open-vm-tools    # CentOS\u002FRHEL\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"共享文件夹配置-vmhgfs-fuse\">共享文件夹配置（vmhgfs-fuse）\u003C\u002Fh2>\n\u003Cp>共享文件夹是 VMware 中最实用的功能之一，可以在宿主机和虚拟机之间直接共享目录。\u003C\u002Fp>\n\u003Ch3 id=\"在-vmware-中设置共享文件夹\">在 VMware 中设置共享文件夹\u003C\u002Fh3>\n\u003Col>\n\u003Cli>关闭虚拟机（或在运行中添加，但建议关机操作）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>虚拟机 → 设置 → 选项 → 共享文件夹\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>选择&quot;始终启用&quot;\u003C\u002Fli>\n\u003Cli>点击&quot;添加&quot;，选择宿主机上要共享的目录\u003C\u002Fli>\n\u003Cli>给共享目录起一个名字（如 \u003Ccode>shared\u003C\u002Fcode>）\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"在虚拟机中挂载共享文件夹\">在虚拟机中挂载共享文件夹\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 查看可用的共享文件夹列表\nvmware-hgfsclient\n\n# 创建挂载点\nsudo mkdir -p \u002Fmnt\u002Fhgfs\n\n# 手动挂载（一次性）\nsudo vmhgfs-fuse .host:\u002F \u002Fmnt\u002Fhgfs -o allow_other -o uid=$(id -u) -o gid=$(id -g)\n\n# 挂载特定共享目录\nsudo vmhgfs-fuse .host:\u002Fshared \u002Fmnt\u002Fshared -o allow_other\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"设置开机自动挂载\">设置开机自动挂载\u003C\u002Fh3>\n\u003Cp>编辑 \u003Ccode>\u002Fetc\u002Ffstab\u003C\u002Fcode>，添加：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>.host:\u002F   \u002Fmnt\u002Fhgfs   fuse.vmhgfs-fuse   defaults,allow_other,uid=1000,gid=1000   0   0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>将 \u003Ccode>uid=1000,gid=1000\u003C\u002Fcode> 替换为你的实际用户 ID（用 \u003Ccode>id\u003C\u002Fcode> 命令查看）。\u003C\u002Fp>\n\u003Cp>验证 fstab 配置：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 测试挂载（不重启）\nsudo mount -a\n\n# 检查是否挂载成功\nls \u002Fmnt\u002Fhgfs\u002F\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"剪贴板共享与分辨率自动调整\">剪贴板共享与分辨率自动调整\u003C\u002Fh2>\n\u003Ch3 id=\"剪贴板双向同步\">剪贴板双向同步\u003C\u002Fh3>\n\u003Cp>剪贴板共享需要 \u003Ccode>open-vm-tools-desktop\u003C\u002Fcode> 包和 \u003Ccode>vmware-user-suid-wrapper\u003C\u002Fcode> 进程。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 检查 vmware-user 是否在运行\nps aux | grep vmware-user\n\n# 如果没有运行，手动启动\n\u002Fusr\u002Fbin\u002Fvmware-user-suid-wrapper &amp;\n\n# 或者\nvmware-user &amp;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>对于 GNOME 桌面，可能还需要：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 重启 open-vm-tools 桌面服务\nsystemctl --user restart vmware-user\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"自动调整分辨率\">自动调整分辨率\u003C\u002Fh3>\n\u003Cp>当你调整 VMware 窗口大小时，虚拟机的分辨率应该自动跟随。如果没有自动调整：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 检查 vmware-resolutionSet 工具\nwhich vmware-resolutionSet\n\n# 手动触发分辨率更新（通常不需要）\nvmware-resolutionSet 1920 1080\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>确认 \u003Ccode>vmware-vmblock-fuse\u003C\u002Fcode> 服务也在运行（负责文件拖拽功能）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">systemctl status vmware-vmblock-fuse\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"常见问题排查\">常见问题排查\u003C\u002Fh2>\n\u003Ch3 id=\"问题-1-安装后分辨率仍然很低-如-800x600\">问题 1：安装后分辨率仍然很低（如 800x600）\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>原因\u003C\u002Fstrong>：\u003Ccode>open-vm-tools-desktop\u003C\u002Fcode> 没有安装，或者 \u003Ccode>vmware-user\u003C\u002Fcode> 进程没有运行。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 安装桌面包\nsudo apt install open-vm-tools-desktop -y\n\n# 重启虚拟机\nsudo reboot\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>如果重启后仍然不对：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 检查 Xrandr 输出\nxrandr\n\n# 强制添加分辨率\nxrandr --newmode &quot;1920x1080_60.00&quot; 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync\nxrandr --addmode Virtual1 &quot;1920x1080_60.00&quot;\nxrandr --output Virtual1 --mode &quot;1920x1080_60.00&quot;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"问题-2-拖拽文件和剪贴板不工作\">问题 2：拖拽文件和剪贴板不工作\u003C\u002Fh3>\n\u003Cp>这个问题通常在升级 VMware Workstation 后出现。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 重启 open-vm-tools 服务\nsudo systemctl restart open-vm-tools\n\n# 如果是桌面版，还需要\npkill vmware-user\nvmware-user &amp;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"问题-3-共享目录不显示-mnt-hgfs-为空\">问题 3：共享目录不显示（\u002Fmnt\u002Fhgfs 为空）\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 检查 vmhgfs-fuse 是否可用\nwhich vmhgfs-fuse\n\n# 检查共享文件夹是否在 VMware 中启用\nvmware-hgfsclient\n\n# 手动重新挂载\nsudo umount \u002Fmnt\u002Fhgfs\nsudo vmhgfs-fuse .host:\u002F \u002Fmnt\u002Fhgfs -o allow_other\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>如果 \u003Ccode>vmhgfs-fuse\u003C\u002Fcode> 命令不存在：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># Ubuntu\u002FDebian\nsudo apt install open-vm-tools fuse -y\n\n# 确保 fuse 内核模块已加载\nsudo modprobe fuse\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"问题-4-黑屏或启动后无图形界面\">问题 4：黑屏或启动后无图形界面\u003C\u002Fh3>\n\u003Cp>这通常是显卡驱动冲突。在 GRUB 启动参数中添加：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>nomodeset\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>然后安装 VMware SVGA 驱动：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo apt install xserver-xorg-video-vmware -y\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"问题-5-ubuntu-22-04-服务名变了\">问题 5：Ubuntu 22.04+ 服务名变了\u003C\u002Fh3>\n\u003Cp>在较新的 Ubuntu 版本中，服务名可能是 \u003Ccode>open-vm-tools\u003C\u002Fcode> 或 \u003Ccode>vmtoolsd\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">systemctl status vmtoolsd\n# 或\nsystemctl status open-vm-tools\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"vmware-workstation-vs-fusion-vs-esxi-的差异\">VMware Workstation vs Fusion vs ESXi 的差异\u003C\u002Fh2>\n\u003Ch3 id=\"vmware-workstation-windows-linux-宿主机\">VMware Workstation（Windows\u002FLinux 宿主机）\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>个人桌面虚拟化产品\u003C\u002Fli>\n\u003Cli>\u003Ccode>open-vm-tools\u003C\u002Fcode> 安装后自动启用共享文件夹、剪贴板、拖拽等功能\u003C\u002Fli>\n\u003Cli>支持 3D 加速（需要安装 \u003Ccode>open-vm-tools-desktop\u003C\u002Fcode>）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"vmware-fusion-macos-宿主机\">VMware Fusion（macOS 宿主机）\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Mac 上的 VMware 产品，功能与 Workstation 相近\u003C\u002Fli>\n\u003Cli>同样推荐使用 \u003Ccode>open-vm-tools\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>共享文件夹挂载方式相同（\u003Ccode>vmhgfs-fuse\u003C\u002Fcode>）\u003C\u002Fli>\n\u003Cli>有些版本的 Fusion 上剪贴板共享需要额外配置\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"vmware-esxi-企业级虚拟化\">VMware ESXi（企业级虚拟化）\u003C\u002Fh3>\n\u003Cp>在 ESXi 上，\u003Ccode>open-vm-tools\u003C\u002Fcode> 不仅提供桌面功能，还承担重要的企业级职责：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># ESXi 环境下的额外功能：\n\n# 1. 向 vCenter 汇报 VM 状态（IP、操作系统信息）\nvmware-toolsd --cmd &quot;info-get guestinfo.ip&quot;\n\n# 2. 文件系统 quiescing（执行快照时暂停写入，保证一致性）\n#    这对数据库类 VM 尤其重要\n\n# 3. 优雅关机\u002F重启（vCenter 发出关机命令时，VM 能正确响应）\n\n# 4. 内存气球（vmmemctl），帮助 ESXi 回收 VM 内存\nlsmod | grep vmmemctl\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>ESXi 生产环境强烈建议安装 open-vm-tools\u003C\u002Fstrong>，否则快照可能不一致，vCenter 也无法获取 VM 的 IP 地址等信息。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"不同场景推荐方案\">不同场景推荐方案\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>场景\u003C\u002Fth>\n\u003Cth>推荐方案\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Ubuntu 20.04+ Desktop\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>apt install open-vm-tools-desktop\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Ubuntu Server\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>apt install open-vm-tools\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>CentOS 7\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>yum install open-vm-tools\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>CentOS 8+ \u002F Fedora\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>dnf install open-vm-tools\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Arch Linux\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>pacman -S open-vm-tools\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>无网络环境\u003C\u002Ftd>\n\u003Ctd>手动挂载 ISO 安装\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>ESXi 生产环境\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>open-vm-tools\u003C\u002Fcode>（各发行版仓库版本）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2 id=\"卸载-vmware-tools\">卸载 VMware Tools\u003C\u002Fh2>\n\u003Cp>如果需要从手动安装的 VMware Tools 切换到 open-vm-tools：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 卸载手动安装的版本\nsudo vmware-uninstall-tools.pl\n\n# 然后安装 open-vm-tools\nsudo apt install open-vm-tools open-vm-tools-desktop -y\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"总结\">总结\u003C\u002Fh2>\n\u003Cp>\u003Ccode>open-vm-tools\u003C\u002Fcode> 是现代 Linux 虚拟机的首选方案，一条命令即可安装：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 服务器\nsudo apt install open-vm-tools -y\n\n# 桌面\nsudo apt install open-vm-tools open-vm-tools-desktop -y\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>安装后重启虚拟机，即可享受自动分辨率调整、双向剪贴板、文件拖拽等功能。如果遇到问题，优先检查服务是否在运行，以及是否安装了对应桌面包。\u003C\u002Fp>\n","2023-11-21",[11,12,13,14],"VMware","linux","Ubuntu","虚拟机",false,[17,30,40,52,62,69,76,83,90,97,107,116,126,135,143,151,160,169,178,188,195,205,211,218,224,233,240,247,255,265,274,283,293,303,313,321,324,335,345,354,362,368,376,384,392,400,408,415],{"slug":18,"title":19,"description":20,"pub_date":21,"tags":22,"draft":15,"word_count":29},"ide-skills-guide","Agent Skills 完全指南：21 款第三方 Skill 深度评测与使用心得","全面评测 21 款第三方 Agent Skills，涵盖 Vue 生态、前端设计、构建工具、实用工具四大分类。从安装配置到实际使用场景，带你了解每个 Skill 的功能特点、最佳实践与使用心得。","2026-06-15",[23,24,25,26,27,28],"agent","skills","AI","效率工具","前端","Vue",4169,{"slug":31,"title":32,"description":33,"pub_date":34,"tags":35,"draft":15,"word_count":39},"linux-kernel-skeleton-struct-funcptr-container_of","Linux 内核骨架：struct、函数指针与 container_of","读懂 Linux 内核源码的三件套：巨大的 struct 组合代替继承、函数指针表实现虚派发、container_of 宏从嵌入成员找回完整对象。","2026-05-09",[12,36,37,38],"kernel","C","container_of",1369,{"slug":41,"title":42,"description":43,"pub_date":44,"tags":45,"draft":15,"word_count":51},"astro-complete-guide-2025","Astro 5 深度剖析：Islands 架构原理、构建优化与 Cloudflare Workers 边缘部署","从编译器视角解析 Astro 5 的 Islands 架构实现原理，Content Layer API 的 Vite 插件机制，Server Islands 的流式渲染，以及如何在 Cloudflare Workers + D1 边缘环境下榨干性能。","2026-05-08",[46,47,48,49,50],"astro","frontend","cloudflare","performance","architecture",3663,{"slug":53,"title":54,"description":55,"pub_date":56,"tags":57,"draft":15,"word_count":61},"llm-prompt-engineering","Prompt Engineering 实战：让 LLM 真正听话的技巧","System prompt 怎么写、Few-shot 怎么设计、Chain-of-Thought 原理，以及常见失败模式和调试方法。","2026-05-03",[58,59,60],"ai","llm","工程实践",1723,{"slug":63,"title":64,"description":65,"pub_date":56,"tags":66,"draft":15,"word_count":68},"rag-system-design","RAG 系统设计：从 naive 到 production-ready","Retrieval-Augmented Generation 不只是「向量数据库 + LLM」，分块策略、召回质量、重排序、缓存才是工程核心。",[58,67,59,60],"rag",1613,{"slug":70,"title":71,"description":72,"pub_date":56,"tags":73,"draft":15,"word_count":75},"git-advanced-workflow","Git 进阶工作流：rebase、cherry-pick、bisect 的正确使用","merge 会了，但 rebase 总搞错？bisect 找 bug 提交？interactive rebase 整理历史？这篇一次说清楚。",[74,60],"git",1396,{"slug":77,"title":78,"description":79,"pub_date":56,"tags":80,"draft":15,"word_count":82},"docker-practical-guide","Docker 实战：从会用到用好","会 docker run 不够，Dockerfile 最佳实践、多阶段构建、Compose 编排、镜像瘦身才是日常真正需要的。",[81,12,60],"docker",1268,{"slug":84,"title":85,"description":86,"pub_date":56,"tags":87,"draft":15,"word_count":89},"anthropics-skills-guide","anthropics\u002Fskills：Anthropic 官方 Agent Skills 仓库解析","Anthropic 官方开源的 Agent Skills 标准仓库，127k stars，解析 SKILL.md 规范、17 个示例 skill 的设计模式，以及如何在 Claude Code \u002F Claude.ai \u002F API 中使用",[58,88,23,24],"Claude",2090,{"slug":91,"title":92,"description":93,"pub_date":56,"tags":94,"draft":15,"word_count":96},"karpathy-claude-code-guidelines","Karpathy 的 LLM 编码批评与 CLAUDE.md 最佳实践","基于 Andrej Karpathy 对 LLM 编程助手的观察，forrestchang 提炼出一个 CLAUDE.md 文件，4 条原则解决 AI 编码的典型失控问题：乱猜假设、过度设计、乱改代码、目标不清",[58,88,95,60],"Claude Code",2699,{"slug":98,"title":99,"description":100,"pub_date":56,"tags":101,"draft":15,"word_count":106},"typescript-advanced-patterns","TypeScript 高级模式：让类型系统为你工作","基础 TS 会了但类型总是 any？条件类型、映射类型、模板字面量类型、infer 关键字才是 TS 的真正威力。",[102,103,104,105],"typescript","类型系统","前端工程","高级模式",1419,{"slug":108,"title":109,"description":110,"pub_date":56,"tags":111,"draft":15,"word_count":115},"linux-performance-tuning","Linux 性能调优实战：从 top 到 perf 的完整工具链","遇到性能问题不知道从哪下手？这篇建立系统化的排查思路，从 CPU\u002F内存\u002FIO\u002F网络逐层分析。",[12,112,113,114],"性能","运维","系统编程",1524,{"slug":117,"title":118,"description":119,"pub_date":56,"tags":120,"draft":15,"word_count":125},"python-functional-programming","Python 函数式编程：map\u002Ffilter\u002Freduce 之外","Python 不是纯函数式语言，但 functools、itertools、偏函数、闭包这些工具用好了能让代码简洁一个量级。",[121,122,123,124],"python","函数式","闭包","装饰器",1867,{"slug":127,"title":128,"description":129,"pub_date":56,"tags":130,"draft":15,"word_count":134},"python-oop-guide","Python 面向对象：__init__ 之外你需要知道的","Python OOP 不只是 class + __init__，魔术方法、描述符、元类才是真正的武器。",[121,131,132,133],"OOP","面向对象","魔术方法",1792,{"slug":136,"title":137,"description":138,"pub_date":56,"tags":139,"draft":15,"word_count":142},"python-data-structures","Python 内置数据结构深度解析","list、dict、set、tuple 不只是数据容器，搞懂它们的底层实现和时间复杂度，才能写出高性能 Python。",[121,140,112,141],"数据结构","算法",1517,{"slug":144,"title":145,"description":146,"pub_date":56,"tags":147,"draft":15,"word_count":150},"python-basics-quick-start","Python 快速上手：写给有编程基础的人","已经会其他语言，想快速掌握 Python 的语法特性和思维方式，这篇是捷径。",[121,148,149],"入门","基础",1607,{"slug":152,"title":153,"description":154,"pub_date":56,"tags":155,"draft":15,"word_count":159},"python-dataclass-pydantic","Python dataclass vs Pydantic：数据类选型指南","dataclass 是标准库的轻量选择，Pydantic v2 是带验证的重武器，什么时候用哪个，这篇说清楚。",[121,156,157,158],"dataclass","pydantic","数据验证",1323,{"slug":161,"title":162,"description":163,"pub_date":56,"tags":164,"draft":15,"word_count":168},"python-asyncio-practical","Python asyncio 实战：从回调地狱到协程优雅","asyncio 是 Python 异步编程的核心，搞懂 event loop、Task、gather 这些概念才能写出真正高效的异步代码。",[121,165,166,167],"asyncio","并发","网络编程",1258,{"slug":170,"title":171,"description":172,"pub_date":56,"tags":173,"draft":15,"word_count":177},"python-type-hints-guide","Python 类型注解完全指南：从入门到实践","Python 3.5+ 引入类型注解，配合 mypy\u002Fpyright 让 Python 也能享受静态类型检查的好处。",[121,174,175,176],"typescript-style","type-hints","工具链",1102,{"slug":179,"title":180,"description":181,"pub_date":182,"tags":183,"draft":15,"word_count":187},"pwa-install-update-button","PWA 踩坑：为什么安装按钮从来不出现","从 beforeinstallprompt 到 Service Worker waiting，把 PWA 的安装与更新提示真正做对","2026-05-02",[184,185,186],"pwa","javascript","web",1683,{"slug":189,"title":190,"description":191,"pub_date":192,"tags":193,"draft":15,"word_count":194},"openclaw-vs-hermes-agent","OpenClaw vs Hermes Agent：两个本地优先 Agent 的设计差异","OpenClaw（Novita AI）和 Hermes Agent（Nous Research）都是本地运行的个人 AI Agent，但在记忆系统、技能学习、运行环境和模型生态上走了不同的路。深入对比两种架构的核心差异。","2026-05-01",[58,23,59],1679,{"slug":196,"title":197,"description":198,"pub_date":192,"tags":199,"draft":15,"word_count":204},"cpp-random-design-patterns","C++ 设计模式实战：RAII、观察者、工厂","用现代 C++（C++17\u002F20）实现三种高频设计模式：RAII 资源管理、观察者模式事件系统、工厂模式插件架构。每种模式给出问题场景、实现代码和真实工程案例。",[200,201,202,203],"cpp","设计模式","c++17","工程",2613,{"slug":206,"title":207,"description":208,"pub_date":192,"tags":209,"draft":15,"word_count":210},"data-structures-fundamentals","数据结构基础：从数组到红黑树","系统梳理常用数据结构的核心原理、时间复杂度和适用场景。数组、链表、栈、队列、哈希表、二叉树、堆、图，每种结构附实现要点和 C++ 代码片段。",[140,141,200,149],3004,{"slug":212,"title":213,"description":214,"pub_date":215,"tags":216,"draft":15,"word_count":217},"ai-agent-what-is","什么是 AI Agent？从 LLM 到自主执行","LLM 本身是无状态问答机，Agent 是什么让它’动’起来的？本文深入解析 Agent 的四个核心能力、ReAct 框架、工具调用原理，以及主流框架横向对比。","2026-04-30",[58,23,59],2116,{"slug":219,"title":220,"description":221,"pub_date":215,"tags":222,"draft":15,"word_count":223},"ai-agent-memory","AI Agent 的记忆系统：从上下文窗口到长期记忆","深入拆解 AI Agent 的四种记忆类型、上下文窗口压缩策略、RAG 向量检索原理，以及三种典型失败模式和工程选型建议。",[58,23,67],2052,{"slug":225,"title":226,"description":227,"pub_date":215,"tags":228,"draft":15,"word_count":232},"network-proxy-vpn-guide","代理与翻墙技术原理：从 HTTP 代理到现代协议","深入解析代理与 VPN 的本质区别，梳理从 SOCKS5 到 Shadowsocks、V2Ray\u002FXray、Hysteria2 的协议演进，以及机场订阅的技术本质。",[229,230,231],"网络","代理","协议",2148,{"slug":234,"title":235,"description":236,"pub_date":215,"tags":237,"draft":15,"word_count":150},"algorithm-binary-search","二分查找：永远写不对？记住这个模板","彻底搞清楚二分查找的边界问题：闭区间和左闭右开两套模板、三道经典 LeetCode 题目完整 C++ 实现，以及二分答案的进阶思路。",[141,238,239,200],"二分查找","leetcode",{"slug":241,"title":242,"description":243,"pub_date":215,"tags":244,"draft":15,"word_count":246},"algorithm-sliding-window","滑动窗口算法：从暴力到 O(n) 的思维跃迁","系统讲解滑动窗口算法的核心模板、适用题型，配合三道经典 LeetCode 题目的完整 C++ 实现，彻底理解双指针收缩思路。",[141,245,239,200],"滑动窗口",1943,{"slug":248,"title":249,"description":250,"pub_date":215,"tags":251,"draft":15,"word_count":254},"network-clash-config","Clash \u002F Mihomo 配置详解：规则、策略组与分流","深入解析 Clash\u002FMihomo 的核心配置结构，包括代理节点、策略组类型、规则优先级、DNS fake-ip 模式，以及一份实用的完整配置模板。",[229,252,230,253],"clash","配置",1292,{"slug":256,"title":257,"description":258,"pub_date":259,"tags":260,"draft":15,"word_count":264},"hid-hotplug","HID 设备热插拔检测：从 udev 到 node-hid","在 Linux 上用 node-hid + usb 库实现可靠的 USB HID 设备热插拔检测，踩坑记录","2026-04-28",[200,261,12,262,263],"hid","nodejs","electron",2039,{"slug":266,"title":267,"description":268,"pub_date":269,"tags":270,"draft":15,"word_count":273},"electron-ipc-types","Electron IPC 类型安全：从 any 到完全类型化","用 TypeScript 泛型封装 Electron IPC，彻底消灭 any，preload 契约集中管理","2026-04-25",[263,102,271,272],"ipc","vue",1446,{"slug":275,"title":276,"description":277,"pub_date":278,"tags":279,"draft":15,"word_count":282},"element-plus-popover-hide","手动关闭多个 el-popover（不用 v-model:visible）","通过 ref + Reflect.get 调用 hide() 方法手动关闭 Element Plus Popover，解释 Vue3 Proxy 导致无法直接调用实例方法的原因。","2024-10-25",[272,280,281],"element-plus","vue3",1321,{"slug":284,"title":285,"description":286,"pub_date":287,"tags":288,"draft":15,"word_count":292},"vite-vue3-ts-elementplus-pinia","用 Vite+（vp）从零搭建 Vue3 + TypeScript + Element Plus + Pinia + Vue Router","使用 Vite+ 统一工具链（vp）一条命令搭建 Vue3 全家桶，涵盖按需导入、Pinia store、路由配置，以及常见坑的解决方案。","2024-08-27",[272,289,102,280,290,291],"vite","pinia","vite-plus",1960,{"slug":294,"title":295,"description":296,"pub_date":297,"tags":298,"draft":15,"word_count":302},"cef-lnk2038-iterator-debug-level","CEF LNK2038：解决 _ITERATOR_DEBUG_LEVEL 不匹配错误","分析 CEF（Chromium Embedded Framework）集成时出现的 LNK2038 _ITERATOR_DEBUG_LEVEL 链接错误，从根本原因到解决方案的完整指南。","2024-05-07",[200,299,300,301],"CEF","Visual Studio","链接错误",1509,{"slug":304,"title":305,"description":306,"pub_date":307,"tags":308,"draft":15,"word_count":312},"npm-electron-install-fix","彻底解决 npm 安装 Electron 失败的问题","分析 npm install electron 失败的根本原因（下载二进制超时\u002F被墙），通过国内镜像（npmmirror）彻底解决，并介绍多种备选方案和常见错误排查。","2024-03-01",[263,309,310,311],"npm","前端工具链","国内镜像",1494,{"slug":314,"title":315,"description":316,"pub_date":317,"tags":318,"draft":15,"word_count":320},"git-out-of-memory","解决 git 报错：Fatal: Out of memory, malloc failed","分析 git 大仓库操作时出现 Out of memory malloc failed 的根本原因，通过调整 pack.windowMemory、http.postBuffer 和 git repack 彻底解决。","2024-01-31",[74,12,319],"工具",2244,{"slug":4,"title":5,"description":6,"pub_date":9,"tags":322,"draft":15,"word_count":323},[11,12,13,14],2523,{"slug":325,"title":326,"description":327,"pub_date":328,"tags":329,"draft":15,"word_count":334},"load-balancing-algorithms","负载均衡算法完全指南：从轮询到一致性哈希","系统梳理静态与动态负载均衡算法，涵盖轮询、随机、权重、IP Hash、一致性 Hash、最少连接、最快响应等，并对比 Nginx、Dubbo、Spring Cloud LoadBalancer 的实现差异。","2023-11-15",[330,331,332,333],"分布式","负载均衡","Nginx","微服务",1764,{"slug":336,"title":337,"description":338,"pub_date":339,"tags":340,"draft":15,"word_count":344},"win-cw2a-ca2w","ATL 字符串转换：CW2A 与 CA2W 完全指南","详解 ATL 宏 CW2A\u002FCA2W 在 Unicode 与 ANSI 之间的字符串转换用法、头文件依赖、USES_CONVERSION 宏的作用与常见陷阱。","2023-06-09",[200,341,342,343],"windows","ATL","字符串",1665,{"slug":346,"title":347,"description":348,"pub_date":339,"tags":349,"draft":15,"word_count":353},"csharp-sendmessage-cpp","C# 通过 SendMessage 向 C++ 窗口发送消息与字符串","使用 P\u002FInvoke 调用 user32.dll 的 SendMessage，从 C# 发送自定义 WM_USER 消息及字符串指针给 C++ 原生窗口，并在 C++ 侧正确接收和转换。",[350,200,341,351,352],"C#","互操作","PInvoke",1554,{"slug":355,"title":356,"description":357,"pub_date":358,"tags":359,"draft":15,"word_count":361},"win-postmessage-vector","Windows PostMessage 跨线程传递 std::vector 指针","通过 PostMessage 在 Windows 消息队列中传递 std::vector 指针，使用 reinterpret_cast 将指针装入 LPARAM，并在接收方正确释放内存。","2023-05-26",[200,341,360],"WinAPI",1823,{"slug":363,"title":364,"description":365,"pub_date":358,"tags":366,"draft":15,"word_count":367},"exe-dll-single-package","将 EXE 和 DLL 打包成单一可执行文件","介绍两种将 exe 和依赖 dll 打包成单文件的方案：Enigma Virtual Box 和 WinRAR 自解压，适合发布 Windows 桌面程序时简化分发流程。",[341,200,319],1619,{"slug":369,"title":370,"description":371,"pub_date":358,"tags":372,"draft":15,"word_count":375},"cpp-random-mt19937","C++ 现代随机数生成：用 mt19937 彻底告别 rand()","深入讲解为什么 rand() 不够用，以及如何用 C++11 的 \u003Crandom> 库正确生成高质量随机数，涵盖 mt19937、各种分布和线程安全。",[200,373,374],"c++11","random",1549,{"slug":377,"title":378,"description":379,"pub_date":380,"tags":381,"draft":15,"word_count":383},"win-startup-registry","C++ 实现程序开机自启动：注册表方式详解","通过操作 Windows 注册表 Run 键实现程序开机自启动，包括 HKCU 与 HKLM 区别、完整封装代码、工作目录问题和 UAC 权限处理。","2022-12-26",[341,200,382],"registry",1201,{"slug":385,"title":386,"description":387,"pub_date":388,"tags":389,"draft":15,"word_count":391},"mfc-cstring-wparam","MFC 中 CString 与 WPARAM 之间的转换","详解 MFC 消息传递中 CString 无法直接强转为 WPARAM 的原因，以及两种正确的转换方案，并介绍结构体指针传递的正确姿势。","2022-11-25",[390,200,341],"mfc",1546,{"slug":393,"title":394,"description":395,"pub_date":396,"tags":397,"draft":15,"word_count":399},"duilib-static-build","正确编译 Duilib 静态库：避免 ATL 依赖和链接错误","详解如何用 DuiLib_Static.vcxproj 编译 Duilib 静态库，解决 VARIANT 未定义、Unicode 配置不匹配和 ATL 依赖等常见问题。","2022-08-24",[200,398,341,390],"duilib",2639,{"slug":401,"title":402,"description":403,"pub_date":404,"tags":405,"draft":15,"word_count":407},"mfc-dpi-adaptive","MFC 界面自适应不同分辨率","MFC 对话框程序实现控件和字体随分辨率自动缩放的完整方案，附 DPI Awareness 配置说明","2022-08-17",[390,200,341,406],"dpi",1414,{"slug":409,"title":410,"description":411,"pub_date":412,"tags":413,"draft":15,"word_count":414},"mfc-drag-window","MFC 无标题栏窗口客户区拖动：三种方法对比","MFC 对话框去掉标题栏后如何实现拖动移动窗口，三种方案完整实现与适用场景分析","2022-08-16",[390,200,341],1633,{"slug":416,"title":417,"description":418,"pub_date":419,"tags":420,"draft":15,"word_count":422},"algorithm-number-complement","整数的补数：位运算掩码解法","LeetCode 476 题，用掩码 XOR 实现整数补数，附 C++\u002FPython\u002FJava 三种实现及补数与补码的区别","2021-03-08",[141,421,239],"位运算",1374,[]]