• В файловых системах ext2, ext3 и ext4 общее количество ACL-списков для файла регулируется требованием того, чтобы байты для всех имен и значений расширенных атрибутов файла помещались внутри одного логического блока диска (см. раздел 16.2). Каждой записи ACL-списка необходимо 8 байт, и поэтому максимальное количество записей списка для файла чуть меньше восьмой части размера блока (поскольку дополнительно затрачивается пространство для хранения имени расширенного атрибута ACL-списка). Так, при 4096-байтовом размере блока максимально допустимое количество записей ACL-списка — около 500. (Ядра версий до 2.6.11 накладывали для файловых систем ext2 и ext3 произвольно установленное ограничение — 32 записи.)

• В файловой системе XFS ACL-список ограничен 25 записями.

• В файловых системах Reiserfs и JFS списки ACL могут содержать до 8191 записи. Этот предел является следствием ограничения размера (64 Кбайт), налагаемого виртуальной файловой системой на значение расширенного атрибута (см. раздел 16.2).

На момент написания книги файловая система Btrfs ограничивает размер списков ACL приблизительно 500 записями. Тем не менее, поскольку данная система пока еще находится в активной разработке, это значение может измениться.

Хотя большинство рассмотренных выше файловых систем допускает создание большого количества записей в списке ACL, этого следует избегать по следующим причинам:

• обслуживание длинных ACL-списков становится сложной задачей системного администрирования, которая потенциально может приводить к ошибкам;

• количество времени, необходимого для сканирования ACL-списка в поисках соответствующей записи (или нескольких записей в случае проверки идентификатора группы), линейно пропорционально количеству записей ACL-списка.

Как правило, можно довести количество записей ACL-списка до разумного предела, определив подходящие группы в системном файле группы (см. раздел 8.3) и применив такие группы внутри ACL-списка.

17.8. API для ACL-списков

Предварительный стандарт POSIX.1e определял большой набор функций и структур данных для работы с ACL-списками. Поскольку их очень много, невозможно подробно описать все эти функции в одной книге. Мы рассмотрим, где они применяются, а завершит главу пример программы.

Программы, которые используют API для ACL-списков, должны включать файл . Может также потребоваться включение файла , если программа задействует различные Linux-расширения предварительного стандарта POSIX.1e. (Перечень таких расширений приведен на странице acl(5) руководства.) Программы, применяющие API, следует компилировать с параметром — lacl, чтобы выполнить привязку к библиотеке libacl.

Как уже отмечалось, в Linux ACL-списки реализованы с помощью расширенных атрибутов, а интерфейс API для этих списков реализован в виде набора библиотечных функций. Эти функции оперируют структурами данных в пространстве пользователя и, если необходимо, совершают вызовы getxattr() и setxattr(), чтобы извлечь и изменить дисковый расширенный атрибут system, хранящий представление списка ACL. Возможно также (но не рекомендуется) использование приложением вызовов getxattr() и setxattr() для работы с ACL-списками напрямую.

Обзор

Функции, которые образуют API для ACL-списков, перечислены на странице acl(5) руководства. На первый взгляд это изобилие функций и структур данных может вызвать недоумение. На рис. 17.2 проиллюстрированы взаимосвязи между разными структурами данных, а также указаны варианты применения многих функций для работы с ACL-списками.

Рис. 17.2. Взаимосвязь между библиотечными ACL-функциями и структурами данных

Из рис. 17.2 видно, что API для ACL-списка рассматривает такой список как объект с иерархией:

• ACL-список состоит из одной или из нескольких ACL-записей;

• каждая ACL-запись состоит из типа тега, необязательного тега-спецификатора и набора прав доступа.

Сейчас мы бегло рассмотрим различные ACL-функции. В большинстве случаев мы не описываем ошибки, которые возвращает каждая функция. Функции, возвращающие целочисленное значение (status), как правило, возвращают 0 при успешном выполнении и –1 в случае ошибки. Функции, возвращающие описатель (указатель), в случае ошибки возвращают NULL. Ошибки можно проанализировать обычным образом, используя значение errno.

Описатель — это абстрактный термин для обозначения какого-либо способа, примененного для соотнесения с объектом или со структурой данных. Представление описателя зависит от реализации API. Он может быть, например, указателем, индексом массива или хеш-ключом.

Извлечение ACL-списка из файла в память

Перейти на страницу:

Похожие книги