Архитектура macOS: XNU, тома и Signed System Volume

Рейтинг: 72.2% · 10 голосов
Подробный курс по macOS для разработчиков и админов: архитектура и Apple Silicon, терминал и zsh, Homebrew и пакеты, launchd и автоматизация, APFS и Time Machine, безопасность (SIP, Gatekeeper, TCC, FileVault), сеть, логи и диагностика, MDM и DDM, контейнеры и виртуализация, восстановление. По официальной документации Apple, актуально на 2026 (macOS 26 Tahoe).
Ответить
Аватара пользователя
Artem_MacAdmin
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Архитектура macOS: XNU, тома и Signed System Volume

Сообщение Artem_MacAdmin »

Оглавление курса (47)
  1. Что такое macOS: Unix под капотом и место в 2026
  2. Архитектура macOS: XNU, тома и Signed System Volume (вы здесь)
  3. Apple Silicon: ARM, Rosetta 2 и отличия от Intel
  4. Установка, обновление и восстановление macOS
  5. Finder, рабочий стол и продуктивность
  6. Системные настройки и их управление из CLI (defaults)
  7. Пользователи и группы: учётные записи и управление
  8. Терминал и zsh: командная строка macOS
  9. CLI на macOS: BSD-команды и отличия от Linux
  10. Настройка zsh: .zshrc, prompt, плагины
  11. Файловая система и права: POSIX, ACL, атрибуты, флаги
  12. Homebrew: пакетный менеджер для macOS
  13. Homebrew глубже: tap, Brewfile, services, обслуживание
  14. Другие пакеты: MacPorts, mas, Nix и App Store
  15. Установка приложений: .app, .dmg, .pkg и Gatekeeper
  16. Управление приложениями и их данные
  17. launchd и launchctl: система запуска macOS
  18. Свои службы и периодические задачи на launchd
  19. Автоматизация: Shortcuts, AppleScript и osascript
  20. Конфигурация как код: defaults, plist и профили
  21. APFS: снапшоты, клоны, контейнеры и шифрование
  22. Управление дисками: diskutil, образы и форматирование
  23. Time Machine и резервное копирование
  24. Внешние диски, форматы и сетевые тома
  25. Модель безопасности macOS: SIP и целостность системы
  26. Gatekeeper, нотаризация и защита от вредоносов
  27. Приватность и TCC: разрешения на доступ
  28. FileVault: полнодисковое шифрование
  29. Связка ключей и управление секретами
  30. Сетевой экран и защита сети
  31. Сеть в macOS: настройка и инструменты
  32. Диагностика сети на Mac
  33. Общий доступ: SSH, экран, файлы, удалённое управление
  34. Процессы и ресурсы: мониторинг производительности
  35. Логи macOS: unified logging и диагностика
  36. Производительность и энергия: powermetrics, диагностика
  37. Энергия, сон и обслуживание системы
  38. Профили конфигурации и основы MDM
  39. Управление парком Mac: MDM, DDM и zero-touch (2026)
  40. Среда разработчика на Mac: Xcode CLT, git, версии
  41. Контейнеры на Mac: Docker Desktop, OrbStack, Apple container
  42. Виртуализация: Virtualization.framework, UTM, Linux и Windows
  43. Режимы загрузки и восстановление (Apple Silicon)
  44. Сброс, NVRAM, Safe Mode и сброс настроек
  45. Траблшутинг macOS: дерево решений по симптомам
  46. Место на диске и обслуживание системы
  47. Сквозной проект: настройка Mac как у профи + куда расти
Ты открыл терминал на свежем Mac, набрал

Код: Выделить всё

sudo touch /System/test
и получил Read-only file system. Под рутом. Первая реакция - "сломалось". Вторая, после пары лет на macOS - "так и задумано, и слава богу". Чтобы перестать драться с системой и начать ей пользоваться по-взрослому, надо понять, как macOS архитектура устроена изнутри: что за ядро под капотом, почему система живёт отдельно от твоих данных, и что такое тот самый Signed System Volume, который не даёт записать ни байта в /System даже руту. Этот урок - фундамент всего курса. Без него команды дальше будут заклинаниями, а с ним - осмысленными действиями.

