Отличительный файл в файловой системе - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь различить файлы в файловой системе со следующими требованиями (при условии, что все файлы находятся в одной файловой системе):

  1. Если файл A был переименован в файл B, он должен выглядеть так же
  2. Если файл A был удален, а затем создан, он должен выглядеть иначе

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

root@spc:~/test# touch test
root@spc:~/test# ls -li
total 0
2098203 -rw-r--r-- 1 root root 0 Jan 15 14:55 test
root@spc:~/test# rm test
root@spc:~/test# touch test
root@spc:~/test# ls -li
total 0
2098203 -rw-r--r-- 1 root root 0 Jan 15 14:55 test

Таким образом, два разных файла имели одинаковый номер инода. Есть ли способ сделать это для linux/ext4? Может быть, мы можем использовать некоторые специфичные для файловой системы API для хранения мета uid?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы можете установить расширенные атрибуты файловой системы (где поддерживается, то есть с ext4 при монтировании с параметром user_xattr):

#include <sys/types.h>
#include <attr/xattr.h>

int main (void) {
    setxattr("test", "user.fileguid", "someuniqueguid", 15, 0);
}

и прочитайте его обратно

char uuid[100];
int len = getxattr("test", "user.fileguid", uuid, sizeof(uuid), 0);

Если этот атрибут должен изменяться только привилегированным процессом, вы можете использовать пространство имен security вместо user (т.е. имя-атрибута security.fileguid). В этом случае сам владелец файла не может сам изменять атрибуты. Если вы не используете пространство имен user, опция монтирования user_xattr даже не нужна.

Однако эти атрибуты не устанавливаются сразу после создания файла. Но при первом обращении к файлу с помощью инструмента должно быть достаточно установить случайную направляющую (т. Е. Когда еще не задана направляющая).

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

0 голосов
/ 15 января 2019

Увы, это невозможно, потому что:

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

  2. для номера индекса, он зависит от поддержки файловой системы в ядре, и многие из них (FS) перезаписывают номера индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...