Mac OS X 启动过程中发生了什么?

Finder 图标

有没有想过在 Mac OS X 引导和启动过程中会发生什么?对于 Mac OS X,它比以前复杂了一点,经典 Mac OS(System 9、8、7、6)的日子早已一去不复返了,在那里看着我们的 Mac 使用一系列扩展和控制面板启动我们总是可以仅通过它们的图标来识别,然后在 Extensions 文件夹中四处挖掘,轻松调整 Mac 启动时正在加载和发生的内容。如今,在 Mac OS X 的 Unix 基础上,许多用户完全不知道幕后发生了什么。

那么在 Mac OS X 启动过程中到底发生了什么?您总是可以通过以详细模式启动 Mac 获得更好的外观,但是不一定能解释您所看到的所有内容。幸运的是,KernelThread 中的段提供了一个很好的解释,它从头到尾仔细地列出了 Mac OS X 启动事件的顺序。它相当详尽,值得一读,下面为好奇的 Mac 用户重复了一遍。

注:有读者指出,PPC使用OF(Openfirmware),i386使用EFI(Extensible Firmware Interface)

那么在 Mac OS X 启动过程中会发生什么?打开 Mac,会发生以下情况:

  • 电源已打开。
  • OF 或 EFI 代码被执行。
  • 收集硬件信息并初始化硬件。
  • 某些东西(通常是操作系统,但也有像 Apple Hardware Test 等东西)被选择启动。系统可能会提示用户选择要引导的内容。
  • 控制传递给引导加载程序 /System/Library/CoreServices/BootX。 BootX 加载内核并绘制操作系统标志(如果有)。
  • BootX 尝试加载以前缓存的设备驱动程序列表(由 /usr/sbin/kextcache 创建/更新)。这样的缓存是 mkext 类型,包含多个内核扩展的信息字典和二进制文件。请注意,如果 mkext 缓存已损坏或丢失,BootX 将在 /System/Library/Extensions 中查找当前场景所需的扩展(由 OSBundleRequired< 的值确定) /code> 扩展包的 Info.plist 文件中的属性。
  • 内核的init例程被执行。确定引导系统的根设备。此时,无法再访问固件。
  • 各种Mach/BSD数据结构由内核初始化。
  • I/O Kit 已初始化。
  • 内核启动 /sbin/mach_init,Mach 服务命名(引导)守护进程。 mach_init 维护服务名称与提供对这些服务的访问权限的 Mach 端口之间的映射。

从这里开始,启动变成了用户级别:

  • mach_init 启动 /sbin/init,这是传统的 BSD 初始化进程。 init 确定运行级别,并运行 /etc/rc.boot,它将机器设置为足以运行单用户。

在执行过程中,rc.boot 和其他 rc 脚本源 /etc/rc.common,一个包含实用函数的 shell 脚本,例如 CheckForNetwork()(检查网络是否正常)、GetPID()purgedir()(只删除目录内容,不删除结构)等

  • rc.boot 确定启动类型(多用户、安全、CD-ROM、网络等)。在网络启动的情况下(sysctl 变量 kern.netboot 将设置为 1 在这种情况下),它运行 / etc/rc.netboot 带有 start 参数。

/etc/rc.netboot 处理网络启动的各个方面。例如,它执行网络和(如果有的话)本地挂载。它还调用 /usr/bin/nbst 将影子文件与用作根设备的磁盘映像相关联。这个想法是将写入重定向到影子文件,希望它在本地存储上。

  • rc.boot 确定是否需要文件系统一致性检查。单用户和 CD-ROM 引导不运行 fsck。 SafeBoot 始终运行 fsck。 rc.boot 也处理 fsck 的返回状态。
  • 如果rc.boot 成功退出,/etc/rc,然后运行多用户启动脚本。如果从 CD-ROM 启动,脚本会切换到 /etc/rc.cdrom(安装)。
  • /etc/rc 挂载本地文件系统(HFS+、HFS、UFS、/dev/fd/.vol),确保目录 /private/var/tmp 存在,并运行 /etc/rc.installer_cleanup,如果存在(由安装程序在重启前留下)。
  • /etc/rc.cleanup 已运行。它“清理”了一些 Unix 和 Mac 特定的目录/文件。
  • BootCache 已启动。
  • 设置了各种sysctl 变量(例如vnode 的最大数量、System V IPC 等)。如果 /etc/sysctl.conf 存在(在 Mac OS X 服务器上加上 /etc/sysctl-macosxserver.conf),它被读取并且 sysctl 已设置其中包含的变量。
  • syslogd 已启动。
  • 已创建 Mach 符号文件。
  • /etc/rc 启动 kextd,它是根据内核或客户端进程的需要加载内核扩展的守护进程。
  • /usr/libexec/register_mach_bootstrap_servers 运行以加载包含在 /etc/mach_init.d
  • 中的各种基于 Mach 引导程序的服务

  • portmapnetinfo 已启动。
  • 如果 /System/Library/Extensions.mkext 早于 /System/Library/Extensions/etc/rc 删除现有的mkext 并创建一个新的。如果一个不存在,它也会创建一个。
  • /etc/rc 启动 /usr/sbin/update,这是一个经常将内部文件系统缓存刷新到磁盘的守护进程。
  • /etc/rc 启动虚拟内存系统。 /private/var/vm 设置为交换目录。 /sbin/dynamic_pager 以适当的参数启动(交换文件名路径模板、创建的交换文件的大小、指定何时创建额外交换文件或删除现有交换文件的高低水位警报触发器)。
  • /etc/rc 启动 /usr/libexec/fix_prebinding 来修复不正确的预绑定二进制文件。
  • /etc/rc 执行/etc/rc.cleanup 来清理和重置文件和设备。
  • /etc/rc 最终启动 /sbin/SystemStarter 来处理来自 /System/Library/StartupItems 和 <代码>/库/StartupItems。 StartupItem 是一个程序,通常是一个 shell 脚本,其名称与文件夹名称相匹配。该文件夹包含一个包含键值对的属性列表文件,例如 DescriptionProvidesRequiresOrderPreference、启动/停止消息等。您可以以 root 身份运行 SystemStarter -n -D 让程序打印调试和依赖信息(无需实际运行任何东西)。
  • CoreGraphics 启动项启动 Apple Type Services 守护程序 (ATSServer) 以及 Window Server (WindowServer)。

然后你的 Mac 就启动了!

您可以使用 Verbose Mode(您可以启动进入每次启动的详细模式,或者您甚至可以将 Mac 设置为始终启动在详细模式下如果你想总是看到 unix 风格的引导),但这是一个非常详尽的解释。

Apple 还提供了一些有关 Mac 启动过程的文档,可在其开发者文档库中找到 此处

请注意,提供上述信息的原始 URL 不再有效,因此该帖子已通过缓存包含在上面供后代使用。原始来源是 KernelThread 上的一个线程,网址如下:http:// www.kernelthread.com/mac/osx/arch_startup.html 当前处于离线状态,不会重定向到新位置。

如果您有任何花絮或其他要添加到 Mac OS X 启动顺序的内容,请在评论中分享!