Что происходит в процессе загрузки 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 в подробном режиме, но это не обязательно объясняет все, что вы видите. К счастью, отличное объяснение доступно в сегменте 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
в файлеInfo.plist пакета расширения.
- Выполняется процедура
init ядра. Определяется корневое устройство загрузочной системы. На данный момент прошивка больше недоступна.
- Различные структуры данных Mach/BSD инициализируются ядром.
- Комплект ввода-вывода инициализирован.
- Ядро запускает
/sbin/mach_init
, демон службы именования Mach (начальная загрузка).mach_init поддерживает сопоставления между именами служб и портами Mach, обеспечивающими доступ к этим службам.
С этого момента запуск становится пользовательским:
mach_init
запускает/sbin/init
, традиционный BSD процесс инициализации. init определяет уровень запуска и запускает/etc/rc.boot, что настраивает машину для работы в однопользовательском режиме.
Во время выполнения rc.boot
и другие rc
источник скриптов /etc/rc.common
, сценарий оболочки, содержащий служебные функции, такие как
CheckForNetwork() (проверка работоспособности сети),
GetPID (), purgedir() (удаляет только содержимое каталога, но не структуру) и т. д.
rc.boot
определяет тип загрузки (многопользовательский, безопасный, CD-ROM, сетевой и т. д.). В случае сетевой загрузки (переменнаяsysctl
kern.netboot
будет установлена в1
в этом случае), он запускает/etc/rc.netboot
сstart аргумент.
/etc/rc.netboot
обрабатывает различные аспекты сетевой загрузки. Например, выполняет сетевое и (если есть) локальное монтирование. Он также вызывает /usr/bin/nbst, чтобы связать теневой файл с образом диска, используемым в качестве корневого устройства.Идея состоит в том, чтобы перенаправить запись в теневой файл, который, как мы надеемся, находится в локальном хранилище.
rc.boot
определяет, требуется ли проверка целостности файловой системы. Однопользовательская загрузка и загрузка с компакт-диска не запускают fsck. SafeBoot всегда запускает fsck.rc.boot также обрабатывает статус возврата fsck.
- Если
rc.boot
завершается успешно,/etc/rc
, затем запускается сценарий многопользовательского запуска. При загрузке с компакт-диска сценарий переключается на/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
переменные (например, для максимального количества vnodes, System V IPC и т. д.). Если/etc/sysctl.conf
существует (плюс/etc/sysctl-macosxserver.conf
в Mac OS X Server) он считывается иsysctl устанавливаются содержащиеся в нем переменные.
syslogd запущен.
- Файл символов Mach создан.
/etc/rc
запускаетkextd, процесс демона который загружает расширение ядра по запросу из ядра или клиентских процессов.
/usr/libexec/register_mach_bootstrap_servers
запускается для загрузки различных сервисов на основе начальной загрузки Mach, содержащихся в/ etc/mach_init.d
portmap
иnetinfo запущены.
- If
/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
и/Library/StartupItems
StartupItem — это программа, обычно сценарий оболочки, имя которой совпадает с именем папки. Папка содержит файл списка свойств, содержащий пары ключ-значение, такие какDescription
,Provides
,Requires
,OrderPreference
, сообщения запуска/остановки и т. д. Вы можете запуститьSystemStarter -n -D от имени пользователя root, чтобы программа печатала отладочную информацию и информацию о зависимостях (фактически ничего не запуская).
- Элемент запуска
CoreGraphics
запускает демон Apple Type Services (ATSServer
), а также сервер Windows (WindowServer).
И тогда ваш Mac загрузится!
Вы можете увидеть некоторые из этих действий самостоятельно в подробном режиме (который вы можете загрузить в подробном режиме при каждой загрузке, или вы даже можете настроить Mac на постоянную загрузку в подробном режиме, если вы хотите всегда видеть загрузку в стиле unix), но это довольно подробное объяснение.
У Apple также есть некоторая документация по процессу загрузки Mac, доступная здесь, в их библиотеке документации для разработчиков здесь.
Обратите внимание, что исходный URL-адрес, предоставляющий вышеуказанную информацию, больше не активен, поэтому это сообщение было включено выше для потомков через кеш. Исходным источником был поток на KernelThread по следующему адресу: http://www.kernelthread.com/mac/osx/arch_startup.html, который в настоящее время отключен и не перенаправляется на новое место.
Если у вас есть какие-либо лакомые кусочки или другие дополнения к последовательности загрузки Mac OS X, поделитесь ими в комментариях!