背景

我的电脑是 Windows 11 和 Fedora 双系统。《燕云十六声》原本安装在 Windows 下的 NTFS 分区里,游戏目录位于:

1
/run/media/kris/Software/yysls/

在 Fedora 中,我想直接复用这份已经下载好的 Windows 游戏文件,通过 Steam 的 Proton Experimental 启动,而不是重新下载一遍。

实际测试下来,launcher.exe 可以正常在 Proton 中启动,说明 Proton 本身能够运行启动器,也能够访问 NTFS 分区。但启动器没有正确识别已有游戏目录,而是提示重新下载。

启动器在 Proton 中没有识别已有游戏目录

这篇记录一下排查和修复过程。

测试环境

系统为 Fedora Linux 44 KDE Plasma Desktop Edition,图形平台 Wayland,显卡 AMD Radeon RX 7900 XT。

Fedora 系统信息

添加非 Steam 游戏

先在 Steam 中添加一个非 Steam 游戏,名称设置为:

1
燕云十六声

启动目标是游戏目录下的启动器快捷方式或启动器本体。例如这次 Steam 实际启动的是:

1
/run/media/kris/Software/yysls/launcher.exe.lnk

兼容工具选择:

1
Proton Experimental

启动器可以打开,但提示重新下载。这说明问题不在于 Proton 完全无法运行,而更像是启动器在新的 Proton prefix 中找不到原来的 Windows 安装路径。

定位 Proton Prefix

Steam 的非 Steam 游戏也会有自己的 compatdata 目录。可以先查看 Steam 的快捷方式记录:

1
find "$HOME" -path '*/userdata/*/config/shortcuts.vdf' -print

本机路径是:

1
~/.local/share/Steam/userdata/489743514/config/shortcuts.vdf

再根据最近创建的 compatdata 目录交叉判断:

1
find ~/.local/share/Steam/steamapps/compatdata -maxdepth 2 -type d -printf '%T@ %p\n' | sort -nr | head

这次对应的 AppId 是:

1
2962181067

所以 Proton prefix 位于:

1
~/.local/share/Steam/steamapps/compatdata/2962181067/pfx

真正原因:启动器记录的是 Windows 盘符

游戏启动器目录中有一个配置文件:

1
/run/media/kris/Software/yysls/Win32/deploy/setting.ini

里面有一行很关键:

1
InstallPath=J:/yysls/yysls_medium

也就是说,Windows 下这个游戏原本安装在:

1
J:\yysls\yysls_medium

但新的 Proton prefix 中默认只有:

1
2
C: -> ../drive_c
Z: -> /

没有 J: 盘。启动器进入 Proton 后,继续按 J:/yysls/yysls_medium 查找游戏,因此启动器在 Proton 的虚拟 Windows 环境里找不到原来的盘符路径,所以提示重新下载。

修复方法:给 Proton Prefix 增加 J: 盘映射

进入这个 Proton prefix 的 dosdevices 目录:

1
cd ~/.local/share/Steam/steamapps/compatdata/2962181067/pfx/dosdevices

创建 J: 到真实 Linux 分区路径的符号链接:

1
ln -s /run/media/kris/Software j:

这样,在 Proton 里:

1
J:\yysls\yysls_medium

就会对应到 Linux 下的:

1
/run/media/kris/Software/yysls/yysls_medium

可以验证一下:

1
readlink -f ~/.local/share/Steam/steamapps/compatdata/2962181067/pfx/dosdevices/j:/yysls/yysls_medium

输出应类似:

1
/run/media/kris/Software/yysls/yysls_medium

这一步不会修改游戏文件,只是在 Proton prefix 内添加一个盘符映射。

额外准备一个 C 盘路径

有些 Windows 启动器对 Z: 或外部盘路径兼容性不好。如果后面需要手动选择目录,也可以给它一个更像普通 Windows 安装目录的路径。

创建:

1
2
3
mkdir -p ~/.local/share/Steam/steamapps/compatdata/2962181067/pfx/drive_c/Games
ln -s /run/media/kris/Software/yysls \
~/.local/share/Steam/steamapps/compatdata/2962181067/pfx/drive_c/Games/yysls

这样 Proton 中还可以使用:

1
2
C:\Games\yysls
C:\Games\yysls\yysls_medium

不过这次真正关键的是 J: 映射,因为启动器原配置已经写死了:

1
InstallPath=J:/yysls/yysls_medium

固定 NTFS 分区挂载

另一个问题是游戏目录在 Windows 分区里。如果 Fedora 没有自动挂载这个盘,Steam 启动后就找不到库,也找不到启动器。

本机 Software 分区信息如下:

1
2
3
LABEL=Software
UUID=CA72277472276503
MOUNTPOINT=/run/media/kris/Software

可以通过命令查看:

1
lsblk -f -o NAME,FSTYPE,LABEL,UUID,MOUNTPOINTS

因为 Steam 里已经记录了路径:

1
/run/media/kris/Software/SteamLibrary

而 Proton 盘符映射也指向:

1
/run/media/kris/Software

所以最好保持这个挂载路径稳定。

自动挂载踩坑:用户级服务并不可靠

一开始我尝试过用 systemd user service,在登录 Fedora 后自动按 UUID 挂载这个分区。

创建文件:

1
~/.config/systemd/user/mount-software-disk.service

内容如下:

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Mount Software NTFS disk for Steam libraries

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'findmnt -rn /run/media/kris/Software >/dev/null || /usr/bin/udisksctl mount -b /dev/disk/by-uuid/CA72277472276503'
RemainAfterExit=yes

