Файловая система и права: POSIX, ACL, атрибуты, флаги

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

Файловая система и права: POSIX, ACL, атрибуты, флаги

Сообщение 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 как у профи + куда расти
Ты скопировал скрипт, делаешь chmod +x, запускаешь - "Permission denied". Или скачал утилиту, а macOS орёт "повреждено, переместить в Корзину". Или хочешь удалить файл из /System и получаешь "Operation not permitted" даже под sudo. Всё это - не баги, а три РАЗНЫХ слоя контроля доступа, наложенных друг на друга. В Linux ты привык к одному слою POSIX-прав. В macOS их минимум четыре: POSIX, ACL, расширенные атрибуты (xattr) и флаги файлов (chflags), плюс сверху SIP, который не пускает даже root. Кто путает эти слои - тратит часы на "почему не работает chmod". Этот урок разбирает файловую систему macOS и каждый слой прав по механике: как устроено, почему так, где грабли.

Карта файловой системы macOS: где что лежит и почему

Начнём с того, что ты видишь как один диск "/", на самом деле два тома APFS, склеенных firmlink-ами. Со времён Catalina (10.15) система живёт на отдельном Signed System Volume (SSV) - read-only, криптографически запечатанном. Каждый байт системы покрыт деревом хешей, корневой хеш подписан Apple. Ты грузишься не с самого тома, а с его APFS-снапшота. Поэтому /System нельзя изменить в принципе - не "нет прав", а том примонтирован только на чтение и опечатан печатью (seal).

Рядом - твой Data-том (пользовательские данные, /Users, /Applications, /opt). Два тома сшиваются firmlink-ами: это особый механизм APFS (не симлинк и не bind-mount), который делает так, что /Users физически на Data-томе выглядит как обычная папка в корне read-only System-тома. Список firmlink-ов лежит в /usr/share/firmlinks.

Структура, которую надо знать как таблицу умножения:
  • /System - ОС, фреймворки, /System/Library. Read-only SSV, защищён SIP. Сюда не пишут, точка.
  • /Library - общесистемные ресурсы для ВСЕХ пользователей: шрифты, /Library/LaunchDaemons и /Library/LaunchAgents (службы), /Library/Preferences, конфиги. Сюда уже можно писать (с sudo).
  • /Users - домашние каталоги. /Users/Shared - общая папка.
  • /Applications - приложения для всех. ~/Applications - только для тебя.
  • /private - сюда симлинками ведут классические BSD-пути: /etc -> /private/etc, /var -> /private/var, /tmp -> /private/tmp. Проверь: ls -l /etc покажет стрелку на /private/etc. Это наследие BSD, корень-то занят системным томом.
  • /opt/homebrew - Homebrew на Apple Silicon (на старых Intel был /usr/local). Префикс вне SIP, поэтому brew ставит туда без sudo.
Отдельно - library mac, то есть ~/Library. Это нервный центр твоего профиля, в Finder он скрыт (открыть: Cmd+Shift+G и ввести ~/Library, либо chflags nohidden, об этом ниже). Что внутри:
  • ~/Library/Preferences - .plist с настройками приложений (с ними работает defaults из прошлых уроков).
  • ~/Library/Application Support - рабочие данные приложений (базы, профили).
  • ~/Library/Caches - кеши, можно сносить.
  • ~/Library/Containers - песочницы sandboxed-приложений (каждое видит только своё).
  • ~/Library/LaunchAgents - твои пользовательские службы launchd.
Изображение

POSIX-права: chmod mac, chown и почему этого мало

Базовый слой - классические права доступа mac в стиле Unix: три набора (владелец/группа/остальные) по три бита (rwx). Смотрим:

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

$ ls -l ~/Documents/report.txt
-rw-r--r--@  1 ivan  staff  10240 13 июн 14:02 report.txt
Разбор по символам. Первый - тип (- файл, d каталог, l симлинк). Дальше rw- (владелец ivan читает и пишет), r-- (группа staff читает), r-- (остальные читают). Группа staff - типичная основная группа обычного пользователя в macOS (у админов ещё admin). А вот символ @ в самом конце блока прав - это уже не POSIX, это маркер "у файла есть расширенные атрибуты". Запомни его, вернёмся.

Меняем права привычно:

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

chmod 640 report.txt        # rw-r----- числом
chmod u+x deploy.sh         # добавить флаг выполнения владельцу
chmod -R go-w ~/project     # рекурсивно снять запись у группы и остальных
chown ivan:staff report.txt # сменить владельца и группу (нужен sudo для чужих)
Грабли номер один для тех, кто пришёл из Linux: chmod в macOS - это BSD-вариант, не GNU. Нет --reference в том же виде, у chmod есть фирменный синтаксис +a для ACL (об этом ниже), а chmod -R на симлинке ведёт себя иначе. Команды ls, sed, find, chmod здесь от BSD - флаги местами другие, чем в Linux. Например ls -l показывает дату в локали, а find требует путь первым аргументом строго.

