Кіріспе
MacOS жүйелік қызметтерді басқару фреймворкі
launchd – Apple Inc. компаниясының macOS құрамында BSD үлгісіндегі init және SystemStarter-ді алмастыру мақсатымен жасалған init және операциялық жүйелік қызметтерді басқару демоны. Launchd-ді FreeBSD және одан туындаған жүйелерге көшіру әрекеттері жасалды.
Құралымдары
Launch жүйесінде екі негізгі бағдарлама бар: launchd және launchctl. Launchd жүйе және пайдаланушы деңгейінде демондарды басқарады. Xinetd-ге ұқсас, launchd қажет болғанда демондарды іске қоса алады. Watchdogd-ға ұқсас, launchd демондарды бақылап, олардың үздіріліссіз жұмыс істеуін қамтамасыз етеді. Launchd сонымен қатар macOS-та init-ті PID 1 ретінде алмастырды, нәтижесінде ол жүйені жүктеу кезінде іске қосуға жауапты. Конфигурациялық файлдар launchd арқылы іске қосылатын қызметтердің параметрлерін анықтайды. LaunchAgents және LaunchDaemons кітапхана папкаларының ішкі каталогтарында сақталатын, қасиеттер тізіміне негізделген файлдарда шамамен отыз түрлі кілтті орнатуға болады. Launchd-тің өзі бұл конфигурациялық файлдарды білмейді және оларды оқу мүмкіндігі жоқ – бұл "launchctl" бағдарламасының жауапкершілігінде. Launchctl – IPC арқылы launchd-мен байланысатын және launchd-тің түсінетін арнайы сөздік протоколын пайдаланып, launchd тапсырмаларын сипаттау үшін қолданылатын қасиеттер тізімін талдайтын командалық жол бағдарламасы. Launchctl daemon-дарды жүктеу және түсіру, launchd басқаруындағы жұмыстарды бастау және тоқтату, launchd және оның дочерлік процестері үшін жүйе пайдалану статистикасын алу және орта шарттарын орнату үшін қолданылуы мүмкін.
ұшыру
Launchd-тің екі негізгі міндеті бар. Біріншісі – жүйені іске қосу, екіншісі – қызметтерді жүктеу және сақтау. Мұнда PowerPC Mac-та Mac OS X Tiger жүйесінің жеңілдетілген көрінісі (Intel Mac-та EFI Open Firmware-ны және boot.efi BootX-ты алмастырады): Open Firmware аппаратты инициализациялайды, содан кейін BootX жүктеледі. BootX ядроны жүктейді, айналмалы курсорды (pinwheel) көрсетіп, қажетті ядролық кеңейтулерді (kexts) жүктейді. Ядро іске қосылғанда launchd жүктеледі. Launchd /etc/rc-ді, сондай-ақ /System/Library/LaunchDaemons және /Library/LaunchDaemons каталогтарын қарап шығатын әртүрлі скрипттерді орындайды, қажет болған жағдайда launchctl-ге тізімдерді шақырады, содан кейін launchd кіру терезесін іске қосады. 4-қадамда бастау скрипттері жұмыс істеуге тиіс тапсырмаларды іздеп, бірнеше каталогты қарап шығады. Қаралатын екі түрлі каталог бар: LaunchDaemons каталогтарында root құқығымен, әдетте фондық процестер ретінде іске қосылатын элементтер орналасқан. LaunchAgents каталогтарында пайдаланушы ретінде немесе userland контекстінде іске қосылатын агенттік қолданбалар деп аталатын тапсырмалар бар. Бұл скрипттер немесе басқа да алдыңғы планды элементтер болуы мүмкін, тіпті олар пайдаланушы интерфейсін де қамтуы мүмкін. Бұл каталогтардың барлығы Mac OS X-тің стандартты кітапхана каталогтарында сақталады. Launchd, SystemStarter-ден өте ерекшеленеді, себебі ол жүктелу кезінде барлық демонды іске қоспауы мүмкін. Launchd-тің маңызды ерекшелігі, xinetd-ке ұқсас, талап бойынша демонды іске қосу идеясы болып табылады. Launchctl жүктелу кезінде тапсырмалар тізімін қарап шыққанда, launchd-тен осы тапсырмалардың сұраған барлық порттарын резервтеуді және тыңдауды сұрайды. Егер plist-те "OnDemand" кілті арқылы көрсетілген болса, демон сол уақытта жүктелмейді. Керісінше, launchd портты тыңдап, қажет болған кезде демонды іске қосып, қажеттілігі болмағанда оны тоқтатады. Демон жүктелгеннен кейін, launchd оны қадағалап, қажет болған жағдайда оның жұмыс істеп тұрғанына көз жеткізеді. Бұл watchdogd-қа ұқсас және процестер өздігінен бұрылысқа түсуге немесе демонды өздігінен іске қосуға тырыспауы керек деген watchdogd талабын бөліседі. Егер процесс фонға өтсе, launchd оны жоғалтып, қайта іске қосуға тырысады. Осының нәтижесінде Mac OS X Tiger бұрынғы нұсқаларға қарағанда әлдеқайда жылдам жүктеледі. Жүйе тек іске қосылатын демонды тіркейді және олар қажет болғанша іске қосылмайды. Шындығында, жүктелу кезінде пайда болатын прогресс жолағы – бұл жай ғана плацебо қолданба (WaitingForLoginWindow деп аталады), ол уақыт өтуінен басқа ештеңе көрсетпейді. Launchd жүктелуі кезінде басқарудың ең қиын бөлігі – тәуелділіктерді басқару. SystemStarter бастау элементінің plist-інде "Uses", "Requires" және "Provides" кілттерін қолданатын тәуелділіктердің өте қарапайым жүйесіне ие болды. Tiger-де launchd тәуелділіктерін құру кезінде екі негізгі стратегия бар: IPC демонды өзара байланысуға мүмкіндік береді, осылайша тәуелділіктерді шешеді, немесе демон файлдарды немесе жолдардағы өзгерістерді бақылай алады. IPC пайдалану SystemStarter кілттерінен әлдеқайда күрделі және әзірлеушіден көп жұмыс талап етеді, бірақ ол таза және жылдам жүктелуге әкелуі мүмкін. SystemStarter OS X Mountain Lion-ға дейін қолдау көрсетті, бірақ OS X Yosemite-де алынып тасталды.
Open Firmware activates, initializes the hardware, and then loads BootX. BootX loads the kernel, spins the pinwheel cursor, and loads any needed kernel extensions (kexts). The kernel loads launchd. launchd runs /etc/rc, various scripts which scan through /System/Library/LaunchDaemons and /Library/LaunchDaemons, calling launchctl on the plists as needed, then launchd starts the login window. In step 4, the startup scripts scan through a few different directories for jobs to run. There are two different directories that are scanned:
The LaunchDaemons directories contain items that will run as root, generally background processes. The LaunchAgents directories contain jobs, called agent applications, that will run as a user or in the context of userland. These may be scripts or other foreground items, and they can even include a user interface. These directories are all kept in the typical Library directories of Mac OS X.
launchd is very different from SystemStarter in that it may not actually launch all the daemons at boot time. Key to launchd, and similar to xinetd, is the idea of launch on demand daemons. When launchctl scans through the job plists at boot time, it asks launchd to reserve and listen on all of the ports requested by those jobs. If so indicated in the plist by the "OnDemand" key, the daemon is not actually loaded at the time. Rather, launchd will listen on the port, start the daemon when needed, and shut it down when it is no longer needed. After a daemon is loaded, launchd will keep track of it and make sure it is running if needed. In this way it is like watchdogd, and shares watchdogd's requirement that processes do not attempt to fork or daemonize on their own. If a process goes into the background, launchd will lose track of it and attempt to relaunch it. Mac OS X Tiger, consequently, boots much faster than previous releases. The system only has to register the daemons that are to run and does not actually launch them until they are needed. In fact, the progress bar that appears during boot time is just a placebo application (named WaitingForLoginWindow) that does not really show anything other than the passage of time. The hardest part to manage during a launchd boot is dependencies. SystemStarter had a very simple system of dependencies that used the "Uses", "Requires", and "Provides" keys in the plist of a startup item. There are two main strategies when creating launchd dependencies on Tiger: IPC allows daemons to talk amongst themselves to work out dependencies, or daemons can watch files or paths for changes. Using IPC is much more subtle than the SystemStarter's keys and requires more work from the developer, but it may lead to cleaner and quicker startups. SystemStarter was still supported up to OS X Mountain Lion, but was removed in OS X Yosemite.
іске қосу
Launchd-те қызметтерді басқару launchctl бағдарламасында шоғырланған. launchctl өздігінен командаларды команда жолынан, стандарттық кірістен немесе интерактивті режимде қабылдай алады. Жоғары өкілдік құқықтарымен launchctl-ді жүйелік деңгейде өзгерістер енгізу үшін пайдалануға болады. launchctl командаларының жиынтығы /etc/launchd.conf файлында сақталғанда тұрақты болып қалады. (Әр пайдаланушы үшін ~/.launchd.conf файлы қарастырылған, бірақ macOS-тың ешбір нұсқасында қолдау көрсетілмейді.) launchctl, launchd-мен Mach-қа тән IPC механизмі арқылы байланысады.
Сокетті іске қосу протоколы
Сокеттер астындағы әрбір кілттің атауы жұмыс іске қосылғанда оның ортасына қойылады, ал сол сокеттің файл дескрипторы осы орта айнымалысында қолжетімді болады. Бұл systemd-нің сокетті белсендіруінен өзгеше, себебі жұмыс конфигурациясы ішіндегі сокет анықтамасының атауы қолданбаға тікелей енгізілген. Бұл протокол аз ғана икемді, бірақ systemd сияқты, демоннан бастапқы файл дескрипторын тікелей енгізуді талап етпейді (2014 жылғы мәлімет бойынша, ол 3-ке тең).
Apple ашық бастапқы кодының шығарылу тарихы
Версия Лицензия Кіріктірілген macOS нұсқалары Кіріктірілген Apple Developer Tools нұсқалары launchd 106 Apple Public Source License launchd 106.3 Apple Public Source License launchd 106.10 Apple Public Source License launchd 106.13 Apple Public Source License launchd 106.14 Apple Public Source License launchd 106.20 Apple Public Source License launchd 152 Apache License 2.0 launchd 257 Apache License 2.0 launchd 258.1 Apache License 2.0 launchd 258.12 Apache License 2.0 launchd 258.18 Apache License 2.0 launchd 258.19 Apache License 2.0 launchd 258.22 Apache License 2.0 launchd 258.25 Apache License 2.0 launchd 328 Apache License 2.0 launchd 329.3 Apache License 2.0 launchd 329.3.1 Apache License 2.0 launchd 329.3.2 Apache License 2.0 launchd 329.3.3 Apache License 2.0 launchd 392.18 Apache License 2.0 launchd 392.35 Apache License 2.0 launchd 392.36 Apache License 2.0 launchd 392.38 Apache License 2.0 launchd 392.39 Apache License 2.0 launchd 442.21 Apache License 2.0 launchd 442.26.2 Apache License 2.0 launchd 842.1.4 Apache License 2.0 launchd 842.90.1 Apache License 2.0 launchd 842.92.1 Apache License 2.0