[Install]
WantedBy=default.target

启用并立即启动:

1
2
systemctl --user daemon-reload
systemctl --user enable --now mount-software-disk.service

查看状态:

1
systemctl --user status mount-software-disk.service --no-pager

这个方案手动测试时可以成功,但重启后并不可靠。原因是:udisksctl 挂载内部 NTFS 分区时需要 polkit 授权,而 systemd --user 服务启动时没有可交互终端,也不能稳定弹出 KDE 的授权窗口。

失败时日志类似:

1
2
Error creating textual authentication agent
Not authorized to perform operation

所以这个方案不适合作为最终方案。如果已经创建过这个用户服务,可以禁用掉:

1
systemctl --user disable --now mount-software-disk.service

推荐方案:写入 fstab 固定挂载

更稳定的做法是写入 /etc/fstab,让系统级挂载接管,不走用户级 polkit 授权。这个方案需要 root 权限。

因为 Steam 里已经记录了:

1
/run/media/kris/Software/SteamLibrary

而前面的 Proton J: 盘符映射也指向:

1
/run/media/kris/Software

所以这里直接把分区固定挂载到同一个路径,避免后面还要修改 Steam 库路径和 Proton 映射。

先创建挂载点并备份 /etc/fstab

1
2
sudo mkdir -p /run/media/kris/Software
sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d-%H%M%S)

再追加挂载配置:

1
UUID=CA72277472276503 /run/media/kris/Software ntfs-3g uid=1000,gid=1000,rw,user,exec,umask=000,nofail,x-systemd.automount,x-systemd.idle-timeout=60 0 0

然后执行:

1
2
sudo systemctl daemon-reload
sudo mount -a

验证:

1
findmnt -no SOURCE,FSTYPE,OPTIONS,TARGET /run/media/kris/Software

如果输出里能看到这个 NTFS 分区已经挂载到 /run/media/kris/Software,就说明路径固定成功。设备名可能会变化,但 /etc/fstab 使用的是 UUID,因此不会依赖 /dev/nvme0n1p5/dev/nvme1n1p5 这类临时设备名。

这里几个选项的作用:

  • uid=1000,gid=1000:让当前用户拥有文件读写权限。
  • umask=000:避免 NTFS 分区内的文件权限过紧,影响 Steam 或启动器写入。
  • nofail:避免 Windows 分区异常时拖慢或阻塞 Linux 启动。
  • x-systemd.automount:访问路径时再自动挂载。
  • x-systemd.idle-timeout=60:空闲一段时间后允许 systemd 自动卸载。

如果是全新整理路径,更倾向于挂载到 /mnt/Software 这类更传统的位置;但本次为了兼容 Steam 已有库路径和 Proton 盘符映射,继续使用 /run/media/kris/Software 更省事。

NTFS 双系统注意事项

如果 Windows 开启了快速启动或休眠,NTFS 分区可能处于未完全关闭状态。Fedora 这边可能会拒绝写入,或者只读挂载。

建议在 Windows 里关闭:

  • 快速启动
  • 休眠

管理员 PowerShell 可以执行:

1
powercfg /h off

然后完全关机,再进入 Fedora。

实际体验

完成 J: 盘符映射后,启动器可以按原来的安装路径识别游戏目录,不需要重新下载。

实际运行后 Linux 下的帧率比 Windows 下更高一些。在Linux下明显比Windows下更流畅。

在默认极致画质下FPS对比:

Linux + Proton 下游戏内右上角显示约 129 FPS:

Linux Proton 下游戏内帧率

Windows 下同一区域附近的游戏内截图右上角显示约 102 FPS:

Windows 下游戏内帧率

但在Windows下,玩家移动、快速转换视角能明显感觉到帧率下降(~60FPS);

上面这组截图不是严格同场景基准测试,光照和视角并不完全一致,但作为实际游玩观察很有参考价值,FSR、插帧等功能也可以正常使用,体验感良好,甚至在性能表现上有一点意外优势。

画面设置

当然,这类网游还要看启动器、反作弊和后续更新策略。Proton Experimental 当前可用,不代表未来每个版本都完全稳定。如果某次更新后出问题,可以尝试:

  • 切换 Proton Experimental / Proton Hotfix / GE-Proton
  • 保留当前可用 prefix
  • 检查启动器是否重写了 setting.ini
  • 确认 J: 盘符映射仍然存在

总结

这次问题的关键点有三个:

  • Steam 非 Steam 游戏会有独立 Proton prefix。
  • 启动器识别已有游戏目录时,依赖 Windows 下原来的安装路径。
  • 只要在 Proton prefix 中恢复对应盘符,例如 J:,就可以复用 Windows 下已经下载好的游戏文件。

最终路径关系如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Proton AppId:
2962181067

Proton Prefix:
~/.local/share/Steam/steamapps/compatdata/2962181067/pfx

Windows 路径:
J:\yysls\yysls_medium

Linux 实际路径:
/run/media/kris/Software/yysls/yysls_medium

盘符映射:
~/.local/share/Steam/steamapps/compatdata/2962181067/pfx/dosdevices/j:
-> /run/media/kris/Software

这个思路不只适用于《燕云十六声》。很多 Windows 游戏启动器在 Proton 中找不到已安装目录,本质上都是 prefix 里缺少原 Windows 环境的注册表、配置文件或盘符映射。先找启动器保存的安装路径,再在 Proton prefix 中把路径补齐,通常比盲目重新下载更有效。