Вопрос или проблема
Вопрос: где это официально задокументировано?
Не могу найти это, например: 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-системах.