Как получить дескриптор файла NFS?

Я пытаюсь протестировать несколько тысяч экспортов файловых серверов NFSv3 на сотни серверов. Многое может пойти не так, от конфигурации сервера до подключения к сети. Самый полный тест, который я могу сделать, это попытаться смонтировать его на клиенте.

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

Вместо этого я надеялся написать что-то более легкое, которое просто действовало бы как клиент NFS и смотрело бы, успешно ли вызов NFS MOUNT вернул дескриптор файла. Если это так, мой сервер работает, и мой клиент авторизован. Но я не нашел простого кода для этого.

Когда я смотрю на Исходный код Linux, он выглядит так: по крайней мере, часть кода связана с тем, что это модуль Linux, что сбивает с толку.

Есть ли какой-то код пользовательского пространства, который просто запрашивает дескриптор файла NFS через вызов монтирования, который я мог бы удалить? (Или есть какая-то причина, по которой моя идея не сработает)? Это все AUTH_SYS, поэтому мне не нужно получать билеты kerberos или что-то еще.


person BowlOfRed    schedule 21.02.2017    source источник


Ответы (2)


Не зная больше, я сделаю несколько предположений, основываясь на своих знаниях о файловых системах NFS/Linux.

Я предполагаю, что ваш клиент - Linux (но та же логика может применяться к окнам, если у него присутствует клиент nfs).

Похоже, когда вы выполняете монтирование, вы достигаете точки, когда ресурсы потребляются до такой степени, что клиент не может больше монтировать монтирования nfs. Имеет смысл, так как при перезагрузке он снова начинает работать, а перезагрузка отбрасывает монтирование nfs (при условии, что вы монтируете явно / программно), что позволяет снова выполнить монтирование. Бьюсь об заклад, вы просто монтируете монтирование nfs и никогда не размонтируете их. Поэтому я бы предложил следующее:

  1. устанавливать
  2. получить доступ к файлу или каталогу в только что смонтированной файловой системе nfs
  3. размонтировать файловую систему nfs
person Jimd    schedule 21.02.2017
comment
Нет, для этого я каждый раз пытаюсь размонтировать, но этого не всегда достаточно, чтобы предотвратить проблемы. Вот почему я хочу написать легкий клиент NFS. - person BowlOfRed; 21.02.2017
comment
Даже если вы напишете клиент, файловая система nfs должна быть смонтирована для его выполнения. Конечно, вы, вероятно, знаете об этом. - person Jimd; 22.02.2017
comment
Если все, что вам нужно сделать, это получить дескриптор файла (я предполагаю, что вы имеете в виду дескриптор файла), я не уверен насчет окон, с Linux или любым другим вариантом Unix, вы просто используете системный вызов open(), есть этот объект в файловой системе называется vnode, который указывает либо на реальную, либо на виртуальную файловую систему (nfs — это виртуальная файловая система). Для этого нет необходимости копаться в ядре или использовать RPC-клиент NFS. Теперь ваш пробег может варьироваться, поскольку вы находитесь на Windoz, а ms имеет тенденцию делать все по-своему и часто не соответствует стандартам / спецификациям, и я говорю об этом по своему опыту. - person Jimd; 22.02.2017
comment
Я не понимаю, почему клиент NFS, который запрашивает дескриптор файла, должен что-то с ним делать (например, передавать его драйверу файловой системы). Я планирую просто отказаться от него после получения. Вся моя текущая работа связана с Linux. - person BowlOfRed; 22.02.2017
comment
Вау, это была грубая ошибка в моем комментарии. Я понятия не имею, почему я набрал окна в предыдущем комментарии. Я удалил это. Это все линукс. - person BowlOfRed; 22.02.2017
comment
хорошо, тогда все, что вам нужно сделать, это открыть системный вызов, не имеет значения, является ли файл локальным монтированием или удаленным монтированием nfs, если он может получить доступ к файлу, он вернет файловый дескриптор, иначе вернет ошибку с кодом ошибки в ошибочной переменной - person Jimd; 22.02.2017
comment
Конечно, это возможный способ сделать это. Я стараюсь избегать любых файловых дескрипторов/открытий или каких-либо отношений с ядром. Мне просто нужен вызов NFS в пользовательском пространстве. Нет открытых файлов, нет монтирования. - person BowlOfRed; 22.02.2017

хорошо, тогда просто получите файлы определения протокола rpc для версии nfs, которую вы используете, возможно версии 3 или 4, запустите их через компилятор протокола rpcget xdr, вы получите клиентские функции в c, которые вы можете скомпилировать, чтобы вы могли делать вызовы сервер с. Но они будут выполнять несколько системных системных вызовов, без которых невозможно выполнить сетевое взаимодействие linux, и оно будет проходить через стек tcp/ip (вы, вероятно, будете использовать udp) в ядре linux. Вы, вероятно, можете найти файлы определения протокола nfs на веб-сайте SUN/Oracle, или вы можете найти их в исходном коде для дистрибутива Linux — вы будете делать вызовы прикладного уровня, но клиент вызывает библиотечные функции rpc, которые, в свою очередь, будут вызывать системные вызовы linux, которые идут в ядро

person Jimd    schedule 22.02.2017