Установка приложений: .app, .dmg, .pkg и Gatekeeper

Рейтинг: 62.1% · 15 голосов
Подробный курс по 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

Установка приложений: .app, .dmg, .pkg и Gatekeeper

Сообщение 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 как у профи + куда расти
На Windows "установить программу" - это всегда мастер с кнопкой Далее. На macOS такого единого ритуала нет, и это сбивает с толку. Тут три принципиально разных способа доставки софта - .app, .dmg, .pkg - плюс невидимый страж Gatekeeper, который то молча пропускает, то выдает "программу нельзя открыть, так как ее автор - неустановленный разработчик". Если не понимать механику, ты либо паникуешь от предупреждений, либо тупо отключаешь защиту целиком (а зря). Разберем, что такое установка приложений на mac на самом деле: где живет программа, что монтируется, что распаковывается и кто решает, можно ли это запускать.

Главное: .app - это не файл, а папка

Самое важное прозрение для пришедших с Windows: приложение macOS - это бандл. То, что в Finder выглядит как один значок Safari или iTerm, на уровне файловой системы - обычная директория с расширением .app, внутри которой лежит исполняемый код, ресурсы, иконки и манифест. Finder просто прячет ее содержимое и показывает иконкой.

Заглянем внутрь. В Finder это пункт контекстного меню "Показать содержимое пакета", а в терминале - просто заходишь как в каталог.

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

$ ls -la /Applications/Safari.app/Contents
total 24
drwxr-xr-x  ... CodeResources
-rw-r--r--  ... Info.plist
drwxr-xr-x  ... MacOS
drwxr-xr-x  ... Resources
drwxr-xr-x  ... _CodeSignature
-rw-r--r--  ... PkgInfo
drwxr-xr-x  ... Frameworks
Разбор. Info.plist - паспорт бандла: внутреннее имя, идентификатор (bundle ID вроде com.apple.Safari), версия, минимальная macOS, имя исполняемого файла. MacOS/ - сам бинарник, который и запускается. Resources/ - иконки, локализации, картинки. _CodeSignature/ и CodeResources - цифровая подпись, по ней система проверяет, что бандл не подменили.

Прочитать паспорт без выкапывания XML руками:

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

$ defaults read /Applications/Safari.app/Contents/Info CFBundleIdentifier
com.apple.Safari
$ mdls -name kMDItemVersion /Applications/Safari.app
kMDItemVersion = "26.0"
Раз .app - это папка, то "установка" такого приложения сводится к копированию папки в нужное место. Никакого реестра, никаких разбросанных по системе файлов. Хочешь удалить - перетащил бандл в Корзину, и кода больше нет (настройки в ~/Library останутся, но об этом ниже).

Изображение

.dmg - монтируемый образ, а не установщик

Скачал приложение - часто получаешь файл .dmg. Это дисковый образ, виртуальный диск. dmg mac не устанавливает ничего сам по себе - его надо примонтировать, и тогда в системе появляется новый том, как будто ты воткнул флешку. Внутри обычно лежит тот самый бандл .app и стрелка-ссылка на /Applications с подписью "перетащи сюда".

Двойной клик в Finder монтирует образ и открывает окно. Дальше твоя задача - перетащить .app в папку Программы. Перетаскивание копирует бандл на системный диск; пока приложение лежит внутри смонтированного образа, оно работает "с флешки" и отвалится, как только ты образ извлечешь. Это классическая ошибка новичка: запустил прямо из окна dmg, а потом удивляется, почему после перезагрузки программы нет.

В терминале весь цикл виден насквозь. Монтируем (attach), смотрим содержимое, копируем, отмонтируем (detach):

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

$ hdiutil attach ~/Downloads/iTerm2.dmg
/dev/disk4          	GUID_partition_scheme
/dev/disk4s1        	Apple_HFS                      	/Volumes/iTerm2
$ cp -R "/Volumes/iTerm2/iTerm.app" /Applications/
$ hdiutil detach /Volumes/iTerm2
"disk4" ejected.
Разбор вывода. hdiutil attach подключил образ, выдал устройство /dev/disk4 и точку монтирования /Volumes/iTerm2. Дальше копируем именно с флагом -R (рекурсивно), потому что .app - это дерево каталогов, а не один файл; без -R получишь пустую папку. hdiutil detach отсоединяет образ по точке монтирования или по диску. Полезный флаг при автоматизации - -nobrowse: образ примонтируется, но не выскочит в Finder и на рабочем столе.
Грабли: после установки .dmg остается у тебя в Загрузках и продолжает занимать место. Сам образ - это просто архив-контейнер, программе он больше не нужен, удаляй спокойно.
.pkg - настоящий установщик с логикой

