Zircon 内核命令行选项

请参阅 //docs/gen/boot-options.md,现在是可信来源。

Zircon 内核会从引导加载程序接收文本命令行,该命令行可用于更改系统的某些行为。内核命令行参数应采用 optionoption=value 的形式,以空格分隔,且不得包含空格。

对于布尔值选项,option=0option=falseoption=off 或将停用选项。采用任何其他形式(optionoption=trueoption=wheee 等)即可启用此选项。

内核命令行会从内核传递到用户启动进程和设备管理器,因此下文介绍的一些选项适用于这些用户空间进程,而非内核本身。

如果键重复,则最后一个值优先,也就是说,后面的设置会替换之前的设置。

组件管理器会在启动时读取文件 /boot/config/additional_boot_args(如果存在),并将 name=value 行导入其环境中,从而扩充或替换内核命令行中的值。系统会忽略前导空格,并忽略以 # 开头的行。名称中不允许有空格。

如需了解如何在 build 中指定选项,请参阅本指南

blobfs.cache-eviction-policy=<policy>

控制 blobfs 的逐出策略(针对没有开放句柄或 VMO 克隆的由分页器支持的 blob)。如果未设置,则使用内部定义的系统默认值。

不受分页器支持的 Blob 不受此旋钮影响。

支持使用以下值:

  • NEVER_EVICT:永不逐出节点。在这种情况下,建议启用内核页面逐出 (kernel.page-scanner.enable-eviction),否则 blobfs 将无限期地在内存中保留所有数据页面。
  • EVICT_IMMEDIATELY:节点没有打开的句柄或 VMO 克隆时,就会立即被逐出。下次访问时,需要重新从磁盘加载这些文件。

blobfs.write-compression-algorithm=<algorithm>

blobfs 在运行时写入 blob 时应使用的压缩算法。 如果未设置,则使用内部定义的系统默认值。

支持使用以下值:

  • ZSTD_CHUNKED
  • UNCOMPRESSED

boot.usb=<bool>

如果为 true,则表示启动存储媒介已通过 USB 总线连接。 //src/sys/live_usb 中的 live_usb 组件使用此参数来确定其是否应运行。

bootsvc.next=<bootfs 路径>

控制 bootsvc 为继续启动过程而要执行的程序。如果未指定,则将使用默认的下一个程序。

可以选择在程序和各个参数之间使用逗号分隔符来指定程序的参数。例如,“bootsvc.next=bin/mybin,arg1,arg2”。

时钟.backstop=<seconds>

设置世界协调时间 (UTC) 时钟的初始偏移量(自 Unix 纪元起,以秒为单位)。该时钟将在启动时由设备协调器设置,之后如果存在 RTC,系统会至少对 RTC 时钟进行清理。

console.shell=<bool>

如果此选项设置为 true,则系统将在 kernel.shell 尚未启动的情况下启动 shell。默认值为 false。

如果该值为 false,还会停用 zircon.autorun.boot 和 zircon.autorun.system 选项。

driver.<name>.tests.enable=<bool>

为单个驱动程序启用单元测试。单元测试将在驱动程序绑定所有设备之前运行。如果 driver.tests.enable 为 true,则默认启用,否则默认处于停用状态。

请再次注意,驱动程序的名称是 ZIRCON_DRIVER 宏的“驱动程序”参数。例如,它不是设备的名称。对于某些驱动程序来说,该名称几乎完全相同,只不过设备可以命名为“foo-bar”,而驱动程序名称必须使用下划线,例如"foo_bar".

drive.sysmem.contiguous_memory_size=<num>

覆盖 sysmem 的连续内存池的板级驱动程序指定的大小。值以字节为单位。

driver.sysmem.protected_memory_size=<num>

覆盖 sysmem 的默认受保护内存池的板级驱动程序指定的大小。值以字节为单位。

driver.tests.enable=<bool>

为所有驱动程序启用单元测试。单元测试将在驱动程序绑定所有设备之前运行。您还可以为单个驱动程序启用测试,请参阅 driver.\<name>.enable_tests。默认值为“已停用”。

特定于 x64 的值

在 x64 上,支持使用一些其他值来配置类似 8250 的 UART:

  • 如果设置为 legacy,系统会使用旧版 COM1 接口。
  • 如果设为 acpi,将使用系统上的 DBG2 ACPI 条目指定的 UART(如果有)。
  • 可以使用 ioport,\<portno>,\<irq> 指定端口 UART。
  • 可以使用 mmio,\<physaddr>,\<irq> 指定 MMIO UART。

