2009-12-27 19 views
6

Pracuję nad wirtualnym systemem plików, który nie jest oparty na dysku, w rodzaju/proc. Teraz chcę utworzyć dowiązanie symboliczne wewnątrz niego do celu w systemie plików ext3. Nie znalazłem żadnej standardowej dokumentacji na temat sposobów osiągnięcia tego. Do tej pory domyślałem się, że muszę napisać funkcję, która ma być umieszczona pod symlink w struct inode_operations. Ale szczerze mówiąc, tracę nawet przy parametrach funkcji.Implementowanie dowiązań symbolicznych w wirtualnym systemie plików

Jeśli ma to znaczenie, zacząłem się z tego poradnika na LWN: http://lwn.net/Articles/13325/

EDIT: Ja pracuję z libfs nie FUSE w momencie

+0

jestem rzeczywiście działa na istniejący moduł jądra, który używa libfs aby utworzyć wirtualny system plików. Wiem, że byłoby łatwiej, gdybym używał BEZPIECZNIKA, ale w tej chwili nie ma mowy :) – user108127

Odpowiedz

2

Udało mi się to w końcu osiągnąć. Oto co zrobiłem (niektóre szczegóły mogą się różnić w zależności od tego, co chce osiągnąć plików):

  1. Tworzenie iwęzeł na miejsce linku z trybem S_IFLNK i dodać cel dziedzinie i_private.

  2. Wdrożenie follow_link ponieważ generic_readlink wymaga on być obecny

 
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

Proponuję spojrzeć na linux/fs/ext2/kod źródłowy. Pliki symlink.c, inode.c, namei.c i prawdopodobnie kilka innych. Dostaniesz pomysł, co należy zrobić. Wbrew oczekiwaniom, kod systemu plików poszczególnych systemów plików jest w rzeczywistości bardzo krótki i łatwy do odczytania.

Ale może zamiast tworzyć nowy wirtualny system plików, możesz zadać sobie inne pytanie, czy w moim przypadku nie wystarczyłby system plików na poziomie użytkownika? Mają nieco lepszą dokumentację do tworzenia wirtualnych systemów plików i kilka innych przykładów.

+0

Dzięki za sugestię. Na pewno zajrzę do kodu źródłowego ext2, aby uzyskać kilka pomysłów na temat implementacji. – user108127

3

Prawdopodobnie używasz fuse, jeśli nie jesteś, prawda :)

Wszystko co musisz zrobić, to zaimplementować funkcję getattr powiedzieć jądro, że obiekt jest dowiązaniem, a następnie wdrożyć funkcję readlink i zwraca ścieżkę, do której powinien prowadzić link; jądro zrobi resztę.