У меня есть сервер хранения Windows 2008, настроенный для службы NFS. Я использую клиент FreeBSD для монтирования общего ресурса с сервера хранения. Все работает нормально, например, копирование, удаление файлов и т. Д. Однако, когда я запускаю find
на моем клиенте FreeBSD для некоторого каталога внутри смонтированной файловой системы, команда не может вывести список файлов рекурсивно. В нем перечислены непосредственные дочерние файлы и каталоги. Файлы внутри подкаталога не отображаются.
Кто-нибудь может помочь, в чем может быть проблема?
Я видел почти то же самое в Linux и покопался в исходном коде Findutils. Похоже, что в Windows Server 2008 может быть ошибка, когда d_type
поле (struct dirent*)
вернулся readdir()
на клиенте NFS - 8 (DT_REG, неверно) вместо 4 (DT_DIR, ожидалось). Неудивительно, что find не выполняет рекурсию в поддереве таких каталогов.
Если вы хотите проверить это самостоятельно, вы можете скачать исходники findutils-4.4.2. Измените строку gnulib / lib / fts.c 1136
if (sp->fts_compar == NULL || ISSET(FTS_DEFER_STAT)) {
к
if (0 && sp->fts_compar == NULL || ISSET(FTS_DEFER_STAT)) {
и восстановить найти. После этого изменения find вернул все ожидаемые каталоги, по крайней мере, для тех случаев, которые я пробовал. Я не знаю, будет ли это полное исправление, которое гарантированно будет работать во всех случаях.
Я еще не знаю, знает ли Microsoft об этом и есть ли исправление, и было ли оно исправлено в Windows Server 2008 R2.
IIUC NFS-сервер Windows, по крайней мере, раньше был скорее «функцией флажка», чем чем-то полезным для реальной работы. Однако не знаю, изменилось ли что-нибудь в w2k8.
Возможно, вам повезет с монтированием через CIFS, если у FreeBSD есть клиент CIFS?