Разберём четыре слоя: ядро XNU, структуру дисков и томов APFS, механику запечатанной системы (SSV), и песочницу приложений. Пойдём вглубь - не "что нажать", а как и почему это работает.

Слои системы и ядро macOS: что такое XNU

macOS - это не монолит, а стопка слоёв. Сверху - графические приложения и фреймворки (Cocoa, SwiftUI, AppKit). Ниже - системные службы и демоны, которыми дирижирует launchd (про него отдельный урок). Ещё ниже - userspace-библиотеки и BSD-окружение, которое ты видишь в терминале: zsh, ls, ps, утилиты. А в самом низу - ядро macOS под названием XNU.

XNU расшифровывается шутливо как "X is Not Unix", и это гибридное ядро. Гибридное - значит склеено из двух разных движков:
  • Mach - микроядро родом из университета Карнеги-Меллона. Отвечает за самое нутро: управление задачами и потоками, виртуальную память, межпроцессное взаимодействие через порты и сообщения (IPC), планировщик. Когда ты слышишь "Mach port" или видишь в выводе

    Код: Выделить всё

    mach_msg
    - это вот этот слой.
  • BSD - слой поверх Mach, дающий привычный Unix-интерфейс: процессы с PID, пользователи и группы, права POSIX, сетевой стек, файловые системы, системные вызовы (open, read, fork). Команда

    Код: Выделить всё

    uname -a
    покажет Darwin - это и есть открытая основа macOS, ядро XNU плюс BSD-userland.
  • IOKit / драйверы - объектно-ориентированный фреймворк драйверов на C++. Исторически именно сюда грузились kext-ы (kernel extensions).
Проверим версию ядра прямо сейчас:

Код: Выделить всё

$ uname -a
Darwin MacBook-Pro.local 25.0.0 Darwin Kernel Version 25.0.0: ... arm64
$ sysctl kern.osversion kern.bootargs
kern.osversion: 25A123
kern.bootargs:
Тут

Код: Выделить всё

Darwin Kernel Version 25.0.0
- это XNU для macOS 26 Tahoe (нумерация Darwin сдвинута относительно маркетинговой версии). - значит Apple Silicon. На Intel-машине было бы . Tahoe, кстати, последняя версия с поддержкой Intel - дальше только Apple Silicon, и Rosetta 2 для запуска x86-бинарей тоже в режиме доживания.

Изображение

Kext-ы против System Extensions: код уходит из ядра

Раньше всё, что лезло глубоко в систему - антивирусы, VPN, драйверы железа, файловые фильтры - писалось как kext, kernel extension, и грузилось прямо внутрь XNU. Проблема очевидна: код в ядре имеет полный доступ ко всему. Один кривой указатель в kext-е - и паника ядра, синий, простите, серый экран и ребут. Один зловредный kext - и привет, у тебя руткит уровня ядра.

Apple это похоронила. Начиная с macOS 10.15 код выносят из ядра в userspace в виде System Extensions. Ключевая разница в принципе наименьших привилегий: kext имел доступ ко всей системе, а system extension работает в пользовательском пространстве и получает только те привилегии, что нужны для его функции. Упал такой extension - перезапустился сам, ядро живо.

System extensions реализуются через несколько фреймворков:
  • DriverKit - драйверы устройств (USB, HID, сеть, аудио) в формате . В отличие от kext-ов, где можно было только C/C++, тут можно писать хоть на Swift.
  • EndpointSecurity (ES) - для антивирусов, EDR и DLP. Даёт API для наблюдения и контроля: процессы, события файловой системы, сеть, операции ядра. Авторизационные события можно блокировать в реальном времени.
  • NetworkExtension - VPN, контент-фильтры, прокси.
Посмотреть, что реально загружено в систему, можно так:

Код: Выделить всё

