在 Windows 的开发人员驱动器 (Dev Drive) 中安装 Emacs「続」

前情提要: 在 Windows 上编译 Emacs 31 的完整方法 - Emacs-general

在这个贴子中,@LdBeth 给出了一篇在 Windows 上使用 MSYS2 安装 Emacs 的完整教程,在后续的讨论中顺便提到了使用 Windows 的 开发人员驱动器 来加速 Emacs 的启动。我也在随后尝试在 Dev Drive 中 编译 Emacs,但是相比普通环境下的编译速度似乎没有太大的区别。

照常理来说我是不会在这个问题上花时间了,但是昨天受到微软蛊惑把系统从 Win10 升级到了 11,然后我就顺带重新编译 Emacs 再重装一遍。

在 Win 10 上这个现象存在但不严重,但 Win11 上 Emacs 第一次启动时由于 native-comp 编译和丧心病狂的 Antimalware Service Executable 检查,Emacs 在我的机器上的无响应时间差不多有十来分钟,我十分怀疑通常的编译后的 Emacs 在 Win11 上能有怎样的用户体验。今天看到了 Windows如何流畅运行Emacs? - #14,来自 pinacle2000 ,为了提高 Emacs 在 Win11 上的体验不得不试试。

我当前使用的 Windows 系统为 26100.3775。

创建 Dev Drive 和相关设定

首先在 设置系统开发者选项 中勾上开发人员模式,虽然我也不知道有没有用。

随后,在 设置系统存储高级存储设置磁盘和卷 中创建开发人员驱动器,具体过程可以参考下图:

因为是动态拓展大小,所以只要小于 64TB 且足够大就行。盘符建议往大了选,也许可以避免盘符冲突?

“安装” MSYS2

这一步直接将整个 MSYS2 安装目录复制到 Dev Drive 中即可。比如这样:

编译 Emacs

将 Emacs 源代码放在 Dev Drive 中的 msys64/usr/src 下,然后执行 autogen.sh, ./configuremake -jN,最后是 make install 即可完成安装。下面是详细的说明:(注意,下面使用的是 Z 盘中的 msys2 的 UCRT,可以通过点击打开而不是使用原本安装的 MSYS2)

  • 首先,可以从 Emacs 的 github 镜像获取 Emacs 源代码,如果嫌大可以加 --depth 1 ,如果之后有拉取需求可以整个克隆下来

    Z:
    cd msys64\usr\src
    git clone https://github.com/emacs-mirror/emacs
    
  • 获取 Emacs 源代码后,安装编译 Emacs 所需的依赖,这个可以参考 Build Emacs 31 for Windows

  • 在 Emacs 源码根目录下执行 autogen.sh./configure ,我使用了如下 configure 选项:

    ./configure --prefix=/ucrt64 --without-pop --without-compress-install
    

    注意我这里选择的安装目录不是 /usr 或者 /usr/local,因为我使用的是 UCRT64 子环境。同时也注意到这不是和 MSYS2 分离的安装目录,这样 Emacs 可以直接找到所需的 DLL,不用担心 native-comp,tree-sitter 等问题。

  • 执行 make 编译 Emacs,可以指定 -j 参数并行编译。我的机器的 i5-11300H 只有四个核心,所以使用以下命令

    make -j8
    

    如果编译失败,可以尝试 make bootstrap,它会删除所有之前的编译产物重新编译

  • 执行 make install 将 Emacs 安装到 /ucrt64 目录

启动 Emacs

/ucrt64 下找到 emacs.exerunemacs.exe 点击运行即可,也可通过 addpm.exe 安装 Emacs,这样可以通过开始搜索快速找到并启动 Emacs。

(注意,需要将先前的 Emacs 配置目录 .emacs.d 放到 home/${USER} 中,然后指定环境变量 HOME 为此目录后启动 Emacs)

启动 Emacs 后,如果 Emacs 编译时启用了 native-comp 特性且能找到 libgccjit 的话,Emacs 会开始编译一些包。此时 Emacs 几乎无响应,这一状态可能会持续数分钟。在第一次启动后,随后的启动大多时候 Emacs 将处于正常可用状态,但在安装新包时的 native-comp 仍然可能会导致短暂的卡顿。

相比安装在普通位置的 Emacs,在我的机器中,在 Dev Drive 中安装的 Emacs 的启动时间似乎有一定的提升:

需要注意的是我没有多次测试,而且由于我先前没有将 MSYS2 安装到 Dev Drive 中,这个时间提升应该绝大多数来自于 从 Dev Drive 的 HOME 中加载配置和包。

优点

最主要的好处应该是将 Emacs 配置和包放到了 Dev Drive 中,减少了加载时间。

