Кратко
- В NFS путь нужен для поиска, а последующие операции получают непрозрачный файловый дескриптор от сервера. Клиент хранит и возвращает байты, но не имеет права считать их inode, адресом на диске или глобальным идентификатором.
- NFSv4 разделил дескрипторы на постоянные и временные. Постоянный сохраняется в течение жизни объекта через перезапуск и миграцию; временный может истечь при условиях, раскрытых сервером.
NFS4ERR_STALEсообщает, что ожидаемый объект удалён или недоступен.NFS4ERR_FHEXPIREDможет означать лишь утрату временной ссылки при сохранившемся объекте. Восстановление заново проходит пространство имён и проверяет результат.
Опасность повторно занятой ячейки
Серверная таблица может использовать одну ячейку сначала для одного файла, затем для другого. Если старый клиентский дескриптор после повторного использования попадёт к новому объекту без видимой границы, операция будет формально успешной и семантически неверной. Открытый отказ безопаснее такого успеха.
Первый дизайн NFS уже создавал непрозрачную границу. RFC 1094 в 1989 году задал для NFSv2 фиксированный 32-байтовый fhandle. Клиент получал начальную ссылку через отдельный протокол MOUNT, передавал LOOKUP дескриптор каталога и один компонент имени, а затем использовал возвращённую ссылку в GETATTR, READ и WRITE.
Непрозрачность не означала шифрование или секрет. Она означала отсутствие договорной структуры для клиента. Сервер мог кодировать номер устройства, inode или позицию во внутренней таблице, но совместимый клиент не мог извлекать эти поля и строить на них логику.
RFC 1813 сделал nfs_fh3 в NFSv3 переменной длины. Сервер помещал туда сведения, необходимые ему для различения файла. Дескрипторы возвращали LOOKUP, CREATE, LINK, READDIRPLUS и другие операции. Внутреннее представление могло развиваться, не превращаясь в общую зависимость всех клиентов.
Равенство не имеет полной обратной силы
Два равных дескриптора от одного сервера обозначают один файл. Но разные дескрипторы не обязательно обозначают разные файлы. Стандарт не требует взаимно однозначного соответствия между объектом и байтовым значением.
Поэтому RFC 1813 разрешает сравнение как оптимизацию, но не как основание корректности. NFSv4 сохраняет ограничение. Два жёстких имени одного файла должны давать один дескриптор, однако каждое неравенство нельзя превращать в доказательство иной идентичности. Тем более значения разных серверов не становятся универсальными хешами.
Кэш вправе не дублировать работу, когда видит равенство. Он не вправе решать по неравенству, что две операции никогда не затронут один объект. Авторитетная карта остаётся у сервера.
Постоянство стало заявленным свойством
RFC 3010 для NFSv4 ввёл постоянные и временные файловые дескрипторы. RFC 7530 и RFC 8881 продолжили эту модель.
Постоянный дескриптор остаётся фиксированным в течение жизни объекта. Перезапуск сервера его не отменяет. Миграция объекта также должна сохранять ссылочную непрерывность. Хранилище может перемещаться, а клиенту не требуется понимать новое внутреннее расположение.
Постоянный не значит бессмертный. После удаления объекта или недоступности его файловой системы сервер отвечает NFS4ERR_STALE. Главное обещание состоит в том, что старое значение не станет молча обозначать новый файл на повторно использованном месте.
Не всякая среда способна выдержать такой инвариант. Иерархическое хранение, ограничения ОС, миграция или таблица, исчезающая при загрузке, создают условную ссылку. NFSv4 допускает временные дескрипторы и требует через fh_expire_type сообщать обстоятельства их истечения.
В RFC приведён пример: время запуска, номер ячейки и поколение. Когда ячейку используют снова, старое поколение не совпадает. Это иллюстрация, а не обязательный формат. Стандарт закрепляет наблюдаемое поведение, оставляя устройство таблицы серверу.
STALE и FHEXPIRED сохраняют разные факты
NFS4ERR_STALE означает, что ссылка больше не достигает ожидаемого объекта. Файл удалён либо файловая система постоянной ссылки недоступна.
NFS4ERR_FHEXPIRED относится к непрерывности временного дескриптора. При перезапуске могла исчезнуть таблица, могло смениться поколение или миграция вышла за пределы гарантии. Сам файл при этом способен существовать. Сервер отказывается от старых байтов, не утверждая удаления.
Если свести оба результата к «файл отсутствует», потеря ссылки превратится в ложное сообщение о потере данных. Если считать оба кратковременной ошибкой, клиент будет бесконечно искать удалённый объект. Протокол не устраняет неизвестность; он не даёт нижнему уровню выдать догадку за факт.
Новый обход — это новое наблюдение
В NFSv4 специальные корневые дескрипторы и операции пространства имён дают точку восстановления. PUTROOTFH выбирает корень, последовательность LOOKUP проходит компоненты. Сохранив имена, клиент может после истечения получить новую ссылку.
Но за это время файл могли переименовать, удалить или заменить объектом с прежним именем. Повторный путь ведёт к исходному файлу, к замене или в пустоту. Следовательно, нужно заново проверять атрибуты, блокировки, кэшированное состояние и намерение незавершённой операции.
Разрешение доступа образует ещё одну независимую связь. Валидный дескриптор не даёт права читать или писать. Сервер проверяет каждую операцию. Успешное повторное разрешение имени не возобновляет прежнюю блокировку и не доказывает безопасность повтора прерванной записи.
Историческая ценность файлового дескриптора NFS не в универсальности, а в ограничении смысла. Сервер выбирает внутреннюю карту и объявляет её непрерывность. Протокол задаёт минимальные общие правила: непрозрачность, узкую семантику равенства, классы срока и явный отказ. Клиент хранит имена для восстановления и не подменяет утраченное доказательство догадкой.
Путь может измениться при сохранившемся объекте. Объект может сохраниться при истёкшем дескрипторе. Дескриптор может быть действителен при запрещённой операции. Надёжность появляется из разделения этих утверждений.
Источники
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров
