Какво се случва в процеса на стартиране на Mac OS X?
Чудили ли сте се някога какво се случва по време на процеса на зареждане и стартиране на Mac OS X? С Mac OS X е малко по-сложно, отколкото някога бяха нещата, и отдавна отминаха дните на класическата Mac OS (система 9, 8, 7, 6), когато гледахме как нашите Mac компютри се зареждат със серия от разширения и контролни панели, които винаги бихме могли да идентифицираме само по тяхната икона и след това да се разровим в папката Extensions, за да коригираме лесно какво се зарежда и случва при стартиране на Mac.Днес с Unix основите на Mac OS X, много потребители изобщо не знаят какво се случва зад кулисите.
И така, какво точно се случва по време на процеса на стартиране на 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, за да асоциира shadow файл с изображението на диска, което се използва като основно устройство.Идеята е да пренасочите записите към shadow файла, който се надяваме да е на локално хранилище.
rc.boot
определя дали е необходима проверка на последователността на файловата система. Зареждането за един потребител и CD-ROM не изпълнява fsck. SafeBoot винаги изпълнява fsck.rc.boot обработва също състоянието на връщане на fsck.
- Ако
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
променливи (като за максимален брой 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 bootstrap, съдържащи се в/ 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 е програма, обикновено shell скрипт, чието име съвпада с името на папката. Папката съдържа файл със списък със свойства, съдържащ двойки ключ-стойност, катоОписание
,Предоставя
,Requires
,OrderPreference
, съобщения за стартиране/стоп и т.н. Можете да стартиратеSystemStarter -n -D като root, за да накара програмата да отпечата информация за отстраняване на грешки и зависимости (без реално да стартира нищо).
- Стартовият елемент
CoreGraphics
стартира демона на Apple Type Services (ATSServer
), както и Window Server (WindowServer).
И тогава вашият Mac се зарежда!
Можете сами да видите малко от тази дейност с Verbose Mode (който можете да стартирате в Verbose Mode при всяко зареждане или дори можете да настроите Mac винаги да стартира в Verbose Mode, ако искате винаги да виждате зареждане в стил unix), но това е доста подробно обяснение.
Apple също има налична документация за процеса на зареждане на Mac, налична тук в тяхната библиотека с документи за разработчици тук.
Обърнете внимание, че оригиналният URL адрес, предоставящ горната информация, вече не е активен, поради което тази публикация е включена по-горе за бъдещите чрез кеша. Първоначалният източник беше нишка на KernelThread на следния url: http://www.kernelthread.com/mac/osx/arch_startup.html, която в момента е офлайн и не пренасочва към ново местоположение.
Ако имате някакви лакомства или други добавки, които да добавите към последователността за зареждане на Mac OS X, споделете в коментарите!