Почему обычный пользователь не может видеть NFS-ресурсы с помощью df?

Вопрос или проблема

Вопрос: где это официально задокументировано?

Не могу найти это, например: https://linux.die.net/man/1/df

У меня есть подозрение, что это связано с тем, что у пользователя нет разрешений уровня UNIX для этих расшаренных ресурсов.

user@sles:~> df -h|grep -i foobar
user@sles:~> sudo df -h|grep -i foobar
1.2.3.4:/foobar  110G   40M  110G   1% /root/foobar
1.2.3.4:/foobar2  180G  106G   75G  59% /root/foobar2
user@sles:~>

Но это может сбивать с толку людей, которые просто хотят увидеть ВСЕ смонтированные ресурсы без прав root.

Это не только NFS.

Работа команды df заключается в том, что ей необходимо выполнить системный вызов stat(2) для каждой точки монтирования, чтобы получить ее детали. Если у пользователя нет доступа к директории, содержащей точку монтирования, stat не работает. В вашем случае /root не имеет исполняемого бита для других, поэтому обычные пользователи не могут выполнить stat для любой директории, находящейся внутри /root.

$ df /root/foobar
df: /root/foobat: Доступ запрещен

$ ls /root/foobar
ls: cannot access '/root/foobar': Доступ запрещен

Вы сможете увидеть все монтирования как пользователь, выполнив команду mount, или если хотите увидеть только NFS монтирования, выполните mount -t nfs. Команда mount показывает только те монтирования, которые она находит в /proc/self/mountinfo, не выполняя stat для каждой точки монтирования, как это делает df.

Ответ или решение

Причина, по которой обычный пользователь не может увидеть NFS-ресурсы с помощью команды df, заключается в механизме работы этой команды, который требует наличия определённых разрешений на доступ к директориям, содержащим точки монтирования. Чтобы объяснить это более подробно, рассмотрим следующий аспект.

Команда df использует системный вызов stat(2) для получения информации о файловых системах, которые монтированы на системе. Если у пользователя нет прав доступа к директории, где находится точка монтирования, вызов stat не выполнится, и, соответственно, информация о данной файловой системе не будет доступна.

В вашем случае, как видно из примера:

user@sles:~> df -h|grep -i foobar
user@sles:~> sudo df -h|grep -i foobar
1.2.3.4:/foobar  110G   40M  110G   1% /root/foobar
1.2.3.4:/foobar2  180G  106G   75G  59% /root/foobar2
user@sles:~>

Обычный пользователь не может получить доступ к директории /root, так как у неё нет разрешения на выполнение для остальных пользователей. Это приводит к ситуации, в которой команда df не может получить информацию об NFS-ресурсах, монтированных в директории /root.

Однако вы можете использовать команду mount, которая не требует выполнения stat для каждой точки монтирования. Она читает информацию о всех монтированных файловых системах из /proc/self/mountinfo, что позволяет обычным пользователям видеть все монтированные ресурсы. Для отображения только NFS-ресурсов вы можете использовать следующую команду:

mount -t nfs

Эта команда корректно покажет все монтированные NFS-файловые системы, даже если у вас нет разрешений на доступ к их точкам монтирования.

Что касается документации, данное поведение не всегда явно описано в мануалах. Однако, принцип, согласно которому df требует прав доступа к директориям для работы, можно найти в общем описании работы системных вызовов и их использования. В качестве альтернативы, рекомендуется обращаться к документации или мануалам для понимания специфики команд Linux.

Надеюсь, это разъяснение поможет вам лучше понять поведение команды df и ограничения, наложенные правами доступа в UNIX-системах.

Оцените материал
Добавить комментарий

Капча загружается...