$ systemextensionsctl list
1 extension(s)
--- com.apple.system_extension.endpoint_security
enabled  active  teamID  bundleID (version)  name  [state]
*  *  ABCDE12345  com.vendor.edr.es (3.2/3.2)  edr-agent  [activated enabled]
Тут видно: один ES-extension от вендора с конкретным teamID, статус

Код: Выделить всё

activated enabled
. На Apple Silicon включение system extensions и тем более остаточных kext-ов требует понижения уровня безопасной загрузки через

Код: Выделить всё

Recovery -> Startup Security Utility
и явного одобрения пользователем с ребутом. Apple прямым текстом говорит: kext-ы больше не рекомендуются и подрывают целостность и надёжность ОС.

Структура диска: System volume, Data volume и firmlinks

Теперь к диску. Физически у тебя один SSD, на нём один раздел GUID с одним APFS-контейнером. APFS-контейнер - это как пул: внутри него живёт несколько томов (volumes), и они делят свободное место динамически, без жёстких границ разделов. Запусти и смотри:

Код: Выделить всё

$ diskutil apfs list
+-- Container disk3 ...
    APFS Container Reference:     disk3
    |
    +-> Volume disk3s1  Macintosh HD            (Role: System,  Read-Only)
    +-> Volume disk3s2  Macintosh HD - Data     (Role: Data,    Read-Write)
    +-> Volume disk3s3  Preboot
    +-> Volume disk3s4  Recovery
    +-> Volume disk3s5  VM
Ключевая пара - System и Data, и это сердце современной архитектуры:
  • System volume (Macintosh HD) - только чтение. Тут лежит сама ОС: /System, системные бинари, /usr (кроме /usr/local), штатные приложения. Ты сюда писать не можешь.
  • Data volume (Macintosh HD - Data) - чтение-запись. Тут всё твоё: домашние папки /Users, сторонние приложения, /usr/local, изменяемые системные данные, которые физически не могут жить на read-only томе.
Эти два тома объединены в APFS Volume Group и в Finder показываются как один диск "Macintosh HD". Магия, которая сшивает их в единое дерево - firmlinks. Firmlink похож на симлинк, но с отличиями: он только между папками, работает в обе стороны и эффективно сливает содержимое двух папок в одну точку. Полный список лежит прямо в системе:

Код: Выделить всё

$ cat /usr/share/firmlinks
/AppleInternal	AppleInternal
/Applications	Applications
/Library	Library
/Users	Users
/Volumes	Volumes
/private	private
/usr/local	usr/local
...
Слева - путь на System volume, справа - реальная папка на Data volume. Поэтому когда ты идёшь в

Код: Выделить всё

/Users/khovanskiy
, формально стартуешь с read-only тома, но firmlink перебрасывает тебя на Data, и запись работает. Папка /Applications в Finder - это агрегация: штатные приложения физически лежат в

Код: Выделить всё

/System/Applications
(read-only), а твои установленные - на Data, и firmlink показывает их слитно в одной папке. Поэтому Homebrew на Apple Silicon ставит пакеты в

Код: Выделить всё

/opt/homebrew
, а не в /usr - /opt тоже на Data и доступен на запись без обхода защит.

Signed System Volume: почему систему нельзя изменить

Read-only - это полдела. Самое интересное - Signed System Volume (SSV), он же sealed system volume. System volume не просто примонтирован только на чтение - он криптографически запечатан, и проверяется на каждой загрузке.

Механика такая. У каждого файла на системном томе посчитан SHA-256 хеш, и он лежит прямо в метаданных файловой системы. Хеши не разрозненные - они собраны в дерево Меркла: хеш каждого узла рекурсивно покрывает хеши его детей, и так до самого корня. Хеш корня называется seal (печать) - одно значение, которое математически покрывает каждый байт системного тома. Изменишь один байт в одном файле - корневой seal перестанет сходиться.

