Mac OS X の起動プロセスでは何が起こりますか?
![]()
Mac OS Xの起動プロセスで何が起こっているのか、疑問に思ったことはありませんか?Mac OS Xでは、以前よりも少し複雑になっています。クラシックMac OS(System 9、8、7、6)の時代は過ぎ去りました。Macが起動すると、アイコンだけで識別できる一連の機能拡張とコントロールパネルが表示され、その後、機能拡張フォルダを探して、Macの起動時に読み込まれるものや実行されるものを簡単に調整できた時代です。しかし、今日ではMac OS XはUnixを基盤としているため、多くのユーザーは舞台裏で何が起こっているのか全く認識していません。
では、Mac OS Xの起動プロセスでは一体何が起こっているのでしょうか?MacをVerboseモードで起動すれば、より詳しく確認することができますが、必ずしも表示される内容の全てを説明できるわけではありません。幸いなことに、KernelThreadのセクションに素晴らしい解説が掲載されています。Mac OS Xの起動イベントのシーケンスが最初から最後まで丁寧にリストアップされています。非常に詳細な内容で、読む価値があります。好奇心旺盛なMacユーザーのために、以下に内容を改めて記載します。
注: 読者が指摘したように、PPC は OF (Openfirmware) を使用し、i386 は EFI (Extensible Firmware Interface) を使用します。
では、Mac OS Xの起動プロセスでは何が起こるのでしょうか?Macの電源を入れると、次のようなことが起こります。
- 電源が入ります。
- OF または EFI コードが実行されます。
- ハードウェア情報が収集され、ハードウェアが初期化されます。
- 起動対象として何か(通常はOSですが、Apple Hardware Testなども)が選択されます。ユーザーに起動対象の選択を促すメッセージが表示される場合があります。
- 制御は
/System/Library/CoreServices/BootXブートローダーに渡されます。BootX はカーネルをロードし、OS バッジがあればそれも描画します。 - BootXは、以前にキャッシュされたデバイスドライバのリスト( によって作成/更新されたもの
/usr/sbin/kextcache)を読み込もうとします。このようなキャッシュは 型でありmkext、複数のカーネル拡張機能の情報辞書とバイナリファイルが含まれています。mkextキャッシュが破損しているか欠落している場合、BootXは/System/Library/Extensions現在のシナリオで必要な拡張機能(拡張機能のバンドルのファイルOSBundleRequired内の プロパティの値によって決定されます)を検索することに注意しInfo.plistてください。 - カーネルルーチン
initが実行され、ブートシステムのルートデバイスが決定されます。この時点では、ファームウェアにはアクセスできなくなります。 - さまざまな Mach/BSD データ構造はカーネルによって初期化されます。
- I/O キットが初期化されました。
- カーネルは
/sbin/mach_init、Mach サービス命名 (ブートストラップ) デーモンを起動します。mach_initサービス名と、それらのサービスへのアクセスを提供する Mach ポート間のマッピングを維持します。
ここからは、スタートアップはユーザーレベルになります。
mach_init/sbin/initは、従来の BSD init プロセスを起動します。init はランレベルを決定し、 を実行して/etc/rc.boot、マシンをシングルユーザーで実行できるようにセットアップします。
実行中、rc.bootおよび他のrcスクリプトは、(ネットワークが稼働しているかどうかを確認する) 、(ディレクトリの内容のみを削除し、構造は削除しない)などの
/etc/rc.commonユーティリティ関数を含むシェル スクリプトをソースします。CheckForNetwork()GetPID()purgedir()
rc.bootブートの種類(マルチユーザー、セーフ、CD-ROM、ネットワークなど)を判断します。ネットワークブートの場合(その場合、sysctl変数kern.netbootは に設定されます)、引数を指定して実行されます。1/etc/rc.netbootstart
/etc/rc.netbootネットワークブートの様々な側面を処理します。例えば、ネットワークマウントと(もしあれば)ローカルマウントを実行します。また、/usr/bin/nbstルートデバイスとして使用されているディスクイメージにシャドウファイルを関連付ける呼び出しも行います。これは、書き込みをシャドウファイル(できればローカルストレージ上にある)にリダイレクトするという考え方です。
rc.bootファイルシステムの整合性チェックが必要かどうかを判断します。シングルユーザーブートおよびCD-ROMブートではfsckは実行されません。SafeBootは常にfsckを実行します。fsckrc.bootの戻り値も処理します。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存在する場合(/etc/sysctl-macosxserver.confMac OS X Serverの場合はプラス)、それが読み込まれ、sysctlそこに含まれる変数が設定されます。 syslogdが開始されます。- Mach シンボル ファイルが作成されます。
/etc/rckextdカーネルまたはクライアント プロセスからの要求に応じてカーネル拡張をロードするデーモン プロセスを起動します。/usr/libexec/register_mach_bootstrap_serversは、Machブートストラップベースのさまざまなサービスをロードするために実行されます。/etc/mach_init.dportmapそしてnetinfo開始されます。/System/Library/Extensions.mkextが より古い場合/System/Library/Extensions、/etc/rc既存の mkext を削除し、新しい mkext を作成します。また、既存の mkext が存在しない場合は、新しい 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項目は、通常はシェルスクリプトであるプログラムで、名前はフォルダ名と一致します。フォルダには、、、、、開始/停止メッセージなどのキーと値のペアを含むプロパティリストファイルが含まれています。rootとして実行すると、プログラムはデバッグ情報と依存関係情報を出力します(実際には何も実行しません)。/System/Library/StartupItems/Library/StartupItemsDescriptionProvidesRequiresOrderPreferenceSystemStarter -n -D- スタートアップ
CoreGraphics項目は、Apple Type Services デーモン (ATSServer) と Window Server (WindowServer) を起動します。
そしてMacが起動します。
詳細モードを使用すると、このアクティビティの一部を自分で確認することができます (起動ごとに詳細モードで起動したり、常に UNIX スタイルの起動を確認したい場合は、Mac が常に詳細モードで起動するように設定することもできます)。ただし、これはかなり徹底した説明です。
Apple は、Mac のブートプロセスに関するドキュメントもいくつか公開しており、こちらにある開発者ドキュメント ライブラリで入手できます。
上記の情報を提供していた元のURLは現在は無効となっているため、後世のためにキャッシュ経由でその投稿を上記に含めています。元の情報源はKernelThreadのスレッド(URL:http://www.kernelthread.com/mac/osx/arch_startup.html)でしたが、現在はオフラインで、新しい場所にリダイレクトされません。
Mac OS X のブート シーケンスに追加したい豆知識やその他の情報があれば、コメント欄で共有してください。