Почему POSIX мало? Три набора прав не выражают "Ане можно читать, Боре писать, а группе дизайнеров - только смотреть". Для этого есть второй слой.

ACL: тонкие права через chmod +a и ls -le

ACL (списки контроля доступа) дают точечные разрешения конкретным пользователям и группам поверх POSIX. macOS использует ACL в стиле NFSv4 - богаче, чем rwx. Смотреть их обычным ls -l нельзя, нужен флаг -e:

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

$ ls -le report.txt
-rw-r--r--+ 1 ivan  staff  10240 13 июн 14:02 report.txt
 0: user:anna allow read,write
 1: group:designers deny write
Заметил + после прав (вместо @)? Плюс = на файле висит ACL. Каждая строка - ACE (запись), пронумерована. Порядок ВАЖЕН: ACE проверяются сверху вниз, первое совпадение решает. Поэтому deny надо ставить раньше allow, если хочешь явный запрет.

Добавляем и снимаем правила синтаксисом chmod +a:

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

chmod +a "anna allow read,write" report.txt     # дать Анне чтение и запись
chmod +a "designers deny write" report.txt      # запретить группе запись
chmod -a "anna allow read,write" report.txt      # снять конкретную ACE
chmod -a# 0 report.txt                            # снять ACE по номеру (нулевую)
chmod -N report.txt                               # снести ВСЕ ACL с файла
Права в ACL гранулярнее rwx: read, write, append, delete, readattr, writeattr, readextattr, writeextattr, readsecurity, writesecurity, chown, и для каталогов - list, search, add_file, add_subdirectory, delete_child. Реальный сценарий безопасности: запретить кому угодно менять расширенные атрибуты файла -

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

chmod +a "everyone deny writeextattr" config.plist
Грабля: ACL НЕ переживают наивное копирование. cp по умолчанию атрибуты и ACL не тащит - нужен cp -p (а лучше ditto или rsync -E). Многие бэкап-утилиты теряют ACL и флаги - проверяй, что твой инструмент их сохраняет, иначе восстановишь файлы с дырявыми правами.

xattr: расширенные атрибуты и карантин com.apple.quarantine

Третий слой - xattr, метаданные, пришитые к файлу сбоку от его содержимого. Тот самый @ в ls -l. Смотрим, что висит:

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

$ xattr -l ~/Downloads/tool.dmg
com.apple.quarantine: 0083;6650a1b2;Safari;1A2B3C4D-...
com.apple.metadata:kMDItemWhereFroms: ...
Самый важный для админа - com.apple.quarantine. Браузеры, почта, мессенджеры, и даже распаковка zip/tar навешивают этот атрибут на скачанное. Gatekeeper при первом запуске видит quarantine и устраивает проверку подписи и нотаризации - отсюда окна "приложение загружено из интернета" и страшное "повреждено, переместить в Корзину" для неподписанных бинарников. Поле в значении - флаги, timestamp, имя агента-скачавшего и UUID события.

Снять карантин (когда ты доверяешь источнику и понимаешь, что делаешь):

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

xattr -d com.apple.quarantine ~/Downloads/tool.app        # снять один атрибут
xattr -dr com.apple.quarantine ~/Downloads/MyApp.app      # рекурсивно по бандлу
xattr -cr ~/Downloads/MyApp.app                           # снести ВСЕ xattr рекурсивно
Флаг -r рекурсивный, -d удаляет конкретный атрибут, -c чистит все. Для системных путей понадобится sudo. Предупреждение по безопасности: снимая карантин руками, ты отключаешь проверку Gatekeeper для этого файла - делай так только с тем, чьему происхождению доверяешь.

Что ещё прячется в xattr: resource forks (com.apple.ResourceFork) - наследие классической Mac OS, где у файла была "вилка ресурсов"; сейчас редко, но встречается. com.apple.FinderInfo, метки Finder (теги), kMDItemWhereFroms (откуда скачано), com.apple.macl (привязка приватности TCC). Когда копируешь файлы на не-APFS (FAT32, сетевые шары), xattr и resource fork выгружаются в файлы-спутники с префиксом ._ - те самые надоедливые ._filename. Утилита dot_clean их схлопывает обратно.

Флаги файлов chflags, симлинки и SIP

Четвёртый слой - флаги файлов через chflags, фишка BSD/macOS, которой в обычном Linux нет. Это не права доступа, а свойства поведения. Видны через ls с заглавной O:

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

$ ls -lO important.txt
-rw-r--r--  1 ivan  staff  uchg  4096 13 июн important.txt
Слово uchg в выводе - флаг user immutable. Ключевые флаги:
  • hidden - скрыть из Finder (но не из ls). Так Apple прячет ~/Library. chflags nohidden ~/Library её показывает.
  • uchg (uchange/uimmutable) - запрет любых изменений; снять может владелец или админ через nouchg. Удобно "залочить" важный файл от случайной правки.
  • schg - системный immutable; снять можно только в single-user mode, жёстче uchg.
  • uappnd - только дописывание (для логов).
  • restricted - помечает путь как защищённый SIP. Именно этот флаг (вместе с com.apple.rootless xattr) делает каталог неприкасаемым даже для root.

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

