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

Firefox 使用设置的目录,或者配置文件,保存运行中所有的用户指定设置,例如书签、历史记录和扩展。Firefox 启动时,会从几个来源选定目录,包括命令行参数、环境变量、已知文件列表以及默认配置文件。

Firefox 67 的一项改进是用户能够同时使用不同的 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 会尝试寻找系统中已经存在的 Firefox 进程。如果有,则命令行参数会传递给已经存在的进程并在其中执行。

对于 Windows 系统,Firefox 同时只能运行一个进程,除非使用命令行参数 -no-remote 启动额外的进程。这会强行启动额外的进程,但之后启动的 Firefox 将不会检测到这些进程,只要没有发现其他正常启动的进程,就会照常启动。运行多个进程时,每一个都必须有单独的配置文件,这是通过配置文件锁强制实现的。

对于 Linux 系统情况类似但更复杂一些。如果跳过了命令行参数指定的配置,那么 Firefox 只会尝试查找并转到使用该配置的已经存在的进程。如果找不到则会继续启动。-new-instance 参数也可以跳过已有的进程强行启动新的。

新的机制

Firefox 67 之后的版本,不再让所有的 Firefox 安装使用同一个默认配置。每一个 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 开发者版本

对于 Firefox 开发者版本 67,默认配置的的选择更为标准化。现在开发者版本使用和其他67版本相同的系统来选择专属默认配置,不再依赖于指定的配置名称。唯一的不同是,在 profiles.ini 中,上述描述中的"旧配置"指代的配置名称是"dev-edition-default"而不是标记的默认配置。

多进程

Firefox 67 运行多进程的方式也不同了。现在 Windows 和 Linux 下使用相同的机制:

启动过程中 Firefox 运行完整的配置选择机制,基于命令行参数、环境变量和默认配置文件信息,决定要使用哪个配置。之后查找任何已有的正在使用这个配置的 Firefox 进程,如果找到,则将命令行参数传递给找到的进程并且不再启动。

这样带来的好处是,无需额外的命令行参数,你就可以同时运行不同的 Firefox 安装。每个安装都有自己的默认配置,启动一个就会启用它自己的,启动另一个就会使用另一个。如果你正在运行 Firefox 测试版但操作系统的默认浏览器是正式版,当你在其他应用中打开链接时,将会调用 Firefox 正式版打开。而在以前,将会调用你此时正在运行的版本。

有了多进程之后,-no-remote 和 -new-instance 标志在同时运行多个 Firefox 程序时不再发挥作用,但是使用它们也不会报错。

阻止降级

另一个变化是 Firefox 67 将会检测配置文件降级。启动时,Firefox 会检查上次使用这个配置文件的 Firefox 的版本,是否比用户当前要启动的新。因为这会引发很多问题,有时很明显,有时无关紧要。Firefox 现在会阻止用户启动比上次更早的版本,给他们选项去创建新的配置文件。

禁用上述变化

通过在环境变量中设置 MOZ_LEGACY_PROFILES ,配置文件选择器的上述变化可以恢复。但多进程运行机制的变化是不能恢复的。在环境变量中设置 MOZ_ALLOW_DOWNGRADE 或者在运行 Firefox 的命令行参数中使用 --allow-downgrade ,可以绕过阻止降级的功能。


早期 alpha 和 beta 版本的 Firefox 67 将这些信息存储在名为 installs.ini 的不同的文件中。这个文件目前仍然存在,当一个老版本的 Firefox 删除了 profiles.ini 时,可以从这个文件中重新导入。不支持也非常不鼓励修改 profiles.ini 文件。如果有早于67版本的 Firefox 运行时,所有对 profiles.ini 中安装信息进行的改动,如果没有同时修改 installs.ini ,则这些改动很可能会丢失。

这篇文章对您有帮助吗?

请稍候...

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

Illustration of hands

志愿者

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

详细了解