Porovnanie revízií
深入理解每个安装拥有专属配置文件的功能
Revízia 197062:
Revízia 197062 od používateľa wxie2016 zo dňa
Revízia 301881:
Revízia 301881 od používateľa 普莱是袋熊 zo dňa
Kľúčové slová:
Výsledky vyhľadávania:
本文详细说明了配置管理器以前是如何运行的,Firefox 67 之后到现在是怎样的,以及如何从早期版本迁移用户数据。
本文详细说明了配置管理器以前是如何运行的,Firefox 67 之后到现在是怎样的,以及如何从早期版本迁移用户数据。
Obsah:
Firefox 使用设置的目录,或者配置文件,保存运行中所有的用户指定设置,例如书签、历史记录和扩展。Firefox 启动时,会从几个来源选定目录,包括命令行参数、环境变量、已知文件列表以及默认配置文件。
Firefox 67 的一项改进是用户能够同时使用不同的 Firefox 安装,不需要配置命令行参数,并停止支持旧版中曾经使用的配置文件。因为发现在某些情况下,这种配置文件在调试和修复错误时会出现问题,严重时会导致 Firefox 完全无法使用,因此做出了这个改变。
本文详细说明了配置管理器以前是如何运行的,Firefox 67 之后到现在是怎样的,以及如何从早期版本迁移用户数据。
__TOC__
=先前的方式=
启动时,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及更新版本中运行,此时会通过启发式的过程进行判断,是新建一个默认的专属配置还是将旧配置标记为这个安装的专属配置:
#旧配置是否包含 compatibility.ini 文件并且能被解析。如果不能则新建专属默认配置并继续启动。(只有非常非常早期的 Firefox 版本没有创建这个文件,所以缺少这个文件意味着要么这是一个完全空白的配置,要么这个配置太老而无法在新版本的 Firefox 中使用)。
#这个 compatibility.ini 文件中包括了使用旧默认配置的最新 Firefox 安装的信息。如果这个旧默认配置是由不同的 Firefox 安装所使用的,那么新建专属默认配置并继续启动。
#检查是否有其他已知的 Firefox 安装将旧默认配置标记为它们的专属配置并且将这个配置"锁定"给那个安装。如果有,则新建专属默认配置并继续启动。
#将旧的默认配置标记为这个安装的专属配置文件,避免其他 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 ,可以绕过阻止降级的功能。
{note}早期 alpha 和 beta 版本的 Firefox 67 将这些信息存储在名为 installs.ini 的不同的文件中。这个文件目前仍然存在,当一个老版本的 Firefox 删除了 profiles.ini 时,可以从这个文件中重新导入。不支持也非常不鼓励修改 profiles.ini 文件。如果有早于67版本的 Firefox 运行时,所有对 profiles.ini 中安装信息进行的改动,如果没有同时修改 installs.ini ,则这些改动很可能会丢失。{/note}
在运行时,Firefox 会使用一个设置目录(即配置文件)来存储所有用户专属设置,例如书签、历史记录和扩展程序。启动过程中,Firefox 将根据若干条件选择该目录,包括命令行参数、环境变量以及列出已知配置文件和默认配置文件的清单文件。
Firefox 67 的目标是让用户能同时运行多个 Firefox 程序,无需再通过命令行参数进行配置,同时禁止了使用旧版 Firefox 加载配置文件的机制——因为这种操作不受支持,且已知会引发难以诊断修复的问题,某些情况下甚至会导致 Firefox 完全无法运行。为此,我们改进了配置文件的选择机制。
本文详细说明了配置管理器以前是如何运行的,Firefox 67 之后到现在是怎样的,以及如何从早期版本迁移用户数据。
__TOC__
=先前的方式=
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 或更高版本。此时系统将根据智能判定规则,选择创建新的专属默认配置,或将旧版默认配置标记为本实例的专属默认配置:
#旧配置是否包含 compatibility.ini 文件并且能被解析。如果不能则新建专属默认配置并继续启动。(只有非常非常早期的 Firefox 版本没有创建这个文件,所以缺少这个文件意味着要么这是一个完全空白的配置,要么这个配置太老而无法在新版本的 Firefox 中使用)。
#这个 compatibility.ini 文件中包括了使用旧默认配置的最新 Firefox 安装的信息。如果这个旧默认配置是由不同的 Firefox 安装所使用的,那么新建专属默认配置并继续启动。
#检查是否有其他已知的 Firefox 安装将旧默认配置标记为它们的专属配置并且将这个配置"锁定"给那个安装。如果有,则新建专属默认配置并继续启动。
#将旧的默认配置标记为这个安装的专属配置文件,避免其他 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 命令行参数。
{note}早期 alpha 和 beta 版本的 Firefox 67 将这些信息存储在名为 installs.ini 的独立文件中。该文件现作为 profiles.ini 的数据备份存在——若旧版 Firefox 删除 profiles.ini,系统将自动从 installs.ini 重新导入数据。不支持也非常不鼓励修改 profiles.ini 文件。如果有早于67版本的 Firefox 运行时,所有对 profiles.ini 中安装信息进行的改动,如果没有同时修改 installs.ini ,则这些改动很可能会丢失。{/note}