Що відбувається в процесі завантаження Mac OS X?

Anonim

Ви коли-небудь замислювалися, що відбувається під час завантаження та запуску 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, поділіться в коментарях!

Що відбувається в процесі завантаження Mac OS X?