хранить некоторые данные в структуре inode - PullRequest
5 голосов
/ 05 марта 2012

Здравствуйте, я новичок в программировании ядра.Я пишу небольшой модуль ядра, основанный на шаблоне wrapfs для реализации механизма резервного копирования.Это чисто для учебной основы.

Я расширяю wrapfs так, что при выполнении вызова записи wrapfs прозрачно делает копию этого файла в отдельном каталоге и затем выполняет запись в файл.Но я не хочу, чтобы я создавал копию для каждого вызова записи.

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

Я также мог бы проверить сначала запись вызова, а затем сохранить значение для этого конкретного файла, используя атрибут private_data.Но это не будет храниться на диске.Так что мне нужно проверить это снова.

Я также думал об использовании времени модификации.Я мог бы сэкономить время модификации.Если старое время модификации раньше этого времени, то создается только копия, иначе я ничего не буду делать.Я попытался использовать inode.i_mtime для этого, но это было измененное время еще до того, как была вызвана запись, также приложения могут изменять это время.

Итак, я думал о сохранении некоторого значения в inode на диске, которое указывает, была создана его резервная копия или нет.Это возможно?Любые другие предложения или подходы приветствуются.

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

Вы можете использовать atime вместо mtime. В этом случае установка флага S_NOATIME на узле препятствует его обновлению (см. Функцию touch_atime() в inode.c). Единственное, что вам нужно, это смонтировать вашу файловую систему с опцией noatime.

0 голосов
/ 05 марта 2012

Вы, по сути, говорите, что хотите создать слой виртуальной файловой системы Copy-On-Write.

IMO, некоторые из них уже сделаны, и было бы проще реализовать их в пользовательском пространстве (например, с помощью libfuse и модуля fuse). Таким образом, вы можете стать королем своего замка и добавлять свои метаданные любым способом, который, по вашему мнению, является соответствующим:

  • просто добавить (скрытые) файлы метаданных в каждый каталог
  • использовать расширенные атрибуты POSIX (setfattr и друзья)
  • черт, вы даже можете использовать базу данных sqlite

Если вы действительно настаиваете на том, чтобы делать эти вещи в ядре, у вас будет намного больше работы, так как доступ к метаданным из режима ядра, безусловно, потребует гораздо больше усилий (вы, скорее всего, захотите эмулировать свою собственную базу данных). использование файлов с отображенной памятью, чтобы минимизировать объем требуемой работы «пользовательского стиля (стиля)» и сделать так, чтобы относительно легко для правильной атомарности и надежности 1 .


1 На Как все получают неверный ввод-вывод файла: см. Также здесь

...