При установке и обновлении macOS установщик строит это дерево Меркла, вычисляет seal и делает APFS-снапшот системного тома. И вот тонкость: загружается Mac не с самого System volume, а с этого подписанного снапшота, доступного только на чтение. Печать сверяется с подписью Apple - сначала на устройстве при установке, потом на каждом старте. До загрузки ядра загрузчик проверяет seal; не сошлось - Mac не загрузится с этого тома.

Что это даёт на практике:
  • Записать в /System нельзя даже руту - том запечатан, а не просто "защищён правами". Это другой уровень.
  • Малварь не может незаметно подменить системный бинарь - подмена ломает seal, и система это заметит при загрузке.
  • Откат безопасен: снапшоты APFS дешёвые, и если обновление пошло не так, старую версию системы можно вернуть без переустановки.
Увидеть снапшоты, с которых реально едет система, можно так:

Код: Выделить всё

$ diskutil apfs listSnapshots /
Snapshot for disk3s1 ...
+-- com.apple.os.update-<хеш>
    Name:  com.apple.os.update-<хеш>
    Sealed: Broken / Yes
Если в поле стоит - печать цела, всё штатно. Если - кто-то менял системный том, и это диагностический красный флаг. Поверх SSV работает ещё SIP (System Integrity Protection) и проверки прав, но именно SSV - тот фундамент, который делает систему по-настоящему неизменяемой. Поэтому правильный ответ на вопрос "как мне подредактировать файл в /System" в 2026 году - "почти никак и почти никогда не нужно". Кастомные launch-демоны, конфиги, бинари - всё это идёт в /Library и /opt, на Data volume.

Три Library и песочница приложений

