深入理解每个安装拥有专属配置文件的功能

Firefox for Enterprise Firefox for Enterprise 最后更新于: 100% 的用户认为有帮助

在运行时,Firefox 会使用一个设置目录(即配置文件)来存储所有用户专属设置,例如书签、历史记录和扩展程序。启动过程中,Firefox 将根据若干条件选择该目录,包括命令行参数、环境变量以及列出已知配置文件和默认配置文件的清单文件。

Firefox 67 的目标是让用户能同时运行多个 Firefox 程序,无需再通过命令行参数进行配置,同时禁止了使用旧版 Firefox 加载配置文件的机制——因为这种操作不受支持,且已知会引发难以诊断修复的问题,某些情况下甚至会导致 Firefox 完全无法运行。为此,我们改进了配置文件的选择机制。

本文详细说明了配置管理器以前是如何运行的,Firefox 67 之后到现在是怎样的,以及如何从早期版本迁移用户数据。

先前的方式

Firefox 启动时会从用户主目录特定位置的 profiles.ini 文件中读取已知配置文件列表。该文件包含若干配置项及已知配置文件清单(含磁盘存储路径),其中某个配置文件会被标记为默认配置。此默认配置文件适用于用户运行的任意版本 Firefox。

Firefox 随后会检查可能覆盖默认配置文件的环境变量和命令行参数。由于该行为未发生变化,此处不作详述。总之,当这些检查完成后,Firefox要么已选定运行配置文件,要么完全未找到配置文件。

若未找到配置文件且 profiles.ini 中列有配置文件(这表明命令行参数有误或所有配置文件均未标记为默认配置),系统将弹出配置文件管理器供用户选择或创建新配置文件作为默认配置。

若未找到配置文件且 profiles.ini 为空,则视为 Firefox 首次运行,系统将自动创建并使用新的空白默认配置文件,无需用户操作。

用户可通过配置文件管理器随时更改默认配置,此操作将对所有版本的 Firefox 生效。

Firefox 开发者版

Firefox 开发者版存在一个复杂情况:该版本通常使用与其他版本不同的默认配置文件。其实现机制是忽略 profiles.ini 中的常规默认配置标记,转而将名为 "dev-edition-default" 的配置文件设为默认项。这种差异曾引发诸多故障,因此我们计划让开发者版采用与其他版本相同的运行机制。

多进程

另一个关键细节涉及 Firefox 已有运行实例时的处理逻辑。在配置文件选择流程启动前,Firefox 会尝试定位系统中已存在的进程实例。若检测到运行中的实例,系统将不会启动新窗口,而是将命令行参数传递至现有实例执行。

Windows 系统下,除非启动附加实例时使用 -no-remote 命令行参数,否则同一时间只能运行一个 Firefox 实例。使用该参数启动的实例将忽略其他运行中的实例,但后续启动的 Firefox 进程将无法检测到这些特殊实例——因此当未发现常规实例时,系统仍会启动新进程。多个实例同时运行时,每个实例必须使用独立配置文件,此规则通过配置文件锁机制强制执行。

Linux 系统逻辑类似但有细微差异:若启动时指定了配置文件参数,Firefox 仅尝试查找并使用该配置文件的现有实例转交命令(若未找到则继续启动新实例);此外,通过 -new-instance 参数可强制 Firefox 无视现有实例直接启动。

新的机制

自 Firefox 67 版本起,Firefox 不再采用全局默认配置文件机制,而是为每个安装实例(根据解析符号链接后的实际磁盘位置)创建专属默认配置。

本节中,"旧配置"是指 Firefox 67 之前的版本默认使用的配置文件。"专属配置"是指指为特定 Firefox 安装实例标记的默认配置文件。

Firefox 启动时仍会加载 profiles.ini 文件,其内容结构与先前版本一致。已知配置文件中仍可能标记有旧版默认配置。此外,profiles.ini 现新增了已知 Firefox 安装实例列表——每个安装实例对应独立配置段,其名称由 Firefox 安装目录的哈希值生成。每个安装段包含两项关键数据:该实例专属默认配置的磁盘路径,以及配置文件是否被"锁定"至该实例的标记位。

Firefox 启动时仍会检查可能覆盖默认配置的命令行参数与环境变量(机制与前文所述一致)。若当前安装实例已存在专属默认配置,则直接采用该配置继续启动流程。

行为差异点出现在以下场景:当安装实例未标记专属默认配置时(包括因自动重启触发的启动情形——例如为应用 67 及以上版本更新而自动重启时,若前次运行仍在使用旧版默认配置,即会进入此状态)。