此外,由于 MSYS2,源代码和编译后的 Emacs 都在一个 Dev Drive 中,某种意义上来说可以看作简陋的 Emacs“容器”,方便分发和移动(雾)。如果你有时不时编译最新 Emacs 的需要,只需要在 /usr/srcpull 然后 make, make install 即可。

由于携带了完整的 MSYS2 环境,需要的时候安装一些命令行工具也是很方便的。在不同机器之间迁移只需要加载 Dev Drive 然后设定注册表指定 Emacs 特定的 HOME 目录即可,我写了个简单的 REG 文件:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\GNU\Emacs]
"HOME"="Z:\\msys64\\home\\user"

@pinacle2000 ,方便分享下你是如何在 Dev Drive 中使用的吗?我只是简单折腾了下。

3 个赞

最后是 MSYS2 的 portable 问题,虽然整个 MSYS2 是可移动的,但是似乎不同机器上执行首次执行 SHELL 时会根据系统用户创建新的 home/${USER}

参考 msys2 portable and change name of home directory,一种解决方法是将 msys64\etc 下的 nsswitch.conf 做如下修改来固定用户:

image

明天我借朋友的机器试一试去,看看不同机器上是否有统一的用户目录。

以上。

1 个赞

我要求没那么高,差不多够用即可,目前的方式是:

  1. 分 D: 盘,搞为 Dev Drive. 设 HOME 到 D: 盘目录
  2. 在 D: 安装 scoop, 用 scoop install emacs, git 等.
  3. 安装 doom-emacs.
  4. 用 server 方式常驻 emacs
1 个赞

在Dev Drive中主要是为了防止defender扫描吧。直接把defender禁用了一样的效果

qs,defender 是主要原因

不过现在关defender很费劲,之前我常用的就是装个火绒再关了火绒的防护模块。
但是偶然观察到一个现象,在打开某些程序的时候会卡一会儿 ,而且antivirus的进程cpu占用也升高了。。。
最新的用这个方法可以关 GitHub - mandiant/commando-vm: Complete Mandiant Offensive VM (Commando VM), a fully customizable Windows-based pentesting virtual machine distribution. [email protected]

1 个赞

链接的方法我试了下,重启之后 Emacs 还是需要差不多 2 分钟才能打开(但是第一次打开后后续就正常了),可能我没设置好 :rofl:

我观察了下任务管理器,比较有意思的是 Emacs 占用约等于 0,而 Antimalware Service Executable 占用也是一个很低的值(大概 1% 到 2%),两个都挺慢的。

之前在 Win10 上没碰到过这样的情况。

你没在 configure 时用 --native-complation=aot,我之前提的是 Dev Drive 在这个场景才会有明显编译时间提升(当然这个很吃性能,我虽然用的过气配置,好歹是 i9 11900K)

实际上 Dev Drive 也只是把扫描异步了,没有完全关 win defender

我也没把 Emacs 放在 dev drive 上,MSYS2 编译完就删了,只对 Emacs 的安放路径关了 windows defender,总之后来没再出现 Emacs 冷启动过久的问题。

melpa 更新的话我一般只有 3~7 个包,native compilation 也没大影响

1 个赞

关掉 native-comp 重新编了一版,至少首次启动时间勉强正常了,和 native-comp 应该有很大关系

看来在启动时间上算是白折腾了一下 :rofl: 。冷启动的问题我是重启系统就会出现。

先老实用不带 native-comp 的版本了。

可能比你稍微多一点,差不多五六十个。

之前我也是这样,但在没更新过 Emacs 的情况下问题就没了(也可能是改了 windows defender 后很久才生效),后面也是几次自已编译的没再出过这问题,所以如果你 Win11 也是最新的 patch 的话,我也搞不清楚原因了(

1 个赞

我也没全关,目前是这样,emacs-init-time 冷启动 1~2 秒,启动过一次后不到一秒

:person_shrugging: :man_shrugging: :woman_shrugging:

算了,我一般两周关机一次

你是直接放着电源选择永远不关机吗? 自从发现多次盒盖会让Windows越来越慢之后…就是能明显感觉到同样的工程,编译时间多了一倍,窗口拖动掉帧…一旦重启win之后速度就正常了…多出复现这种情况我就不再盒盖或者睡眠了😂

1 个赞

可能我用电脑比较简单,一般开个一两周电脑似乎没有随时间逐渐卡顿的情况 :innocent:

有跑make check吗?有没有很多跑不过的测试用例?

性能问题和正确性问题不太一样,虽然还没跑就是了

了解。看你正好编,所以借道问问。我是加了udp的patch,虽然目前使用上没发现什么异常,但很多测试没通过,好奇问问。

有点意思,能正常使用吗?

udp客户端是OK的,服务端没测。

1 个赞