原文地址:The Boot Process    翻译:la.onger yuelang85@gmail
目录
● 1. 启动过程
•  1.1. BootROM
•  1.2. BootX,boot.efi,系统初始化
•  1.3. 用户认证
•  1.4. 配置用户会话
•  1.5. 注销(Logout Rrsponsibilities)
•  1.5.1. 应用程序(Application Responsibilities)
•  1.5.2. 终止进程
•  1.6. 进程作用域(Identifying the Scope of Processes)
•  1.7. 关机(The Shutdown Process)
●2. 守候进程
•  2.1. 与守候进程通信
•  2.2. 查看正在运行的守候进程
•  2.3. 在一个时间表(Schedule)中运行进程
•  2.3.1. 使用Periodic实现的定时任务
•  2.3.2. 使用cron实现定时任务
•  2.3.3. 使用launchd实现定时任务
•  2.3.4. 使用at实现定时任务
● 3. 如何创建及运行守候进程
•  3.1. When Is a Custom Daemon Appropriate?
•  3.2.  什么时候需要自定的守候进程?
•  3.3. Launching Daemons
•  3.4. 启动守候进程
•  3.4.1. Launching Custom Daemons Using launchd
•  3.4.2. 使用launchd启动自定的守候进程
•  3.4.3. Launching Daemons with Startup Items
•  3.4.4. 使用startup item方式启动守候进程
●  4. 建立一个Startup Iterm
•  4.1. Anatomy of a Startup Item
•  4.2. Startup Item剖析
•  4.3. Creating the Startup Item Executable
•  4.4. 建立Startup Item内的可执行程序
•  4.5. Specifying the Startup Item Properties
•  4.6. Startup Item特性表的说明
宁夏石嘴山•  4.7. Managing Startup Items
•  4.8. 管理Startup Item
•  4.9. Displaying and Localizing a Startup Message
•  4.10. 显示及记录Startup Item的信息
•  4.11. Startup Item Permissions
•  4.12. Startup Item的权限
● 5. 登录错误和警告
•  5.1. Log Levels and Log Files
•  5.2. 日志级别和日志文件
•  5.3. Logging Errors Using the syslog API
•  5.4. 使用syslog API记录错误日志
•  5.5. Logging Errors Using the asl API
•  5.6. 使用asl API记录错误日志
●6. 订制登录和注销
•  6.1. Login Items
•  6.2. 登录项
•  6.2.1. Adding Login Items with Shared File Lists
•  6.2.2. 使用Shared File Lists添加登录项
•  6.2.3. Adding Login Items with Apple Events
•  6.2.4. 使用Apple Events添加登录项
•  6.2.5. Adding Login Items with CFPreferences
•  6.2.6. 使用CFPreferences添加登录项
•  6.2.7. Adding Login Items Manually
•  6.2.8. 手动添加登录项
•  6.3. Loginwindow Scripts
•  6.4. Loginwindow脚本
•  6.4.1. Installing Scripts Using Defaults
•  6.4.2. 使用Defaults安装脚本
•  6.4.3. Installing Scripts Using Loginwindow Hooks
•  6.4.4. 使用Loginwindow钩子(hook)安装脚本•  6.5. Bootstrap Daemons
•  6.6. Bootstrap守候进程
•  6.7. Launchd User Agents
•  6.8. 启动用户代理程序
●1. 启动过程
•  1.1. BootROM
•  1.2. BootX,boot.efi,系统初始化
•  1.3. 用户认证
•  1.4. 配置用户会话
•  1.5. 注销(Logout Rrsponsibilities)
•  1.5.1. 应用程序(Application Responsibilities)
•  1.5.2. 终止进程
•  1.6. 进程作用域(Identifying the Scope of Processes)
•  1.7. 关机(The Shutdown Process)
1. 启动过程
从用户启动Mac OS X系统到出现登录窗口,Mac OS X执行了一套启动流程来使系统可被使用。如果你想为所有用户提供系统服务,你需要在系统启动的过程中运行一些代码。下面的章节介绍了基本启动流程和应该把你提供服务的代码放到何处。
1.1. BootROM
当一台Macintosh被启动时,BootROM固件同时也被激活。BootROM(也是电脑的一个硬件)拥有两个主要职责:初始化(译者注,其实就是启动各个硬件,让其准备好被使用)系统的硬件和选择一个操作系统来启动。BootROM拥有两个部分来帮助它实现这两个职责:
•POST(Power-On Self T est,开机自检)初始化硬件接口,验证是否有足够可用RAM以支持系统运行,并检查可用RAM是否处于正常状态。
•在PowerPC架构的Macintosh电脑上,Open Firmware初始化剩下的硬件,建立最初的设备树(译者
注,原文device tree)(类似目录树,一个用层级关系的方式来表示各硬件与主机间的逻辑关系),并且选择操作系统来启动。
在Intel架构的Macintosh电脑上,EFI来处理基本的硬件初始化,并且选择一个操作系统来启动。
如果安装有多个可启动的Mac OS X系统,BootROM会选择那个最后被系统预置中启动磁盘设置项选择的操作系统。用户可以在电脑启动时按住Option键来自行选择启动的系统,这个做法会让Open Firmware或者EFI显示一个选择启动宗卷的界面。
注意,在一些遗留机型(译者注,老机型)上,有些版本的BootROM既可以启动Mac OS 9系统也可以
启动Mac OS X。而大多数现在的机型只能启动Mac OS X。
1.2. BootX,boot.efi,系统初始化
一旦BootROM的工作完成,并且选择了个Mac OS X分区被选择用其启动,控制权就被传递给BootX(PowerPC平台)或者boot.efi(Intel平台)启动引导器。启动引导器的主要工作就是加载内核环境(译者注,原文kernel environment),作此工作时,启动引导器会在屏幕上显示一个启动画面。
我们可以在根分区的/System/Library/CoreServices目录下到BootX和boot.efi。而且,可以
到/usr/standalone/i386/boot.efi这个boot.efi的拷贝。
字面意思是外来的,外国的,但显然这里不是只外接硬盘的意思。)模式下启动的时候,比如
在exotic”(译者注,“”
的辅助(译者注,原文
说从一个软RAID宗卷上启动的时候,一个启动引导器会保存在一个叫做独立的HFS+”“
“helper”)宗卷上来启动系统。在一些版本的Mac OS X上,内核和mkext缓存的拷贝亦会保存在辅助宗卷里。也就是,这种情况下,根分区下面的引导器和其他一些部件不起作用。
注意:不推荐用UFS格式做Mac OS X v10.5的引导宗卷。
启动过程最开始,启动引导器尝试加载一个包含了所有设备驱动程序的预链接(译者注,原文prelink,这个词的意思是,为了节省时间而预先把一些动态链接库的连接方式记录在执行档中)的内核版本,其位置在:
/
System/Library/Caches/com.apple.kernelcaches。预链接这些设备驱动程序可以缩短系统启动时间。
如果预链接版本的内核丢失,已经过期,或者已损坏,启动引导器会加载一个包含了与预连接内核所列相同驱动的单独
压缩包,此包被称作mkext缓存。
如果mkext缓存包过期,丢失,或者已损坏,启动引导器会搜索/System/Library/Extensions,寻OSBundleRequired属性根据启动类型(例如本地启动或者网络启动)所列的驱动列表来加载驱动。
查看I/O Kit Fundamentals( I/O工具纲要)可以获得更多加载驱动的信息。
一旦内核和所有为启动而必需的驱动加载成功,启动引导器就启动内核的初始化进程。此时应该有足够的驱动被加载,
以到根设备(译者注,原文root device)来加载内核。也是在此时开始,PowerPC架构的Macintosh电脑上,Open Firmware不再被访问(静默状态)。
内核初始化Mach和BSD数据结构(译者注,原文data structure,我也不知道他这里到底指什么意思,应该就是指BSD那一层的东西。)以及I/O Kit。I/O Kit使用设备树(译者注,device tree)作为根
据来连接那些已经加载进内核的驱动。一旦内核到根设备(译者注,原文root device),BSD将把此为根*(译者注,原文Once the kernel finds the root device, it roots(*) BSD off of it.)(来启动)。
注意:“”
作为一个术语,启动(boot)这个词传统上讲是指加载启动引导器和启动硬盘或者分区上的内核。
而最近几年,这个词的含义被扩展了第二层意义:指启动系统可以被最终用户使用的整个启动过程。在这
里,启动这个词是指第一种含义。
“”
在这里,根(root)这个词是指把一个分区作为根分区加载,或者是第一层,或者是文件系统(译者注,“”
原文mounting a partition as the root, or top-level, filesystem,不知道是不是指这个逻辑关系。)。
因此,系统在根分区上启动的时候,内核将会在运行启动脚本之前,把这个分区认为根分区(译者注,原
文Thus, while the OS boots off of the root partition, the kernel roots the OS off of the
partition before executing startup scripts from it.)。
Mac OS X v10.4以前,系统初始化一直是交给mach_init和init来处理。初始化过程中,这两个处理进程调用不同的系统脚本(在/ect/rc目录下),启动程序,为用户准备系统。Mac OSX v10.4以后,这些系统脚本和守候进程的调用
交由launchd来处理。也就是说,目前,launchd是系统根进程。
家族名称大全除了初始化系统已外,launchd进程还协调系统守候进程秩序地调用。就像inetd进程一样,launchd按需启动守候进程(译者注,原文launchd launches daemons on-demand,其实就是指那种launch-on-demand方式。)。以这种方式调用的守候进程可以在不活动期间被关闭或者按需要重启。(当一个服务的请求发送过来的时候,launchd会自
动重新启动守候进程去处理请求。)
这种方式可以释放守候进程占用的内存和其他相关资源,当守候进程在一段很长的时间闲置的时候,这样做非常值得。
但更重要的,这样做相对于人工方式能更有效的处理守候进程间的依赖关系。
然后,launchd启动SystemStarter,后者用来启动那些非按需启动(译者注,原文non-launch-on-demand)的守候进程。
注意,launchd也支持非按需启动的守候进程,但是这种用法并不推荐。launchd守候进程被设计用来消
除守候进程之间的依赖关系。如果你不把你的守候进程设置成按需启动(译者注,原文launch-on-
demand),你就需要用其他办法处理依赖问题,比如用那种遗留下来的Startup Item机制。
查看Daemons 可以获得更多关于按需启动(原文launch-on-demand)和SystemStarter守候进程的信息。
系统初始化的最后阶段,launchd启动loginwindow。loginwindow程序控制了用户会话(原文user session)各自的外观(原文aspect)和登录窗口的调整以及用户登录认证。
注意,默认情况下,Mac OS X随着一个图形化的启动屏幕启动。为了调试启动进程,我们也可以禁用它,
而显示文字操作台信息。这种模式被称作verbose启动模式。要想使用verbose启动模式,只需要在启
动的时候按住command-v键。
1.3. 用户认证
Mac OS X要求用户在进入系统前进行验证。loginwindow程序分为登录部分(显示为用户输入用户名和密码的窗口)以及安全部分(处理用户的认证信息)。一旦通过安全系统的认证,loginwindow程序开始配置用户环境。
有两种情况loginwindow会忽略通常的登录方式而直接开始用户会话。第一种是当系统管理员设定计算机自动以一个指定的用户登录的时候。另一种是安装软件时,如果installer程序在电脑重启后立即运行的时候。
1.4. 配置用户会话
用户成功认证后,loginwindow会马上配置用户环境并且记录这次登录信息。此时会进行如下任务:•对未经授权的远程登录会话采取安全措施。未经注册(译者注,原文reigstered,就是指前面说的未经授权)的应用程序不能使用粘贴板服务(Clipboard)端口。再此情况下,一些标准的功能不能使用,包括复制,剪切,
粘贴,Apple events,窗口最小化,还有其他服务。
•把登录记录在系统的utmp数据库中。
•为控制台终端配置拥有者(译者注,原文owner)和权限。
•重置用户偏好,从而加入全局系统默认值。
•通过bootstap端口和启动pbs注册粘贴板服务(pbs)。
•根据用户偏好设置鼠标,键盘,系统声音。
污段子
•设置用户组权限(gid)
袁立炮轰七宗罪
•从目录服务(Directory Services)中检索用户记录,并且将信息加入到此会话中。
•加载用户环境(包括偏好设置,环境变量,设备和文件权限,钥匙串访问(keychain access)等等)。
•启动Dock,Finder和SystemUIServer。
•启动用户在偏好设置中的帐户设置中登录项目项中设置的应用程序。
一旦用户会话启动并开始运行,loginwindow通过一下方式监视会话和用户的应用程序。
•“
管理用户登出,重启和关闭过程。查看Logout Responsibilities“以获得更多信息。
•管理强制退出窗口,包括监视当前活动的应用程序,并且响应用户对强制退出某应用程序或者重启Finder的请求(用户可以从苹果菜单或者按下Command-Option-Escape键来启动强制退出窗口)。
•将标准错误输出(stderr)写入日志文件。日志文件储存在/资源库(Library)/Logs/Console/ <uid> /cons ole.log文件里,<uid>表示当前登录用户的ID。
如果Finder,Dock或者SystemUIServer进程因为某种原因死掉了,loginwindow会自动重启他们。同样,如果loginwindow进程死掉了,launchd进程会将其重启。
1.5. 注销(Logout Rrsponsibilities)
注销,系统重启,关机,这些过程都有着相似语义。前端进程往往因用户在苹果菜单中选择上述一项而启动这些过程。
然而,一个进程也可以以编程的方法向loginwindow发送一个响应的Apple event来启动这些过程。loginwindow程序执行这个过程(译者注,指注销,系统重启,关机这些中的一项),发送报警(alert)以及通知应用程序,让他们有
机会在关闭前做调整。
以下是一个典型的注销/系统重启/关机过程:
1.用户在苹果菜单中选择注销,重新启动,或者关机项。
2.前端程序根据用户请求向loginwindow发送一个Apple event。
3.loginwindow程序向用户显示一个警示对话框向用户求证是否要执行此操作。
大连旅游景点
4.如果用户确定执行此操作,则loginwindow“
向每一个前端和后端的用户进程发送一个Quit Application Apple event“(kAEQuitApplication)。
5.一旦所有进程退出,loginwindow关闭用户会话,并继续执行:
•对于注销操作,loginwindow将事件队列中的所有事件出列,启动logout-hook程序(如果有定义),记录注销操作,将设备权限和用户偏好重设为默认值,并退出。随后launchd会启动一个新的登录。
(查看Customizing Login and Logout“以获得更多关于loginwindow hook的信息。)
•对于重新启动操作,longinwindow将设备权限和用户偏好设置为默认值并重启系统。
•对于关机操作,loginwindow将系统关闭。
的时候可以选择不终止程序。查看T erminating Processes“以得到更多信前端进程在接收到Quit Application event“
息。
侧方位停车1.5.1. 应用程序(Application Responsibilities)
要想以程序的方式启动一个注销,重新启动,或者关机过程,前端应用程序必须向loginwindow发送一个相应的
Apple event。接收到event后,loginwindow开始关闭用户会话。根据发送过来的Apple event,loginwindow会选择是否展示一个警示对话框并给用户一个取消此过程的机会。
下表显示了注销,重新启动,关闭过程对应的Apple event。这些event不需要参数。
•kAELogOut
•kAEShowRestartDialog
•kAEShowSutdownDialog
接收到这些event后,loginwindow显示一个警示对话框通知用户计算机即将执行的操作。此时,用户可以选择继续
此操作或者终止它。如果用户继续此操作,loginwindow向每个应用程序发送一个要求其退出的Apple event。查
看“ T erminating Processes.“以获得更多信息。
这里还有两个event用来通知loginwindow立即重新启动或是关闭:
•kAERestart
•kAEShutDown
这些event被处理时不会向用户展示警示对话框。因此,如果你这些event给loginwindow,用户没有机会去取消操作,所以这些event要被谨慎地使用。
重要信息:注意,如果一个注销,重新启动或者关机event是被一个Classic环境中的应用程序发送的,
这些event只会对Classic环境和其中的应用程序起作用。剩下的用户会话将会继续运行。