Ты открываешь Терминал на Маке, набираешь ls, потом cat, потом grep - и всё работает почти как на сервере с Linux. Почти. А потом ты копируешь рабочую команду с Linux-сервера, она падает с непонятной ошибкой, и ты час споришь с sed, который не понимает -i без аргумента. Или пишешь скрипт, который должен стартовать при логине, тянешься за crontab - а оно как-то не так живёт. Корень всех этих мелких подстав один: macOS - это Unix, но не Linux. Совсем другая родословная, своя структура каталогов, свой механизм автозапуска, своя упаковка приложений.
Этот вводный урок - карта местности. Прежде чем мы нырнём в defaults, launchctl, diskutil и Homebrew в следующих главах, надо разложить по полочкам: что такое macos на уровне ядра, почему mac os честно носит имя UNIX, чем он отличается от Linux и Windows, и где мы сейчас оказались по версиям в 2026 году. Без этого фундамента ты будешь зубрить команды, не понимая, почему они такие. С ним - начнёшь предсказывать поведение системы, а это и есть разница между пользователем и админом.
Курс рассчитан на тех, кто уже не боится консоли: разработчиков, сисадминов, Mac-админов парка машин и продвинутых пользователей, которые хотят управлять Маком, а не молиться на него. Новичка мы за борт не выкинем - сложное объясним на пальцах, но и до детского сада упрощать не будем.

