С его помощью можно, например, примонтировать Google Drive или S3 (или много чего еще) и обращаться к файлам в облаке так, как если бы они хранились на вашей локальной машине.
Простейший пример FUSE вы можете посмотреть в репозитории libfuse. В этом примере корень текущей ФС монтируется в директорию. Все операции происходящие внутри этой директории passthrough пропускает через себя никак не изменяя их и вызывая стандартные функции libc.
Попробуйте скомпилировать passthrough командой
fuse3 --cflags --libs` -o passthrough , примонтировать его в любую директорию и посмотреть как он работает.
Вам предстоит написать собственную имплементацию FUSE выполняющую одно из предложенных заданий.
- Выбор языка. Можно выбрать любой, практически у всех популярных ЯП есть свои библиотеки для работы с FUSE. Я рекомендую вам попробовать что-то низкоуровневое (C/C++, Rust)
- Настройка инструментов
Установите на вашу виртуалку пакеты fuse и libfuse-dev Подключите IDE к виртуалке, так будет гораздо легче писать код
Также можно воспользоваться SSHFS (для MacOS и Linux) или sshfs-win (для Windows) для монтирования директорий из ВМ
Или же создать и примонтировать общую папку через VirtualBox
Полезная ссылочка для работы с FUSE в докере и просмотра файлов внутри докера
- Написание кода. Вам нужно будет переопределить логику работы операций (read, write, mkdir, readlink и т.д.). Решите в каких операциях вы будете менять логику, какие операции оставите без изменений и будете вызывать их версии из стандартных библиотек, а какие и вовсе уберете оставив в виде noop.
- Тестирование. В конце не забудьте убедиться что выполнение команд ls, cat, rm, rmdir, ln, chown, cd, echo 1 > file не приводят к крашу ФС.
Нужно реализовать подключение по API к Discord или Telegram для сохранения файлов в каналах.
Запись файла должна представлять из себя создание нового сообщения с файлом в канале. Если файл уже существует, то нужно сначала создать новое сообщение и только после его успешного создания удалить старое.
Директории
В Telegram при перемещении файла в директорию к сообщению нужно добавлять тег с названием директории. При листинге директории нужно отдавать список файлов с тегом. Удаление директории должно приводить к удалению всех файлов с соответствующим тегом.
Для Discord запись файлов в корневую директорию должна сохранять файлы в основной текстовый канал. При создании директории должен создаваться новый канал и файлы записанные в новую директорию должны загружаться в этот канал. При листинге директории нужно отдавать список файлов из канала. При удалении директории канал должен удаляться.
Создание вложенных директорий реализовывать не нужно
Запрос ctime и mtime должен возвращать дату создания сообщения с файлом
Остальные операции (смена владельца файла, создание ссылок) можно не реализовывать
Для хранения мета информации можно как использовать локальный файл, так и специальное сообщение в канале
В вашу программу будет передаваться путь до директории с картинками в png формате, оттуда она будет получать изначальные файлы.
При листинге директории ваша программа должна отдавать список оригинальных файлов и (если применимо) их сконвертированные копии. Пример:
При попытке открыть файл jpg оригинальный png должен конвертироваться и возвращаться в jpg формате. Для того чтобы убедиться что файл действительно сконвертировался можно воспользоваться утилитой file
Все остальные операции должны переноситься на оригинальную директорию. Например mkdir mounted_dir/new_dir создаст директорию в original_dir.
При желании с преподавателем можно обсудить другие форматы для конвертации, например flac-
mp3 или md->pdf
У mp3 файлов есть теги содержащие разную мета информации об аудиофайле, например имя исполнителя, год записи песни, жанр и т.д. Ваша программа будет получать путь до директории с mp3 файлами и должна будет пройдясь рекурсивно по всем поддиректориям составить 3 директории в которых будут сгруппированы файлы согласно тегам: Artist, Year и Genre.
Пример:
ФС должна быть read only
Обратите внимание что у некоторых файлов может быть несколько жанров
При попытке прочитать файл из примонтированной директории должен отдаваться оригинальный файл
В вашу программу будет передаваться путь до директории с разными файлами, в том числе архивами. Для каждого архива в примонтированной ФС вам необходимо показывать директорию с содержимым архива и возможностью прочитать содержимое файлов.
Пример поведения ФС:
Архивные директории (archive, labs) должны быть read only
Все остальные операции должны переноситься на оригинальную директорию. Например mkdir mounted_dir/new_dir создаст директорию в original_dir
Ваша имплементация должна поддерживать минимум 2 архивных формата на ваш выбор
Ваша задача реализовать ФС которая будет в зависимости от конфига и типа файла исполнять разные операции.
Пример формата конфига:
Формат вашего конфига не обязательно должен быть в yaml формате и не обязательно именно с такими названиеми полей. Но там должны быть:
Массив с расширениями файлов
У перечисленных расширений должно быть поле read или write где описываются операции которые должны быть выполнены при чтении или записи файла с определенным расширением
Поля read/write могут быть строкой или массивом если планируется делать несколько операций с файлом
Переменные и выполнении команд
которые будут подставляться при
Специальное расширение other обозначающее все остальные расширения файлов кроме перечисленных
Специальная строка pass обозначающая операцию по умолчанию. В примере все файлы с расширениями не md или png будут открываться как обычно, а затем логироваться информация об этом
Поле DIRECTORY_LISTING где будут команды, исполняемые при листинге директории ( ) Пример:
Если у вас есть другая идея с использованием FUSE и вы хотите реализовать ее, то обсудите это с преподавателем чтобы расписать ТЗ к вашему заданию.