若 profiles.ini 中存在安装段但指向的配置文件已被删除,系统将创建并使用新的专属默认配置。

若 profiles.ini 中不存在对应安装段,则视为该安装实例首次运行 67 或更高版本。此时系统将根据智能判定规则,选择创建新的专属默认配置,或将旧版默认配置标记为本实例的专属默认配置:

  1. 旧配置是否包含 compatibility.ini 文件并且能被解析。如果不能则新建专属默认配置并继续启动。(只有非常非常早期的 Firefox 版本没有创建这个文件,所以缺少这个文件意味着要么这是一个完全空白的配置,要么这个配置太老而无法在新版本的 Firefox 中使用)。
  2. 这个 compatibility.ini 文件中包括了使用旧默认配置的最新 Firefox 安装的信息。如果这个旧默认配置是由不同的 Firefox 安装所使用的,那么新建专属默认配置并继续启动。
  3. 检查是否有其他已知的 Firefox 安装将旧默认配置标记为它们的专属配置并且将这个配置"锁定"给那个安装。如果有,则新建专属默认配置并继续启动。
  4. 将旧的默认配置标记为这个安装的专属配置文件,避免其他 Firefox 安装将其作为专属默认配置(这样其他的安装在下次启动时就会创建新配置而不是尝试使用旧配置)。继续启动。此时这个配置仍然被标记为旧的默认配置,老版本的 Firefox 可以继续将其作为自己的默认配置,直到它们升级。
    • 启动过程的最后(种种原因导致这个步骤不能在刚开始启动的时候进行)检查这个 Firefox 安装是否是操作系统的默认浏览器。如果是,则将这个专属默认配置标记为"锁定"这个安装。

用户仍可通过配置文件管理器修改当前 Firefox 安装实例的专属默认配置,且该变更仅作用于当前安装实例。通过此方式选定配置后,系统将自动将该配置文件标记为锁定至本实例的状态。

Firefox 开发者版

Firefox 开发者版 67 已采用更标准的默认配置选择机制。该版本现在与其他 Firefox 67 版本使用相同的专属默认配置选择系统,不再依赖特定配置文件的命名规则。上述流程中唯一调整在于:"旧版默认配置" 特指名为 dev-edition-default 的配置文件,而非 profiles.ini 中标记的默认配置。

多进程

Firefox 67 版本对多实例运行机制进行了重大调整,现 Windows 与 Linux 平台行为完全一致:

启动过程中,Firefox 首先执行完整的配置文件选择流程,根据命令行参数、环境变量及默认配置信息确定目标配置文件。随后检测是否存在使用该目标配置的 Firefox 运行实例——若存在匹配实例,此时不会启动新实例,而是将命令行参数传递至该实例执行。

Firefox 67 版本的多实例运行机制带来核心优势:无需额外命令行参数即可并行运行不同安装实例。每个实例拥有独立默认配置——启动实例A时使用其默认配置,启动实例B则使用另一套配置。例如:当Firefox测试版正在运行,而Firefox正式版是系统默认浏览器时,在其他应用中点击链接将始终在正式版打开(旧版机制下可能随机在已打开的任意Firefox实例中打开)。

该特性使得并行运行多实例时不再需要 -no-remote 和 -new-instance 参数,但若使用这些参数也不会引发错误。

阻止降级

Firefox 67 的另一项改进是配置文件降级检测机制。启动时,Firefox 会检测配置文件是否曾被比当前启动版本更高的 Firefox 使用过(此操作易引发多种兼容性问题——有些问题显而易见,有些则较为隐蔽)。新版 Firefox 将阻止此类降级操作,并主动提供创建新配置文件的选项供用户使用。

禁用上述变化

可通过设置环境变量 MOZ_LEGACY_PROFILES 回退配置文件选择机制的变更,但需注意:该操作不会还原多实例运行机制的改动。若需降级,可设置环境变量 MOZ_ALLOW_DOWNGRADE 或在启动 Firefox 时添加 --allow-downgrade 命令行参数。


早期 alpha 和 beta 版本的 Firefox 67 将这些信息存储在名为 installs.ini 的独立文件中。该文件现作为 profiles.ini 的数据备份存在——若旧版 Firefox 删除 profiles.ini,系统将自动从 installs.ini 重新导入数据。不支持也非常不鼓励修改 profiles.ini 文件。如果有早于67版本的 Firefox 运行时,所有对 profiles.ini 中安装信息进行的改动,如果没有同时修改 installs.ini ,则这些改动很可能会丢失。

此文章在这些用户的协助下写成:

Illustration of hands

志愿者

分享知识并培养专业技能。解答问题并改进我们的知识库。

详细了解