Когда программе мало просто скопировать бандл - надо положить файлы в системные каталоги, поставить демон launchd, прописать драйвер, выполнить скрипт - используют pkg установщик mac. Это уже инсталлятор в привычном смысле: мастер с шагами, лицензией и запросом пароля админа. Расширение .pkg.

Двойной клик открывает графический Installer. Но в терминале мощнее и прозрачнее - команда installer:

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

$ sudo installer -pkg ~/Downloads/google-chrome.pkg -target /
installer: Package name is Google Chrome
installer: Installing at base path /
installer: The install was successful.
Ключевое - -target /. Это не "папка, куда ставить", а целевой том (например корневой / или внешний диск). Куда именно лягут файлы, решает не ты, а сам пакет - в его метаданных прописаны пути. Поэтому .pkg может тихо разложить файлы по /Library, /Applications, /usr/local и запустить скрипты - в отличие от .dmg, где ты сам контролируешь, что и куда перетащил. Доверие к .pkg должно быть выше.

Бывает два вида пакетов, и это важно для разбора. Component package - простой пакет с одним набором файлов, внутри лежит PackageInfo. Distribution package - обертка, которая может содержать несколько компонентов, показывать выбор опций, проверять версию macOS; внутри лежит файл Distribution. Внешне расширение одно и то же - .pkg.

Не доверяешь пакету - вскрой его перед установкой, не запуская. Для этого pkgutil:

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

$ pkgutil --expand ~/Downloads/google-chrome.pkg /tmp/chrome_pkg
$ ls /tmp/chrome_pkg
Distribution
GoogleChrome.pkg
Resources
$ ls /tmp/chrome_pkg/GoogleChrome.pkg
Bom            PackageInfo    Payload        Scripts
Разбор. Наличие файла Distribution на верхнем уровне говорит, что это distribution-пакет, а внутри лежит вложенный component-пакет GoogleChrome.pkg. Внутри компонента: Payload - сжатый архив с самими файлами (cpio+gzip), Bom - bill of materials, список всего, что встанет, PackageInfo - метаданные и пути, Scripts - те самые скрипты preinstall/postinstall. Хочешь сразу распаковать и payload в читаемое дерево - бери pkgutil --expand-full вместо --expand.

Именно в Scripts прячется postinstall-скрипт, который выполнится с правами root после распаковки. Это и удобство (можно настроить демон), и вектор атаки. Вскрыть и прочитать postinstall перед установкой подозрительного пакета - нормальная гигиена админа.

Что уже стоит в системе и какие файлы принес конкретный пакет:

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

$ pkgutil --pkgs | grep -i chrome
com.google.Chrome
$ pkgutil --pkg-info com.google.Chrome
package-id: com.google.Chrome
version: 138.0.7204.0
install-time: 1749900000
$ pkgutil --files com.google.Chrome | head -3
Applications
Applications/Google Chrome.app
Applications/Google Chrome.app/Contents
pkgutil --pkgs - реестр установленных приемников (receipts), они же квитанции в /var/db/receipts. По ним система помнит, что и какой версии было поставлено через .pkg. --files показывает, какие файлы принадлежат пакету - удобно, когда надо вычистить руками то, у чего нет деинсталлятора.

Gatekeeper и карантин: почему mac не дает открыть программу

Теперь главный страж. Gatekeeper - подсистема, которая при первом запуске скачанного софта проверяет три вещи: подписан ли он валидным сертификатом Apple Developer, прошел ли нотаризацию (notarization - автопроверку Apple на известный вредонос) и не подменили ли бандл после подписи. Если все ок - запуск молча проходит. Если нет - ты получаешь то самое окно про неустановленного разработчика, и установить программу mac штатным двойным кликом не выходит.

Спусковой крючок - расширенный атрибут com.apple.quarantine. Когда браузер или мессенджер скачивает файл, он вешает на него этот xattr. Gatekeeper проверяет именно помеченные карантином файлы, а не все подряд - вот почему софт, собранный локально или скопированный с другого Mac по сети, часто запускается без вопросов.

Посмотреть карантин:

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

