Значение маски не отображается в GETFACL с использованием webhdfs

В Hadoop я включил авторизацию. Я установил несколько acl для каталога.

Когда я выполняю команду getfacl в бине hadoop, я вижу в ней значение маски.

hadoop fs -getfacl /Kumar

# file: /Kumar
# owner: Kumar
# group: Hadoop
user::rwx
user:Babu:rwx
group::r-x
mask::rwx
other::r-x

Если я запускаю ту же команду, используя webhdfs, значение маски не отображается.

http://localhost:50070/webhdfs/v1/Kumar?op=GETACLSTATUS

{
  "AclStatus": {
    "entries": [
      "user:Babu:rwx",
      "group::r-x"
    ],
    "group": "Hadoop",
    "owner": "Kumar",
    "permission": "775",
    "stickyBit": false
  }
}

По какой причине значение маски не отображается в webhdfs для команды GETFACL.

Помогите мне разобраться.


person Kumar    schedule 24.05.2016    source источник


Ответы (1)


HDFS реализует модель POSIX ACL. Связанная документация объясняет, что запись маски сохраняется в битах разрешения группы классической модели разрешений POSIX. Это сделано для поддержки требований POSIX ACL, а также для поддержки обратной совместимости с существующими инструментами, такими как chmod, которые не знают о расширенных записях ACL. Цитируя этот документ:

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

Эта проблема решается за счет записи по маске. При использовании минимальных списков ACL разрешения класса группы сопоставляются с разрешениями записи группы-владельца. В расширенных ACL разрешения класса группы сопоставляются с разрешениями записи маски, тогда как запись группы-владельца по-прежнему определяет разрешения группы-владельца.

...

Когда приложение изменяет права владельца, группы или другого класса (например, с помощью команды chmod), соответствующая запись ACL также изменяется. Аналогичным образом, когда приложение изменяет разрешения записи ACL, которая соответствует одному из пользовательских классов, разрешения класса изменяются.

Это относится к вашему вопросу, поскольку означает, что маска на самом деле не сохраняется как расширенная запись ACL. Вместо этого он находится в битах разрешения. При запросе WebHDFS вы сделали «необработанный» вызов API для получения информации о ACL. При запуске getfacl вы запустили приложение, которое накладывает дополнительную логику отображения поверх этого вызова API. getfacl знает, что для файла с ACL биты разрешения группы интерпретируются как маска, и поэтому отображается соответствующим образом.

Это не относится к WebHDFS. Если бы приложение вызывало getAclStatus через RPC-протокол NameNode, оно увидело бы эквивалент ответа WebHDFS. Кроме того, если бы вы использовали команду getfacl для URI webhdfs://, эта команда по-прежнему отображала бы маску, потому что приложение знает, как применять эту логику независимо от реализации файловой системы.

person Chris Nauroth    schedule 24.05.2016