Именованный канал в виде каталога с использованием FUSE - PullRequest
3 голосов
/ 03 октября 2019

Я хотел бы создать файловую систему FUSE, которая принимает любые операции записи в любой путь внутри файловой системы. Вроде как именованный канал, но в форме каталога.

echo test > bar         # consumes "test"
echo test > bar/foo     # consumes "test", even though the directory "bar" hasn't been created
echo test > x/y/z/test  # consumes "test", even though the directories "x/y/z" haven't been created

Я использую bazil.org / fuse для реализации. Проблема, с которой я сталкиваюсь, заключается в том, что когда приложение хочет записать в foo/bar в моей файловой системе, оно проверяет, является ли foo каталогом, а затем bar файлом. К сожалению, я не могу заранее знать, должен ли foo быть файлом или каталогом.

Моя Attr функция выглядит следующим образом:

func (d *Dir) Attr(ctx context.Context, a *fuse.Attr) error {
        a.Inode = 1
        a.Mode = os.ModeDir | 0755
}

Этот код специфичен длятип узла каталога из-за os.ModeDir. Я хочу, чтобы это работало для каталогов или файлов.

Есть ли способ добиться того, чего я хочу?

1 Ответ

1 голос
/ 12 октября 2019

Проблема, с которой я сталкиваюсь, состоит в том, что, когда приложение хочет записать в foo/bar в моей файловой системе, оно проверяет, является ли foo каталогом, а затем bar является файлом. К сожалению, я не могу заранее знать, должен ли foo быть файлом или каталогом.

С учетом этих ограничений решение вашей проблемы невозможно.

Узел файловой системы можетбыть либо файлом, либо каталогом;иногда ни один, но никогда оба одновременно. Поскольку ваш драйвер FUSE не может заранее знать, означает ли приложение, выполняющее запрос getattr, выполнить рекурсию внутри узла до тех пор, пока он на самом деле не попытается, вы не можете знать, должно ли оно претендовать на то, чтобы быть файлом или каталогом.

Ваши лучшие варианты выглядят следующим образом:

  • жестко закодировать структуру виртуальных каталогов приложения в вашем драйвере FUSE
  • внедрить эвристику для конкретного приложения в вашем драйвере FUSE
  • сделать вашДрайвер FUSE запоминает getattr запросы и создает дерево виртуальных каталогов методом проб и ошибок (и продолжает перезапускать приложение, пока оно не заработает)
...