Реализация базовой файловой системы - PullRequest
8 голосов
/ 03 февраля 2010

Как проект колледжа, мне нужно реализовать базовую файловую систему из файла. Итак, как мне это сделать? Что мне нужно знать? Требования включают в себя наличие процесса демона в фоновом режиме. Кроме того, приложения, использующие эту систему, должны подключаться к серверу с помощью доменного сокета Unix

Файловая система должна иметь следующие возможности:

  1. Список файлов, хранящихся вместе с их размерами.
  2. Создание файлов
  3. Разрешить изменения в файлах
  4. Удалить файлы

Ответы [ 4 ]

3 голосов
/ 04 февраля 2010

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

Вы также найдете некоторый код, который покажет вам, как сделать Valgrind более полезным при отладке реализаций FUSE.

Вы пишете функции дляоткройте / создайте / прочитайте / напишите / обрежьте / getattr / etc и передайте их в плавкий предохранитель (номера строк взяты из связанного примера):

   343 static struct fuse_operations const xsfs_ops = {
   344  .getattr = xsfs_getattr,
   345  .mknod = xsfs_mknod,
   346  .mkdir = xsfs_mkdir,
   347  .unlink = xsfs_rm,
   348  .rmdir = xsfs_rmdir,
   349  .truncate = xsfs_truncate,
   350  .open = xsfs_open,
   351  .read = xsfs_read,
   352  .write = xsfs_write,
   353  .readdir = xsfs_readdir,
   354  .create = xsfs_create,
   355  .destroy = xsfs_destroy,
   356  .utime = xsfs_utime,
   357  .symlink = xsfs_symlink,
   358  .init = (void *)xsfs_init
   359 };

Как видите, это очень очевидно.Небольшой поиск привел бы к поиску множества базовых файловых примеров реализации FUSE.

Я настоятельно рекомендую делать это полностью в пользовательском пространстве, если у вас нет достаточно времени, чтобы достаточно познакомиться с ядром.

2 голосов
/ 03 февраля 2010

Проверьте это, если это может помочь. http://www.geocities.ws/ravikiran_uvs/articles/rkfs.html

Если вы хотите создать файловую систему в пространстве пользователя, FUSE может вам помочь. http://fuse.sourceforge.net/

1 голос
/ 03 февраля 2010

Файловая система - это, по сути, база данных для файлов.Главное, что вам нужно, это справочная таблица для хранения смещения байтов и длины файлов.Имена файлов также могут храниться в таблице или в первых нескольких байтах при каждом смещении.Вам будет намного легче, если вы сделаете файловую систему фиксированного размера.

Это будет похоже на работу файловой системы FAT.

Вы также можете взглянуть на http://en.wikipedia.org/wiki/Database_storage_structures, поскольку на самых низких уровнях файловые системы и базы данных очень похожи.

0 голосов
/ 03 февраля 2010

Самый простой способ сделать это - создать шаблон для хранения данных и проанализировать файлы в ОЗУ, конечно, это не самый эффективный способ.

Что-то вроде ...

НЕКОТОРЫЕ / МЕСТО / Имя файла >>> содержимое файла здесь, бла-бла-бла <<< НЕКОТОРЫЕ / ДРУГИЕ / МЕСТО / File2Name >>> содержимое другого файла здесь <<< </p>

Затем, чтобы вывести список каталогов, с помощью регулярных выражений найти все строки, заканчивающиеся на >>>, затем проанализировать до X-й косой черты (на основе количества слешей в найденной папке) и выполнить поиск с учетом регистра (без учета регистра) в зависимости от того, хотите ли вы, чтобы это чувствительно к регистру. Конечно, как я уже упоминал, загружая его в память, вы можете искать в hashmap key-> value, что, вероятно, будет намного проще.

...