例如,ioport,0x3f8,4 将描述旧版 COM1 接口。

所有数字可以采用 strtoul() 接受的任何基数。

所有其他值目前均未定义。

ldso.trace

此选项(默认处于停用状态)会开启动态链接器轨迹输出。输出采用的形式可供 Intel Processor Trace 支持等客户端使用。

zircon.autorun.boot=<命令>

此选项请求在启动时运行该命令

命令应为以根“/”开头的绝对路径。

command 中的任何 + 字符都被视为参数分隔符,允许您将参数传递给可执行文件。

如果 console.shell 为 false,则此选项处于停用状态。

zircon.autorun.system=<command>

此选项请求在装载 system 分区后运行 command。如果没有 system 分区,则永远不会启动。

命令应为以根“/”开头的绝对路径。

command 中的任何 + 字符都被视为参数分隔符,允许您将参数传递给可执行文件。

如果 console.shell 为 false,则此选项处于停用状态。

zircon.system.disable-automount=<bool>

此选项可防止 fshost 自动装载任何磁盘文件系统(/system、/data 等),这对某些低级别测试设置非常有用。默认值为 false。由 netsvc.netboot=true 隐含

zircon.system.pkgfs.cmd=<command>

此选项请求在装载 blob 分区后运行 commandcommand 中的任何 + 字符都被视为参数分隔符,允许您将参数传递给可执行文件。

该可执行文件及其依赖项(动态链接器和共享库)位于 blob 文件系统中。可执行路径是第一个 + 之前的命令。发送到加载器服务的动态链接器 (PT_INTERP) 和共享库 (DT_NEEDED) 名称字符串带有前缀 lib/,以生成路径。系统会使用 zircon.system.pkgfs.file.path 命令行参数将每个这样的路径解析为一个 blob ID(即 ASCII 十六进制形式的 merkleroot)。这样,/boot/config/additional_boot_args 便可以包含用于启动进程的文件的固定清单。

新进程在启动时会收到 PA_USER0 通道句柄,该句柄将用作装载到 /pkgfs 处的客户端文件系统句柄。/pkgfs/system 也将作为 /system 装载。

zircon.system.pkgfs.file.path=<blobid>

与上面的 zircon.system.pkgfs.cmd 一起使用。

zircon.system.filesystem-check=<bool>

此选项要求在装载之前使用文件系统一致性检查工具对系统自动装载的文件系统进行预验证。

默认情况下,此选项设置为 false。

netsvc.netboot=<bool>

如果为 true,zircon 会在启动时尝试通过 netboot 进入另一个 zircon 实例。

更具体地说,zircon 将从本地链接上的引导服务器提取新的 zircon 系统,并尝试 kexec 到新映像中,从而替换当前正在运行的 zircon 实例。

此设置意味着 zircon.system.disable-automount=true

netsvc.disable=<bool>

如果此政策设为 true(默认值),系统会停用 netsvc

netsvc.advertise=<bool>

如果为 true,netsvc 将通过发送 netboot 通告搜寻引导服务器。 默认值为 true。

netsvc.interface=<路径>

此选项指示 netsvc 仅使用拓扑路径以该选项值结尾的设备。所有其他设备都会被 netsvc 忽略。通过在设备上运行 lsdev 命令(例如 /dev/class/network/000/dev/class/ethernet/000),可以从 shell 确定设备的拓扑路径。

这对于具有多个以太网端口的设备(可能会按不确定顺序枚举)配置网络启动非常有用。

netsvc.all-features=<bool>

此选项可使 netsvc 正常运行并支持所有功能。默认情况下,netsvc 会在极简模式中启动,在该模式下,仅支持设备发现。

userboot.next=<路径>

此选项指示 userboot 进程(第一个用户空间进程)在 bootfs 中执行指定的二进制文件,而不是遵循正常的用户空间启动过程(启动设备管理器等)。

它对于备用启动模式(如出厂测试或系统单元测试)很有用。

此处使用的路径名是相对于 userboot.root(如果设置)的,或者是相对于 BOOTFS 的根(稍后通常在 /boot 可见)的相对路径。它不应以 / 前缀开头。