$ xattr -p com.apple.quarantine ~/Downloads/SomeApp.app
0083;6650a1b2;Safari;F1E2D3C4-...
$ xattr -l ~/Downloads/SomeApp.app
com.apple.quarantine: 0083;6650a1b2;Safari;F1E2D3C4-...
Разбор флага карантина: четыре поля через точку с запятой - битовый флаг состояния, время в hex, имя агента-загрузчика (тут Safari) и UUID события. По этому атрибуту система и понимает, что файл из интернета и его надо прогнать через Gatekeeper.

Проверить вердикт Gatekeeper заранее, не запуская:

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

$ spctl -a -vvv /Applications/iTerm.app
/Applications/iTerm.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: ...

$ spctl -a -vvv ~/Downloads/SomeApp.app
~/Downloads/SomeApp.app: rejected
source=no usable signature
spctl -a (assess) выносит вердикт: accepted с источником Notarized Developer ID - чистый нотаризованный софт, App Store - из магазина, а rejected означает, что подписи нет или она битая. Важно знать про 2026: начиная с macOS Sequoia (15) утилита spctl больше не управляет политиками Gatekeeper (команды вроде spctl --master-disable убрали), она осталась только для оценки. Это поведение сохраняется и в macOS 26 Tahoe.

Как все-таки открыть и три уровня доверия

Три категории софта по доверию. App Store - максимум доверия, проходит ревью Apple, запускается без единого вопроса. Notarized (Developer ID + нотаризация) - подписан реальным разработчиком и проверен Apple автоматически; ставится с обычным двойным кликом, Gatekeeper доволен. Unsigned/неподписанный - самопал, opensource без сертификата, что-то с торрента; вот его Gatekeeper и блокирует.

Раньше обходом был трюк "правый клик по приложению -> Открыть" в контекстном меню Finder. Важно для 2026: в macOS Sequoia Apple убрала этот Control-click обход. Теперь штатный путь такой - попробовать открыть приложение, получить отказ, затем зайти в Системные настройки -> Конфиденциальность и безопасность, пролистать вниз до сообщения о заблокированном приложении и нажать Открыть в любом случае, подтвердив паролем админа или Touch ID. Так Apple оставила лазейку для своего софта, но сделала ее осознанной, в один клик ее не пройдешь случайно.

Терминальный путь для опытных - снять карантин руками, и тогда Gatekeeper к файлу не придерется:

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

$ sudo xattr -r -d com.apple.quarantine /Applications/SomeApp.app
Разбор. -d удаляет конкретный атрибут, -r делает это рекурсивно по всему дереву бандла (помним - .app это папка, карантин может висеть на вложенных файлах). После этого приложение запустится без предупреждения. Делай так только для софта, которому реально доверяешь - ты буквально вручную отключаешь проверку безопасности для этого файла. Полностью гасить Gatekeeper для всей системы (режим "из любого источника") в 2026 без необходимости не стоит: одна снятая метка на один доверенный файл безопаснее, чем открытая настежь система.

Где живут приложения и их данные

Чтобы чисто ставить и удалять, надо знать топологию. Приложения для всех пользователей лежат в /Applications. Приложения только для тебя - в ~/Applications (если папка есть). Системные программы Apple - в /System/Applications, и трогать их нельзя, том System защищен и смонтирован только для чтения.

Данные и настройки приложения разбросаны по библиотекам, и при удалении бандла они остаются:
  • ~/Library/Preferences - файлы настроек .plist, обычно по bundle ID (com.google.Chrome.plist)
  • ~/Library/Application Support - основные пользовательские данные приложения, профили, базы
  • ~/Library/Caches - кэши, их можно сносить смело
  • ~/Library/Containers - песочница для App Store и sandboxed-приложений, у каждого свой контейнер по bundle ID
  • /Library/LaunchDaemons и /Library/LaunchAgents - сюда .pkg часто кладет фоновые службы launchd
Вот почему "перетащил в Корзину" чистит только код, но не данные. Для полного сноса ищешь хвосты по bundle ID:

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

$ find ~/Library -iname "*chrome*" -maxdepth 3 2>/dev/null
/Users/you/Library/Application Support/Google/Chrome
/Users/you/Library/Caches/Google/Chrome
/Users/you/Library/Preferences/com.google.Chrome.plist
Помни про BSD-специфику find: тут флаг -maxdepth ставится строго до условий поиска, синтаксис отличается от GNU find на Linux, а stderr глушим через 2>/dev/null, чтобы не сыпались ошибки доступа.

