Що відбувається в процесі завантаження Mac OS X?
Ви коли-небудь замислювалися, що відбувається під час завантаження та запуску Mac OS X? З Mac OS X це дещо складніше, ніж колись, і давно минули часи класичної Mac OS (системи 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
у файліInfo.plist пакета розширення.
- Виконується
init ядра. Визначено кореневий пристрій системи завантаження. На даний момент прошивка більше не доступна.
- Різні структури даних Mach/BSD ініціалізуються ядром.
- Набір введення/виведення ініціалізовано.
- Ядро запускає
/sbin/mach_init
, демон іменування служби Mach (bootstrap).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
зпочаток аргумент.
/etc/rc.netboot
обробляє різні аспекти мережевого завантаження. Наприклад, він виконує мережеве та (за наявності) локальне монтування. Він також викликає /usr/bin/nbst, щоб пов’язати тіньовий файл із образом диска, який використовується як кореневий пристрій.Ідея полягає в тому, щоб перенаправляти записи в тіньовий файл, який, сподіваємося, знаходиться в локальному сховищі.
rc.boot
визначає, чи потрібна перевірка узгодженості файлової системи. Завантаження для одного користувача та CD-ROM не запускає 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 запущено.
- Створено файл символів Маха.
/etc/rc
запускаєkextd, процес демона який завантажує розширення ядра на вимогу процесів ядра або клієнта.
/usr/libexec/register_mach_bootstrap_servers
запускається для завантаження різних служб початкового завантаження Mach, які містяться в/ etc/mach_init.d
portmap
іnetinfo запускаються.
- Якщо
/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 — це програма, зазвичай сценарій оболонки, ім’я якого збігається з назвою папки. Папка містить файл списку властивостей, який містить пари ключ-значення, наприкладОпис
,Надає
,Потрібно
,OrderPreference
, повідомлення запуску/зупинки тощо. Ви можете запуститиSystemStarter -n -D як root, щоб програма друкувала інформацію про налагодження та залежності (фактично нічого не запускаючи).
- Елемент
CoreGraphics
запускає демон Apple Type Services (ATSServer
), а також сервер Window (WindowServer).
І тоді ваш Mac завантажується!
Ви можете побачити частину цієї активності самостійно за допомогою детального режиму (який ви можете завантажувати в докладному режимі кожного завантаження або навіть можете налаштувати Mac на постійне завантаження в детальному режимі, якщо ви хочете завжди бачити завантаження в стилі unix), але це досить докладне пояснення.
Apple також має деяку доступну документацію щодо процесу завантаження Mac, доступну тут, у їхній бібліотеці документів для розробників.
Зауважте, що вихідна URL-адреса, яка надає наведену вище інформацію, більше не активна, тому цю публікацію було включено вище для нащадків через кеш. Вихідним джерелом був ланцюжок на KernelThread за такою url: http://www.kernelthread.com/mac/osx/arch_startup.html, який наразі перебуває в автономному режимі та не перенаправляє до нового місця.
Якщо у вас є якісь ласі шматочки чи інші доповнення до послідовності завантаження Mac OS X, поділіться в коментарях!