Кратко
- В 9P2000 Twalk связывает свободный newfid с результатом лишь после успешного прохода всех элементов имени. Частичный Rwalk может вернуть qid разрешённого префикса, но не меняет ни один fid.
- Topen — отдельный запрос: он задаёт режим доступа, запускает проверку разрешений и готовит fid к последующим чтению или записи. Ropen не доказывает, что передача данных состоялась.
- Вклад Роба Пайка нужно описывать в коллективной истории: Кен Томпсон начал протокол, Пайк интегрировал систему имён, Дэйв Пресотто создал сетевую часть, а статьи и поздние диалекты имеют собственных соавторов.
На панели файлового шлюза загорается «путь найден», а следом появляется отказ в открытии. Если оба сообщения считать одним статусом доступности, журнал выглядит противоречиво. Для 9P это две нормальные проверки, между которыми могли измениться режим, права или объект.
Twalk отправляет действующий fid, новый newfid и упорядоченный список имён. Новый идентификатор должен быть свободен, если клиент намеренно не использует тот же номер, что у исходного fid. Сервер проходит элементы по одному и проверяет право поиска в каждом каталоге. Когда успешна вся последовательность, Rwalk возвращает qid каждого элемента, а newfid начинает представлять результат.
Это точное подтверждение: на данном сервере, в данном соединении, от указанного fid имена разрешились в таком порядке. Открытие в него не входит. Введение в 9P называет fid выбранным клиентом 32-битным идентификатором текущего файла, открытого или нет; пространство fid общее для соединения. Повторное согласование версии переинициализирует сеанс и прерывает незавершённый ввод-вывод. Значит, fid — локальная ссылка, а не вечный универсальный ключ.
Частичный ответ подчёркивает ограничение. Ошибка на первом элементе даёт Rerror. При более поздней ошибке Rwalk может перечислить qid успешного префикса. Однако 9P2000 не меняет исходный fid и newfid, пока не пройдены все элементы. Система, которая превращает «семь из девяти» в пригодный новый дескриптор, выдумывает состояние, которого сервер не создал.
Twalk с нулём элементов клонирует исходный fid в newfid, не проходя имя. MAXWELEM ограничивает одно сообщение шестнадцатью элементами, но не длину логического пути: клиент может продолжить следующим walk. Для реконструкции событий важно различать разрешение, клонирование и разбиение сообщения.
Topen отвечает на другой вопрос. Запрос просит открыть уже представленный fid файл для чтения, записи, обоих действий или исполнения, с предусмотренными 9P2000 флагами. Сервер проверяет доступ и подготавливает fid к вводу-выводу. Ropen возвращает qid и iounit. Только последующие Tread или Twrite с ответами способны подтвердить конкретную передачу.
Права имеют временную границу. Руководство по open указывает, что они проверяются при открытии, а последующее изменение прав не лишает доступа к уже открытому файлу. Разрешение поиска каталогов во время walk не гарантирует запрошенный режим open. Поэтому отказ после полного walk может быть логичен; и наоборот, открытый ранее fid способен работать после смены политики. Без порядка и времени событий слово «разрешено» вводит в заблуждение.
qid тоже имеет локальную область. Он однозначно обозначает файл внутри одной иерархии сервера, а его часть path должна меняться при удалении и повторном создании. Это надёжнее отображаемого имени, но не глобальный идентификатор между серверами и не хеш содержимого.
Локальность составляет замысел Plan 9. Статья The Use of Name Spaces in Plan 9 подписана Робом Пайком, Дэйвом Пресотто, Кеном Томпсоном, Говардом Трики и Филом Уинтерботтомом и описывает пространства имён для каждого процесса. Авторы Plan 9 from Bell Labs — Пайк, Пресотто, Шон Дорвард, Боб Фландрена, Томпсон, Трики и Уинтерботтом — подчёркивают, что композиция пространства хранится у клиента. Это не неудачный глобальный каталог, а сознательная свобода собирать локальную среду.
Такой же точности требует авторство. Предисловие ко второму изданию говорит: Томпсон начал протокол, Пайк интегрировал именование, Пресотто построил сеть; там же отмечены Уинтерботтом и множество других участников. Формула «протокол Пайка» стирает коллективную работу и неточно описывает его реальный вклад.
Версии нельзя смешивать на уровне полей. Предисловие к четвёртому изданию связывает новый 9P прежде всего с отказом от прежнего ограничения имени в 27 байт, а также с эффективностью, гибкостью и инкапсуляцией. Linux v9fs поддерживает 9p2000, 9p2000.u и 9p2000.L. UNIX-расширение и Linux-диалект документированы отдельно; 9P2000.L сохраняет форму walk, но использует Tlopen/Rlopen и Linux-флаги. Общей остаётся двухэтапная граница, а не точный формат open.
Режимы кэширования v9fs добавляют разрыв между наблюдением клиента и текущим состоянием сервера. Полная запись поэтому хранит диалект, сеанс, сервер/export, контекст attach, исходные fid/qid, имена, все qid, полный или частичный результат, newfid, режим и флаги open, qid/iounit из Ropen, дальнейший ввод-вывод, кэш и завершение сеанса.
Тогда «walk успешен» остаётся сильным выводом: имена разрешились там и тогда, где это утверждает протокол. Для его истинности ничего не требовалось открывать.
Sources
- https://9p.io/magic/man2html/5/walk
- https://9p.io/magic/man2html/5/open
- https://9p.io/magic/man2html/5/intro
- https://9p.io/sys/doc/names.html
- https://9p.io/sys/doc/9.html
- https://9p.io/sys/man/preface.html
- https://9p.io/sys/man/preface4.html
- https://docs.kernel.org/filesystems/9p.html
- https://ericvh.github.io/9p-rfc/rfc9p2000.u.html
- https://github.com/chaos/diod/blob/master/protocol.md
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров
