2009-12-27 7 views
6

Ich arbeite an einem virtuellen Dateisystem, das nicht diskettenbasiert ist, ähnlich wie/proc. Jetzt möchte ich einen Symlink darin zu einem Ziel auf einem ext3-Dateisystem erstellen. Ich habe keine Standarddokumentation über Möglichkeiten gefunden, dies zu erreichen. Was ich bis jetzt erraten habe ist, dass ich eine Funktion schreiben muss, die für symlink in struct inode_operations geschrieben wird. Aber ehrlich gesagt bin ich selbst mit den Funktionsparametern ratlos.Implementieren von Symlinks in einem virtuellen Dateisystem

Wenn es darauf ankommt, begann ich mit diesem Tutorial auf LWN off: http://lwn.net/Articles/13325/

EDIT: Ich arbeite mit libfs, nicht FUSE im Moment

+0

Ich arbeite an einem bereits vorhandenen Kernel-Modul tatsächlich sein, erfordert die libfs verwendet das virtuelle Dateisystem zu erstellen. Ich weiß, es wäre einfacher, wenn ich FUSE verwenden würde, aber momentan kommt das nicht in Frage :) – user108127

Antwort

2

Ich konnte es endlich erreichen. Hier ist, was ich getan habe (einige Details unterscheiden kann je nachdem, was das Dateisystem erreichen will):

  1. erstellen Inode des Symlink mit dem S_IFLNK Modus und fügen Sie das Ziel auf den i_private Feld.

  2. Implement follow_link weil generic_readlink es vorhanden

 
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 

1

Ich würde vorschlagen, um einen Blick auf Linux/fs/ext2/Quellcode. Dateien symlink.c, inode.c, namei.c und wahrscheinlich einige andere. Sie erhalten eine Idee, was zu tun ist. Entgegen der Erwartung ist der Dateisystemcode der einzelnen Dateisysteme tatsächlich sehr kurz und einfach zu lesen.

Aber vielleicht statt neue virtuelles Dateisystem zu erstellen, könnten Sie sich eine andere Frage stellen, würde nicht fusionieren Benutzerebene Dateisystem in meinem Fall genug? Sie haben etwas bessere Dokumentation zum Erstellen von virtuellen Dateisystemen und ein paar mehr Beispiele.

+0

Danke für den Vorschlag. Ich werde definitiv im ext2-Quellcode nach einigen Ideen zur Implementierung suchen. – user108127

3

Vermutlich sind Sie fuse verwenden, wenn Sie nicht, tun :)

Alles, was Sie tun müssen, ist die getattr Funktion zu implementieren, den Kernel zu sagen, dass das Objekt ein symbolischer Link ist, implementieren Sie dann die Funktion Readlink und den Pfad zurückgeben, mit dem der Link verknüpft werden sollte; Der Kernel erledigt den Rest.

Verwandte Themen