Раз уж система отделена от данных, надо чётко держать в голове три директории Library - их вечно путают:
  • Код: Выделить всё

    /System/Library
    - системные компоненты Apple. Read-only, запечатано в SSV. Руками не трогаешь.
  • Код: Выделить всё

    /Library
    - общесистемное для всех пользователей: сторонние launch-демоны, конфиги, шрифты, профили конфигурации MDM. Сюда ставят корпоративный софт и системные настройки. Это на Data volume, писать можно (с правами).
  • Код: Выделить всё

    ~/Library
    - всё пользовательское: настройки приложений (Preferences/*.plist), кеши, контейнеры песочницы, ключи. По умолчанию скрыта в Finder.
И последний слой - sandbox, песочница. Приложения из App Store и многие современные приложения работают изолированно: каждое видит только свой контейнер

Код: Выделить всё

~/Library/Containers/<bundle-id>/
, а не весь твой диск. Когда приложению нужен доступ наружу - к Документам, к камере, к микрофону - оно запрашивает entitlement, а доступ к личным данным дополнительно стережёт TCC (Transparency, Consent, Control - те самые всплывашки "приложение хочет доступ к ..."). Песочница не даёт скомпрометированному приложению гулять по всей системе - его клетка это собственный контейнер. Группам приложений от одного разработчика для общих данных выделяют

Код: Выделить всё

~/Library/Group Containers/
.

Соберём картину целиком: гибридное ядро XNU (Mach + BSD) внизу, драйверы и код безопасности вынесены из ядра в userspace-расширения, система живёт на запечатанном read-only томе SSV и сшита firmlinks с read-write томом данных, а приложения сверху сидят по песочницам. Каждый слой ограничивает соседа. Вот почему

Код: Выделить всё

sudo touch /System/test
обязан падать - и это признак здоровья, а не поломки.

Типичные грабли
  • "Диск раздвоился, в системе два Macintosh HD". Это не баг. System и Data - штатная Volume Group, Finder сливает их в один. Удалять "лишний" Data нельзя - там все твои данные.
  • Пытаешься писать в /usr/bin или /System и злишься на root. Том запечатан SSV - рут тут не всесилен. Свои бинари клади в /usr/local/bin или /opt/homebrew/bin.
  • Старый гайд советует отключить SIP и смонтировать систему на запись ради "кастомизации". Это ломает seal, отключает защиту и в 2026 почти всегда не нужно. Сначала ищи штатный путь через /Library, профили или defaults.
  • Ждёшь, что VPN или антивирус заработает kext-ом. На Apple Silicon это требует понижения Secure Boot и одобрения. Современный софт идёт через System Extensions - проверяй

    Код: Выделить всё

    systemextensionsctl list
    , а не

    Код: Выделить всё

    kextstat
    .
  • Путаешь /Library и ~/Library. Конфиг "для всех" - в /Library, "для меня" - в ~/Library. Положишь не туда - либо не подхватится, либо повлияет не на того пользователя.
Мини-лаба: пощупай руками

Открой Терминал и пройди по шагам, разбирая вывод:
  • Узнай ядро и архитектуру:

    Код: Выделить всё

    uname -a
    и

    Код: Выделить всё

    sysctl kern.osversion
    . Запиши версию Darwin и arm64/x86_64.
  • Посмотри тома контейнера:

    Код: Выделить всё

    diskutil apfs list
    . Найди роли System (Read-Only) и Data (Read-Write).
  • Проверь печать:

    Код: Выделить всё

    diskutil apfs listSnapshots /
    - убедись, что

    Код: Выделить всё

    Sealed: Yes
    .
  • Прочитай список сшивок:

    Код: Выделить всё

    cat /usr/share/firmlinks
    . Сопоставь левую и правую колонки.
  • Попробуй (и получи отлуп) запись в систему:

    Код: Выделить всё

    sudo touch /System/proba
    . Прочитай "Read-only file system" - теперь ты знаешь, почему.
  • Глянь расширения и статус SIP:

    Код: Выделить всё

    systemextensionsctl list
    и

    Код: Выделить всё

    csrutil status
    .
Контрольные вопросы
  • Из каких двух движков склеено гибридное ядро XNU и за что отвечает каждый?
  • Чем Signed System Volume отличается от простого "тома только для чтения" и что такое seal?
  • Зачем нужны firmlinks и почему /Users доступна на запись, хотя формально стартует с read-only тома?
  • Почему современный VPN или антивирус ставится как System Extension, а не как kext, и в чём выигрыш по безопасности?
Итог

macOS - это слоёная система с гибридным ядром XNU (Mach плюс BSD), где код безопасности вынесен из ядра в userspace-расширения, ОС живёт на криптографически запечатанном read-only томе (Signed System Volume) и сшита firmlinks с томом данных, а приложения сверху изолированы песочницами. Запись в систему закрыта не правами, а печатью - и это фундамент устойчивости и безопасности. Дальше в курсе всё ложится на этот каркас: defaults пишет в plist на Data, launchd крутит демоны из /Library, Homebrew ставит в /opt - каждый инструмент знает своё место в архитектуре. Держи эту карту в голове - и macOS перестанет сопротивляться.
👍5 ❤️3 🔥 😄 🤔1
Аватара пользователя
Tracsys51
Сообщения: 1
Зарегистрирован: 14 май 2026, 07:08

Re: Архитектура macOS: XNU, тома и Signed System Volume

Сообщение Tracsys51 »

Наконец дошло почему sudo touch /System падает под рутом. Думал у меня права кривые, а это печать SSV. Спасибо, отпустило.
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
gregkhvor
Сообщения: 1
Зарегистрирован: 15 май 2026, 03:47

Re: Архитектура macOS: XNU, тома и Signed System Volume

Сообщение gregkhvor »

А снапшот загрузки - он же место занимает? И если diskutil показывает Sealed: Broken, это всегда малварь или может просто после неудачного апдейта так бывает?
👍1 ❤️1 🔥2 😄 🤔
Ответить
← Предыдущая глава
Что такое macOS: Unix под капотом и место в 2026
Следующая глава →
Apple Silicon: ARM, Rosetta 2 и отличия от Intel

Все главы курса «macOS для профи: администрирование, терминал и Homebrew»

Поделиться темой: ✈ Telegram VK
Похожие запросы: Установка и первый конфиг nginxЧто такое macOS и Unix под капотомТюнинг и производительность nginx

Вернуться в «macOS для профи: администрирование, терминал и Homebrew»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость