Я работаю над виртуальной файловой системой, которая не является находящейся на диске, отчасти как/proc. Теперь я хочу создать символьную ссылку в нем к цели в ext3 файловой системе. Я не нашел стандартной документации относительно способов достигнуть этого. Что я предположил, до сих пор то, что я должен записать функцию, чтобы вставить для symlink
в struct inode_operations
. Но откровенно я в замешательстве даже с параметрами функции.
Если это имеет значение, я начался с этим учебным руководством на LWN: http://lwn.net/Articles/13325/
Править: Я работаю с libfs, не FUSE в данный момент
Мне наконец-то удалось это сделать. Вот что я сделал (некоторые детали могут отличаться в зависимости от того, чего хочет достичь файловая система):
Создайте в режиме S_IFLNK и добавьте цель в поле i_private.
Реализуйте follow_link, потому что generic_readlink требует, чтобы она присутствовала
static void *sample_follow_link (struct dentry *dentry, struct nameidata *nd) { nd->depth = 0; nd_set_link(nd, (char *)dentry->d_inode->i_private); return NULL; } static struct inode_operations sample_inode_ops = { .readlink = generic_readlink, .follow_link = sample_follow_link, }; ..... //in the function for the dentry and inode creation inode->i_op = sample_inode_ops
Я бы предложил взглянуть на исходные тексты linux/fs/ext2/. Файлы symlink.c, inode.c, namei.c и, возможно, несколько других. Вы получите некоторое представление о том, что нужно сделать. Вопреки ожиданиям, код файловой системы отдельных файловых систем на самом деле очень короткий и легко читается.
Но может быть вместо того, чтобы создавать новую виртуальную файловую систему, вы можете задать себе другой вопрос, не достаточно ли слияния файловой системы пользовательского уровня в моем случае? Они имеют немного лучшую документацию по созданию виртуальных файловых систем и еще несколько примеров
.Предположительно вы используете fuse, если нет, do :)
Все что вам нужно сделать, это реализовать функцию getattr, чтобы сообщить ядру, что объект является симлинк, затем реализовать функцию readlink и вернуть путь, на который ссылка должна линковаться; ядро сделает все остальное.
.