У нас возникли проблемы после обновления наших клиентов с Ubuntu 12.04 до Ubuntu 14.04.
Поведение:
На клиенте A я изменяю существующий файл foo на общей папке nfs. На клиенте B я делаю cat foo.
1-й раз после монтажа работает. cat показывает содержимое foo. Но если я снова изменю foo на клиенте A и сделаю cat на B, я получу ошибку: cat: foo: Нет такого файла или каталога
Делая ls
на B решает проблему и cat foo
снова работает, показывая новый контент. Но если я снова изменю foo на клиенте A, кот на клиенте B не будет работать.
Анализ:
Если программа на B сначала выполняет системный вызов stat, все работает. Но если такая программа, как cat, напрямую использует системный вызов open, она не найдет файл!
С помощью tcpdump и wirehark я могу видеть, что Ubuntu 12.04 вызывает пакет NFS под «PUTFH» с использованием правильного (обновленного) дескриптора файла, но в 14.04 дескриптор файла неправильный (равен старому дескриптору файла до изменения в системе A).
Теперь очень интересная часть: если мой общий ресурс nfs на сайте сервера находится в файловой системе ext4, и я делюсь им через / etc / exports, сервер nfs отвечает кодом ошибки NFS4ERR_STALE. Клиент (B) выполнит второй запрос с правильным дескриптором файла, и все будет работать нормально. Даже 14.04.
Если мой общий ресурс nfs на сайте сервера находится в файловой системе ZFS (ZoL 0.6.4.1, CentOS 7 и Ubuntu 14.04) и я делюсь им с помощью параметра sharefs или / etx / exports, сервер nfs отвечает кодом ошибки NFS4ERR_NOENT. Клиент потерпит неудачу.
Вопросы: 1. Как мне заставить новые клиенты (14.04+) правильно обновлять дескриптор файла, как в 12.04 2. (Альтернативно) Как я могу заставить сервер отвечать с помощью NFS4ERR_STALE в файловой системе ZFS? Или как должен выглядеть ответ сервера согласно спецификации?
С уважением, Йорг
пропатчен в ZFS в Linux:
https://github.com/zfsonlinux/zfs/pull/3404
получите версию git и скомпилируйте ее:
git clone https://github.com/zfsonlinux/zfs.git