2009-12-27 15 views
6

मैं वर्चुअल फ़ाइल सिस्टम पर काम कर रहा हूं जो डिस्क आधारित नहीं है, जैसे/proc। अब मैं ext3 फाइल सिस्टम पर एक लक्ष्य के लिए इसके भीतर एक सिम्लिंक बनाना चाहता हूं। मुझे इसे प्राप्त करने के तरीकों पर कोई मानक दस्तावेज नहीं मिला है। मैंने अब तक अनुमान लगाया है कि मुझे में symlink के लिए एक फ़ंक्शन लिखना है। लेकिन स्पष्ट रूप से मैं समारोह पैरामीटर के साथ भी एक नुकसान में हूँ।वर्चुअल फ़ाइल सिस्टम में सिम्लिंक लागू करना

अगर यह मायने रखती है, मैं LWN पर इस ट्यूटोरियल के साथ शुरुआत की: http://lwn.net/Articles/13325/

संपादित करें: मैं इस समय libfs साथ काम कर रहा हूँ, फ्यूज नहीं

+0

मैं वास्तव में आभासी फाइल सिस्टम बनाने के लिए libfs का उपयोग करता है पहले से मौजूद कर्नेल मॉड्यूल पर काम कर रहा हूँ होने की आवश्यकता है। मुझे पता है कि अगर मैं FUSE का उपयोग कर रहा था तो यह आसान होगा लेकिन अभी सवाल से बाहर है :) – user108127

उत्तर

2

मैं इसे अंत में पूरा करने में सक्षम था। यहाँ मैं क्या किया है (कुछ विवरण क्या फाइल सिस्टम प्राप्त करना चाहता है के आधार पर भिन्न हो सकते हैं):

  1. S_IFLNK मोड के साथ सिमलिंक की inode बनाएँ और i_private क्षेत्र के लिए लक्ष्य जोड़ें।

  2. 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 

1

मैं लिनक्स पर एक नज़र लेने के लिए सुझाव है/एफएस/ext2/स्रोत कोड। फ़ाइलें symlink.c, inode.c, namei.c और शायद कुछ अन्य। आपको कुछ विचार मिलेगा कि क्या करने की आवश्यकता है। अपेक्षा के विपरीत, व्यक्तिगत फाइल सिस्टम का फाइल सिस्टम कोड वास्तव में बहुत छोटा और पढ़ने में आसान है।

लेकिन शायद नए वर्चुअल फाइल सिस्टम बनाने की बजाय, आप खुद से एक और सवाल पूछ सकते हैं, उपयोगकर्ता स्तर फाइल सिस्टम को फ्यूज नहीं करेगा मेरे मामले में पर्याप्त होगा? वर्चुअल फाइल सिस्टम और कुछ और उदाहरण बनाने के लिए उनके पास थोड़ा बेहतर प्रलेखन है।

+0

सुझाव के लिए धन्यवाद। कार्यान्वयन के बारे में कुछ विचारों के लिए मैं निश्चित रूप से ext2 स्रोत कोड में देखूंगा। – user108127

3

मुमकिन है आप fuse उपयोग कर रहे हैं, यदि आप नहीं कर रहे हैं, करते हैं :)

तुम सब getattr समारोह को लागू कर रहा है गिरी है कि पिंड एक सिमलिंक है बताने के लिए क्या करना है, तो readlink समारोह को लागू और उस पथ को वापस करें जो लिंक से लिंक होना चाहिए; कर्नेल बाकी करेगा।

संबंधित मुद्दे