如果该可执行文件使用 PT_INTERP(即动态链接器),则 userboot 进程会提供一项加载器服务来解析 PT_INTERP(动态链接器)名称及其可能请求的任何共享库名称。该服务只会在 BOOTFS 中的 lib/ 目录(在 userboot.root 下)中查找。

可以选择在程序和各个参数之间使用“+”分隔符来指定下一个程序的参数。下一个程序名称将始终作为第一个参数提供。

示例:userboot.next=bin/core-tests+arg1+arg2=foo

userboot.root=<路径>

这会在 BOOTFS 中设置加载器服务的 userboot.next 路径和 lib/ 目录的“根”路径前缀。默认情况下,由于没有前缀,因此路径会被视为从 BOOTFS 根目录开始的精确相对路径。例如,如果使用 userboot.root=pkg/foouserboot.next=bin/app,BOOTFS 中找到的名称将为 pkg/foo/bin/apppkg/foo/lib/ld.so.1 等。

userboot.shutdown

设置此选项后,userboot 将在它启动的进程退出时尝试关闭计算机。请注意,如果设置了 userboot.reboot,系统会忽略 userboot.shutdown

virtcon.disable

如果存在此选项,则不启动虚拟控制台服务。

virtcon.hide-on-boot

如果存在此选项,则在用户使用设备控制键组合切换到虚拟控制台之前,虚拟控制台不会获得任何屏幕的所有权。

virtcon.keep-log-visible

如果存在此选项,虚拟控制台服务将保持调试日志 (vc0) 可见,而不是在启动时切换到第一个 shell (vc1)。

virtcon.keymap=<name>

为虚拟控制台指定按键映射。支持“qwerty”和“dvorak”。

virtcon.font=<name>

指定虚拟控制台的字体。支持“9x16”和“18x32”。

zircon.nodename=<name>

设置 bootserverloglistenernet{addr,cp,ls,runcmd} 工具所使用的系统节点名称。如果省略,系统将根据节点的 MAC 地址生成节点名称。此 cmdline 由 GigaBoot 和 Zircon 支持。

zircon.namegen=<num>

设置系统节点名称生成样式。如果省略或未知,系统会使用样式 1。即使设置了 zircon.nodename,它也不会产生任何影响。旧版名称生成样式将来可能会被移除。此 cmdline 由 GigaBoot 和 Zircon 支持。

样式:- 0:使用基于 MAC 地址的四字名称样式。- 1:fuchsia-0123-4567-89ab。

zvb.current_slot=<_a|_b|_r>

让 Fuchsia 知道引导加载程序启动的槽位。设置此值还会通知 paver 支持 ABR,它应更新 ABR 元数据。

zvb.boot-partition-uuid=<UUID>

zvb.current_slot 的替代方案 - 通过传递包含已启动 Zircon 内核的分区的 UUID,让 Fuchsia 了解引导加载程序启动的槽位。设置此值还会通知 paver 支持 ABR,并且它应该更新 ABR 元数据。

console.device_topological_后缀=<路径>

如果设置了此属性,则控制台启动器将连接到拓扑路径与此后缀匹配的控制台设备。如果未指定,则控制台启动器将连接到 /svc/console。只有 kernel.shell=false 时才有效。

其他 Gigaboot 命令行选项

bootloader.timeout=<num>

此选项用于在引导加载程序中设置启动超时,默认值为 3 秒。将值设为 0 即可跳过启动菜单。

bootloader.fbres=<w>x<h>

此选项用于设置帧缓冲区分辨率。使用引导加载程序菜单显示设备的可用分辨率。

示例:bootloader.fbres=640x480

bootloader.default=<network|local|zedboot>

此选项会将默认启动设备设置为 netboot、使用本地 zircon.bin 或通过 zedboot 设置为 netboot。

如何将命令行传递给内核

在模拟器或 Qemu 中,使用 ffx emu 或 fx qemu

使用 -c 传递每个选项,例如:

ffx emu start -c gfxconsole.font=18x32 -c gfxconsole.early=false

在 GigaBoot20x6 中,网络启动时

在末尾的 -- 分隔符后传递内核命令行,例如:

bootserver zircon.bin bootfs.bin -- gfxconsole.font=18x32 gfxconsole.early=false

在 GigaBoot20x6 中(从 USB 闪存启动时)

在包含命令行的 U 盘文件系统根目录中创建名为“cmdline”的文本文件。