Darwin и ядро XNU: что реально крутится под капотом
Когда говорят macOS, обычно имеют в виду красивый графический слой: Finder, Dock, окна, анимации. Но всё это - надстройка. В самом низу лежит Darwin - открытое (в значительной части) ядро операционной системы вместе с базовым набором системных утилит. Darwin - это то, что Apple публикует в исходниках и что технически роднит Мак с настоящими Unix-системами.
Сердце Darwin - ядро XNU. Название расшифровывают как "X is Not Unix", и это гибридное ядро, собранное из трёх кусков:
- Mach - микроядерная основа из университета Карнеги-Меллона. Отвечает за низкоуровневое: межпроцессное взаимодействие (IPC), задачи и потоки, управление виртуальной памятью, диспетчеризацию. Это тот слой, через который порты Mach передают сообщения между процессами.
- BSD - большой пласт кода из линии 4.3BSD/FreeBSD поверх Mach. Именно он даёт POSIX-совместимость: системные вызовы Unix, сетевой стек, виртуальную файловую систему (VFS), управление процессами, модель безопасности (права POSIX, ACL, MAC-фреймворк). Когда твоя программа делает fork() или open(), она разговаривает с этим BSD-слоем.
- IOKit - объектно-ориентированный фреймворк драйверов на C++. Плата за устройства, питание, plug-and-play.
Код: Выделить всё
$ uname -a
Darwin MacBook-Pro.local 25.5.0 Darwin Kernel Version 25.5.0: Mon Apr 27 20:41:15 PDT 2026; root:xnu-12377.121.6~2/RELEASE_ARM64_T6041 arm64
- Darwin - имя ядра ОС. Не "macOS", а именно Darwin. Это и есть Unix-фундамент.
- 25.5.0 - версия ядра Darwin. Она НЕ совпадает с версией macOS. Darwin 25.x соответствует macOS 26 Tahoe. Историческое смещение: Darwin 1.x был ещё в Mac OS X 10.0, и нумерации с тех пор разъехались.
- xnu-12377... - билд того самого ядра XNU.
- RELEASE_ARM64_T6041 и в конце arm64 - это Apple Silicon. T6041 - кодовое обозначение чипа. На старом Intel-Маке тут было бы x86_64.
Тут принципиальный момент, который многие путают. Linux - это Unix-подобная система: он ведёт себя как Unix, следует POSIX, но юридически Unix-ом не является и сертификат The Open Group не получал. А macOS - это сертифицированный UNIX. Apple прогоняет систему через формальную проверку The Open Group на соответствие Single UNIX Specification (UNIX 03) и имеет право легально печатать на коробке слово UNIX. Так с середины 2000-х (начиная с Mac OS X 10.5 Leopard, а заявка на соответствие шла ещё с Tiger), и Tahoe эту линию продолжает.
Почему сертификация вообще возможна - смотри предыдущий раздел: BSD-слой внутри XNU честно предоставляет POSIX-интерфейсы. Сохранить этот BSD-кусок рабочим - и есть ключ к званию UNIX.
Практический вывод не философский, а очень конкретный. macOS - это BSD-родословная, а большинство серверов и контейнеров вокруг тебя - это GNU/Linux. И базовые утилиты у них разные по происхождению:
- ls, sed, find, grep, awk на Маке - это BSD-версии, а на типичном Linux - GNU-версии. Флаги и поведение отличаются.
- Классический пример: GNU sed правит файл на месте как sed -i, а BSD sed на Маке требует аргумент суффикса бэкапа - sed -i ''. Скопировал команду с сервера - получил ошибку.
- BSD date, BSD stat, BSD readlink тоже капризничают по-своему.
launchd вместо systemd и cron: своя система запуска
Ещё одно фундаментальное расхождение с Linux. На Линуксе первый процесс (PID 1) и менеджер служб - обычно systemd, а отложенные задачи - cron. На Маке всё это делает один демон - launchd. Он же PID 1, он же стартует при загрузке, он же запускает и перезапускает службы, он же таймеры и задачи по расписанию.
Убедись, что PID 1 - это launchd:
Код: Выделить всё
$ ps -p 1 -o pid,comm
PID COMM
1 /sbin/launchd
- /System/Library/LaunchDaemons и /System/Library/LaunchAgents - системные, трогать нельзя (туда даже root по умолчанию не пишет из-за защиты целостности).
- /Library/LaunchDaemons - твои общесистемные службы (работают от root, без привязки к залогиненному юзеру).
- /Library/LaunchAgents и ~/Library/LaunchAgents - агенты, которые стартуют в контексте пользовательской сессии.
Код: Выделить всё
$ launchctl list | head -5
PID Status Label
- 0 com.apple.SafariHistoryServiceAgent
892 0 com.apple.Spotlight
- 0 com.apple.AirPlayUIAgent
.app-бандлы: приложение - это папка
В Windows программа - это .exe плюс ворох DLL в Program Files и записи в реестре. В Linux исполняемый файл в /usr/bin, конфиги в /etc, данные в /usr/share - всё размазано. На macOS приложение - это бандл: специально устроенная директория с расширением .app, которая в Finder выглядит как единый объект, но внутри - целая структура.
Загляни внутрь любого приложения через Терминал (в Finder это пункт "Показать содержимое пакета"):
Код: Выделить всё
$ ls /Applications/Safari.app/Contents
Info.plist MacOS Resources _CodeSignature version.plist
- Info.plist - манифест: идентификатор (bundle ID вроде com.apple.Safari), версия, какие файлы открывает, какие нужны права.
- MacOS/ - собственно исполняемый бинарник.
- Resources/ - иконки, локализации, ресурсы.
- _CodeSignature/ - цифровая подпись. macOS проверяет её через Gatekeeper, прежде чем дать запуститься.
Версии и имена в 2026: Tahoe, год-нумерация, конец эпохи Intel
Раньше macOS нумеровали как 10.13, 10.14, 10.15, потом 11, 12, 13, 14, 15 и давали имена калифорнийских мест: Ventura, Sonoma, Sequoia. В 2025 Apple переключилась на год-ориентированную нумерацию, как у iOS. Поэтому текущая система - это macos tahoe, официально macOS 26. Цифра 26 - это привязка к сезону 2025-2026, а не 26-й мажорный релиз подряд. Вышла Tahoe в сентябре 2025.
Проверь, что у тебя именно она:
Код: Выделить всё
$ sw_vers
ProductName: macOS
ProductVersion: 26.5.1
BuildVersion: 25F80
Теперь главное событие для всех, кто держит парк Маков. macOS 26 Tahoe - последняя версия с поддержкой процессоров Intel. Список Intel-моделей, которые ещё тянут Tahoe, урезан до считанных штук (Mac Pro 2019, 16" MacBook Pro 2019, 13" MacBook Pro 2020 с четырьмя портами, iMac 27" 2020). Следующий мажорный релиз (ожидается анонс на WWDC 2026, выход - осенью) будет требовать только apple silicon. Intel-Маки после Tahoe ещё какое-то время получат security-обновления, но эпоха больших ежегодных апгрейдов для них закрылась.
Почему это важно практически:
- Если ты Mac-админ - планируй обновление парка на Apple Silicon до WWDC 2026, иначе застрянешь на Tahoe навсегда.
- Apple Silicon (чипы M-серии) - это ARM-архитектура. Старые Intel-бинарники (x86_64) запускаются через прослойку трансляции Rosetta 2, но это совместимость, а не норма. Нативное всё чаще только под arm64.
- Homebrew на Apple Silicon живёт в /opt/homebrew, а на Intel жил в /usr/local. Это та самая мелочь, на которой спотыкаются скрипты и PATH. Проверить процессор просто:
Код: Выделить всё
$ uname -m
arm64
Где искать правду: официальная документация Apple
Не верь случайным блогам и форумным копипастам - команды и флаги меняются между версиями. Первоисточники:
- support.apple.com - пользовательская и админская справка, поддержка и совместимость.
- support.apple.com/guide/deployment - Apple Platform Deployment, библия для админов парка: MDM, Declarative Device Management, развёртывание.
- developer.apple.com - документация для разработчиков, фреймворки, man-страницы инструментов.
- Для пакетов: brew.sh и docs.brew.sh - официальный Homebrew.
Типичные грабли новичка на macOS
- Копируешь команды с Linux вслепую. BSD-утилиты не GNU. sed -i, date -d, readlink -f ведут себя иначе или вообще не существуют. Сначала man, потом Enter.
- Путаешь версию ядра и версию macOS. uname -r покажет 25.x (Darwin), а это Tahoe (macOS 26). Не пугайся расхождения.
- Ищешь crontab для автозапуска. cron формально есть, но правильный путь на Маке - launchd и plist. Скрипты в cron часто не получают нужного окружения и прав (TCC).
- Ставишь Homebrew не туда. На Apple Silicon - /opt/homebrew. Гайды из 2018 года тянут /usr/local и ломают PATH.
- Лезешь писать в /System. Защита целостности (SIP) не даст даже root. Это не баг, это by design - подробно в главе про csrutil.
Открой Терминал и пройди по шагам, читая вывод осмысленно, а не просто копируя:
- 1. - найди в строке: имя ядра (Darwin), версию ядра, arm64 или x86_64. Запиши, какая у тебя архитектура.
Код: Выделить всё
uname -a - 2. - убедись, что ProductVersion начинается на 26 (Tahoe). Запомни BuildVersion.
Код: Выделить всё
sw_vers - 3. - убедись, что PID 1 - это launchd.
Код: Выделить всё
ps -p 1 -o pid,comm - 4. - посмотри, какие службы крутятся; найди строку с числовым PID и строку с прочерком, объясни себе разницу.
Код: Выделить всё
launchctl list | head - 5. - загляни внутрь бандла, найди Info.plist и папку MacOS.
Код: Выделить всё
ls /Applications/Safari.app/Contents - 6. - убедись, что по умолчанию zsh (/bin/zsh), а не bash. Это тоже отличие современного macOS.
Код: Выделить всё
echo $SHELL
Контрольные вопросы
- 1. Почему macOS - это сертифицированный UNIX, а Linux - только Unix-подобная система? Что внутри XNU обеспечивает POSIX-совместимость?
- 2. Чем daemon отличается от agent в терминах launchd и в каких каталогах они лежат? Почему на Маке для автозапуска используют launchd, а не cron?
- 3. Команда uname -r выдала 25.5.0. Какая это версия macOS по маркетинговому имени и номеру, и почему числа не совпадают?
- 4. Ты на чипе M-серии. В каком каталоге должен жить Homebrew и почему он отличается от Intel-машины? Что значит arm64 в выводе uname -m?
macOS - это не "красивый Linux" и не "Unix-образный Windows". Это сертифицированный UNIX на ядре XNU внутри системы Darwin: микроядро Mach плюс BSD-слой (отсюда POSIX и звание UNIX) плюс IOKit. От Linux его отличают BSD-родословная утилит, launchd вместо systemd и cron, и .app-бандлы вместо разбросанных файлов. В 2026 мы на macOS 26 Tahoe - последней версии с Intel; дальше только Apple Silicon, а значит Homebrew в /opt/homebrew и нативный arm64. Дальше по курсу мы возьмём каждый из этих кирпичей - defaults, launchctl, diskutil, fdesetup, csrutil, spctl, brew - и научимся реально управлять Маком. Фундамент заложен.