chflags uchg important.txt      # залочить файл
chflags nouchg important.txt    # разлочить
chflags hidden secret_dir       # спрятать из Finder
chflags nohidden ~/Library      # показать Библиотеку
Грабля: пытаешься rm файл с uchg - "Operation not permitted", хотя права rw есть. Снимай флаг сначала. И ещё: chflags -R по каталогу не всегда то, что ждёшь - immutable на каталоге запрещает менять сам каталог (создавать/удалять записи), но не содержимое файлов внутри.

Симлинки, алиасы и firmlinks - не путай три разных зверя:
  • Симлинк (ln -s) - файловая ссылка по пути, как в Unix. Ломается, если цель переименовали. Работает в терминале.
  • Алиас Finder - объект уровня GUI, хранит inode цели и умеет находить её после переезда/переименования. В терминале как обычная ссылка НЕ работает.
  • Firmlink - системный механизм APFS, сшивающий System и Data тома (см. начало урока). Ты их не создаёшь руками.
Венчает всё SIP (System Integrity Protection) - над всеми четырьмя слоями. Даже root не запишет в /System и защищённые части /usr, /bin, /sbin. Проверка:

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

$ csrutil status
System Integrity Protection status: enabled.
Поэтому "sudo всемогущ" в macOS - миф: sudo даёт права root, но SIP стоит выше root. Отключают SIP только из Recovery (csrutil disable) и почти никогда не нужно. Если файл в файловой системе macos не удаляется под sudo - сначала проверь csrutil status и ls -lO на флаг restricted, а не зли систему.

Мини-лаба: пощупать все четыре слоя руками

Безопасно, в своём домашнем каталоге:

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

cd ~/Desktop && mkdir lab && cd lab
echo "secret" > file.txt

# 1) POSIX
ls -l file.txt
chmod 600 file.txt && ls -l file.txt      # стало rw-------

# 2) ACL
chmod +a "$(whoami) allow read,write" file.txt
ls -le file.txt                            # появился + и строка ACE
chmod -N file.txt                          # снесли ACL, + пропал

# 3) xattr (имитируем карантин)
xattr -w com.apple.quarantine "test" file.txt
ls -l file.txt                             # появился @
xattr -l file.txt
xattr -d com.apple.quarantine file.txt     # сняли, @ пропал

# 4) флаги
chflags uchg file.txt
ls -lO file.txt                            # видно uchg
rm file.txt                                # Operation not permitted!
chflags nouchg file.txt && rm file.txt     # теперь удалится
cd .. && rmdir lab
Прогони и проследи, как меняются маркеры @ и + и слово uchg - так слои перестанут быть абстракцией.

Контрольные вопросы
  • Чем отличается символ @ от символа + в выводе ls -l, и какой командой смотреть каждый из них?
  • Почему файл с правами rw-r--r-- не удаляется даже владельцем, и как это исправить одной командой?
  • Что такое com.apple.quarantine, кто его навешивает и чем рискуешь, снимая его вручную?
  • Почему sudo rm не работает в /System, и какой командой проверить причину?
Итог
Права в macOS - это стек: POSIX (грубо), ACL (точечно, ls -le / chmod +a), xattr (метаданные и карантин, ls -l @, xattr), флаги (поведение, ls -lO / chflags) и поверх всего SIP. Когда что-то "не пускает", не долби chmod - определи СЛОЙ: проверь +, @, uchg и csrutil. Знаешь карту /System, /Library, ~/Library и четыре слоя прав - и загадочные "permission denied" превращаются в понятную диагностику за тридцать секунд.
👍 ❤️4 🔥1 😄 🤔
Аватара пользователя
cuda_user
Сообщения: 1
Зарегистрирован: 15 май 2026, 02:06

Re: Файловая система и права: POSIX, ACL, атрибуты, флаги

Сообщение cuda_user »

Блин, вот этот @ против + в ls я годами путал и думал это одно и то же. Спасибо, дошло наконец.
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
zigadmin
Сообщения: 1
Зарегистрирован: 20 май 2026, 21:08

Re: Файловая система и права: POSIX, ACL, атрибуты, флаги

Сообщение zigadmin »

А quarantine с распакованного zip реально вешается на КАЖДЫЙ файл внутри? Проверил xattr -lr - да, везде висит. xattr -cr спас, теперь brew-сборка не ругается.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Настройка zsh: .zshrc, prompt, плагины
Следующая глава →
Homebrew: пакетный менеджер для macOS

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

Поделиться темой: ✈ Telegram VK
Похожие запросы: .gitignore: как игнорировать файлыGit LFS: большие файлы в репозиторииФайловая система APFS

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

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

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