6 Stimmen

Implementierung von Symlinks in einem virtuellen Dateisystem

Ich arbeite an einem virtuellen Dateisystem, das nicht festplattenbasiert ist, ähnlich wie /proc. Nun möchte ich darin einen Symlink auf ein Ziel in einem ext3-Dateisystem erstellen. Ich habe keine Standarddokumentation darüber gefunden, wie man dies erreichen kann. Was ich bisher vermutet habe, ist, dass ich eine Funktion schreiben muss, die für symlink en struct inode_operations . Aber ehrlich gesagt bin ich selbst bei den Funktionsparametern ratlos.

Falls es wichtig ist, ich habe mit diesem Tutorial auf LWN angefangen: http://lwn.net/Articles/13325/

EDIT: Ich arbeite im Moment mit libfs, nicht mit FUSE

3voto

MarkR Punkte 60862

Vermutlich verwenden Sie Sicherung wenn Sie es nicht sind, tun Sie es :)

Sie müssen lediglich die Funktion getattr implementieren, um dem Kernel mitzuteilen, dass es sich bei dem Objekt um einen Symlink handelt, dann die Funktion readlink implementieren und den Pfad zurückgeben, auf den der Link verweisen soll; der Kernel erledigt den Rest.

2voto

user108127 Punkte 486

Endlich habe ich es geschafft. Hier ist, was ich getan habe (einige Details können sich unterscheiden, je nachdem, was das Dateisystem erreichen will):

  1. Erstellen Sie den Inode des Symlinks mit dem Modus S_IFLNK und fügen Sie das Ziel in das Feld i_private ein.

  2. follow_link implementieren, da generic_readlink dies erfordert

    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

1voto

Jiri Klouda Punkte 1352

Ich würde vorschlagen, einen Blick auf den Quellcode von linux/fs/ext2/ zu werfen. Die Dateien symlink.c, inode.c, namei.c und wahrscheinlich einige andere. Sie werden eine Vorstellung davon bekommen, was getan werden muss. Entgegen der Erwartung ist der Dateisystemcode der einzelnen Dateisysteme sehr kurz und leicht zu lesen.

Aber anstatt ein neues virtuelles Dateisystem zu erstellen, sollten Sie sich vielleicht eine andere Frage stellen: Wäre ein Sicherungsdateisystem auf Benutzerebene in meinem Fall nicht ausreichend? Sie haben eine etwas bessere Dokumentation zur Erstellung virtueller Dateisysteme und ein paar mehr Beispiele.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X