Типичные грабли
  • Запуск .app прямо из окна .dmg. Программа работает "с образа", после извлечения исчезает. Всегда сначала копируй в /Applications.
  • Установка .pkg "куда-то не туда". -target / это том, а не каталог; реальные пути зашиты в пакете, их видно через pkgutil --files еще до установки.
  • Паника от "неустановленного разработчика". Это не вирус по умолчанию, а отсутствие нотаризации. Проверь источник, прогони spctl -a -vvv, реши осознанно.
  • Снятие карантина с чего попало через xattr -d. Ты вручную выключаешь защиту - делай только для доверенного.
  • Ожидание, что правый клик -> Открыть спасет. В Sequoia и Tahoe этого обхода нет, иди в Конфиденциальность и безопасность.
  • Удаление перетаскиванием "под ноль". Хвосты в ~/Library остаются; для .pkg остаются и receipts, и файлы в системных каталогах.
Мини-лаба

Возьми любое бесплатное нотаризованное приложение в .dmg (например iTerm2 или VLC) и пройди весь путь руками:
  • Скачай .dmg в ~/Downloads и примонтируй: hdiutil attach ~/Downloads/имя.dmg - запиши точку монтирования из вывода.
  • Загляни внутрь бандла: ls /Volumes/имя/ПриложениеApp/Contents и прочитай его bundle ID через defaults read .../Contents/Info CFBundleIdentifier.
  • Скопируй бандл в /Applications через cp -R, затем отмонтируй: hdiutil detach /Volumes/имя.
  • Проверь карантин и вердикт: xattr -l /Applications/ПриложениеApp и spctl -a -vvv /Applications/ПриложениеApp - сравни, что показал каждый.
  • Запусти двойным кликом. Если выскочило предупреждение - сходи в Системные настройки -> Конфиденциальность и безопасность и открой через "Открыть в любом случае".
  • Бонус: возьми любой .pkg и вскрой его pkgutil --expand в /tmp, найди папку Scripts и прочитай postinstall (если есть) - не устанавливая.
Контрольные вопросы
  • Чем .dmg принципиально отличается от .pkg по тому, что происходит с системой при их использовании?
  • Что физически представляет собой файл .app и почему его копируют с флагом -R?
  • Какой расширенный атрибут запускает проверку Gatekeeper и как посмотреть и снять его в терминале?
  • Почему в macOS Sequoia и Tahoe правый клик -> Открыть больше не открывает неподписанное приложение и каким стал штатный путь?
Итог

Три формата - три разных контракта. .app это папка-бандл, которую достаточно скопировать в /Applications. .dmg это образ-контейнер, его монтируешь через hdiutil, перетаскиваешь содержимое и отсоединяешь. .pkg это полноценный установщик с зашитыми путями и скриптами, поэтому требует доверия и осознанного запуска через installer -pkg -target /. Над всем этим стоит Gatekeeper, который по метке com.apple.quarantine решает, пускать ли скачанный код, а ты вердикт всегда можешь проверить через spctl и снять карантин через xattr - но только для того, чему реально доверяешь.
👍7 ❤️4 🔥 😄 🤔1
Аватара пользователя
esp32_geek
Сообщения: 1
Зарегистрирован: 20 май 2026, 04:06

Re: Установка приложений: .app, .dmg, .pkg и Gatekeeper

Сообщение esp32_geek »

Спасибо, наконец дошло почему программа пропадает после перезагрузки - я реально запускал из окна dmg и не копировал в Программы. Глупая ошибка
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
raspberryfan
Сообщения: 1
Зарегистрирован: 29 май 2026, 23:14

Re: Установка приложений: .app, .dmg, .pkg и Gatekeeper

Сообщение raspberryfan »

А есть способ массово снять карантин с папки скачанных утилит сразу, или только по одному файлу xattr гонять? У меня их штук двадцать собранных вручную
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Другие пакеты: MacPorts, mas, Nix и App Store
Следующая глава →
Управление приложениями и их данные

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

Поделиться темой: ✈ Telegram VK
  • Похожие темы
Похожие запросы: Установка и первый конфиг nginxnginx в DockerУстановка приложений на MacGit команды для начинающихБезопасность macOSНастройка Git: git config и .gitconfig

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

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

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