fuse - монтируем в фс что угодно
Оригинал https://t.me/bits_and_bicycles/7
Шок! read
/write
начинает ходить в user space, стоит только поставить один единственный пакет…
Завёл речь про файловые системы, так ещё и #fuse упомянул. Придётся теперь про него рассказывать.
Помнишь, я говорил, что ты можешь написать модуль ядра со своей файловой системой и делать в нём что угодно на read
/write
? Вот вообще всё что угодно. Что бы ты такое написал?
Скорее всего самое маргинальное, что ты придумал – ходить в сеть, чтобы смонтировать по NFS ту самую пекарню с фильмами 😏 в локалке. На заветной машине для этого запущен NFS сервер (в user space, как и любой другой приличный софт). Как он реализует NFS протокол, чтением с диска или генерацией "файлов" на лету, – его дело.
Что если мы случайно начнём ходить в ту же самую машину? В свой же user space? Смонтируем свои же файлы, что довольно бесполезно. Но мы всё ещё можем написать NFS сервер таким образом, чтобы он генерировал "файлы" на лету.
Собственно, мы в одном шаге от fuse'а. NFS подразумевает, что машины разные, а мы точно знаем, что машина одна. Значит байты можно перекладывать чуть более эффективно и чуть больше давать знать про систему.
Это и есть Filesystem in USErspace, что-то типа NFS, но со знанием, что машина на клиенте и сервере одна и та же. По сути, прокси между VFS и user space'ом, что позволяет писать файловые системы хоть в плагинах на lua для neovim'а. (Чтобы открывать их тем же neovim'ом, главное рекурсивно в самого себя не уйти.)
(NFS здесь для примера и наглядности, протокол у fuse совсем другой)
И в чём же профит? - Писать обычные user space программы гораздо проще, чем модули ядра. - Если у тебя есть готовая реализация какого-нибудь протокола, то не надо затаскивать его в kernel space с его малюсеньким стеком и без curl’а.
А как же безопасность? - Так у тебя теперь всё в user space запускается. Ты по определению более безопасный. Не можешь ни kernel panic'овать, ни игнорировать права доступа. И вообще молодец.
Что на этом уже понаписали? - sshfs, s3fs, restic-mount, WikipediaFS и т.д.