2012-01-25 21 views
11

स्मृति में संग्रहीत एक साधारण FUSE फाइल सिस्टम लिखें। फाइल सिस्टम निम्न कमांड का समर्थन किया है:मेमोरी FUSE फाइल सिस्टम

ls, mkdir सीपी

यह सवाल हाल ही में एक साक्षात्कार में पूछा गया था, मैं सक्षम यह जवाब नहीं था। तो मैंने इसे सीखने का फैसला किया है।

क्या कुछ खोज और अपने स्वयं के FUSE फाइल सिस्टम बनाने पर कुछ मार्गदर्शिकाएं पाईं। मैं वास्तव में स्मृति में फाइल सिस्टम को कार्यान्वित करने के बारे में अनजान हूं।

मेरे सवालों का

  • Am मैं सही दिशा में बढ़ रहे हैं?
  • मुझे और क्या पढ़ना चाहिए?
  • समाधान क्या है?

लिंक है कि मैं पढ़ रहा हूँ:

पिछले लिंक में PyFileSystem साथ-स्मृति कैशिंग पर एक उल्लेख है। मुझे यकीन नहीं है कि इससे कैसे मदद मिल सकती है।

पीएस: यह एक लिखित साक्षात्कार प्रश्न था, इसलिए उत्तर को 10-15 मिनट के भीतर कागज पर लिखने के लिए काफी सरल होना है।

+1

मैं समझता हूँ कि इस सवाल को धोखा हो सकता है, लेकिन क्यों उपयोग नहीं [tmpfs] (http://en.wikipedia.org/wiki/Tmpfs) फ्यूज के माध्यम से अपने खुद के फाइल सिस्टम रोलिंग के बजाय? –

+0

@ FrédéricHamidi: tmpfs एक अच्छा विकल्प धन्यवाद है। लेकिन दुख की बात है कि जैसा आपने उल्लेख किया है, उस सवाल का जवाब नहीं देता है। – Gautam

+0

मैं memory_ में _stored लगता है मतलब है कि आप बफर किसी तरह का आवंटन और FS बैकएंड के रूप में है कि बफर का उपयोग करना होगा? –

उत्तर

5

मैंने एक कोर्स लिया था जहां हमें Frangipani पर डिजाइन में समान स्मृति में वितरित फ़ाइल सिस्टम बनाना था। पाठ्यक्रम MIT's Distributed Systems course से काफी प्रेरित था। अपने पहले कुछ प्रयोगशाला कार्य करना एक अच्छा अभ्यास होगा।

This tutorial भी काफी उपयोगी है।

3

आपने प्रोग्रामिंग भाषा निर्दिष्ट नहीं की है, हालांकि FUSE मूल C++ मूल गोलांग बाइंडिंग हैं, bazil.org/fuse पर कार्यान्वित किया गया है।

मैं कहना चाहता हूँ जवाब के प्राथमिक भागों में निम्न शामिल करने की जरूरत है कि:

  1. नोड्स
  2. विवरण और inodes
  3. के साथ उनके संबंध स्मृति में फाइल सिस्टम पेड़ को संभालने के लिए एक डेटा संरचना
  4. क्ली कमांड
  5. को FUSE सर्वर के साथ फ़ोल्डर को आरोहित करने का विवरण FUSE सर्वर अनुरोधों को कैप्चर करने के लिए हुक।

मैंने हाल ही में इस एडाप्टर का उपयोग करके एक इन-मेमोरी फ़ाइल सिस्टम लिखा: github.com/bbengfort/memfs। अपने प्रदर्शन के बारे में मेरे writeup यहाँ है: In-Memory File System with FUSE। जल्दी, कुछ विकल्प हैं जो मैंने किया:

स्मृति म डेटा संरचना 2 प्राथमिक structs, dir और फ़ाइल है कि दोनों नोड्स हैं शामिल हैं:

type Node struct { 
    ID uint64 
    Name string 
    Attrs fuse.Attr 
    Parent *Dir 
} 

type Dir struct { 
    Node 
    Children map[string]Node 
} 

type File struct { 
    Node 
    Data []byte 
} 

आप देख सकते हैं, यह एक सरल पेड़ कि traversable है Children और Parent लिंक के माध्यम से ऊपर और नीचे। फाइल के Data विशेषता फाइलों की सभी सामग्री रखती है। इसलिए फ़ाइल सिस्टम को केवल माउंट पॉइंट पर "\" नामक "रूट" निर्देशिका बनाने की आवश्यकता है, और उसके बाद mkdirDir अपने बच्चों में जोड़ा गया है, और cpFile जोड़ा गया है।

type FS struct { 
    root *Dir 
} 

func Mount(path string) error { 

    // Unmount the FS in case it was mounted with errors. 
    fuse.Unmount(path) 

    // Mount the FS with the specified options 
    conn, err := fuse.Mount(path) 
    if err != nil { 
     return err 
    } 

    // Ensure that the file system is shutdown 
    defer conn.Close() 

    // Create the root dir and file system 
    memfs := FS{ 
     root: &Dir{ 
      ID: 1, 
      Name: "\", 
      Parent: nil, 
     }, 
    } 

    // Serve the file system 
    if err := fs.Serve(conn, memfs); err != nil { 
     return err 
    } 
} 

अब आप हुक की जरूरत है विभिन्न फ्यूज अनुरोध और कॉल लागू करने के लिए: जाओ में, इस के रूप में सरल रूप में है। यहाँ mkdir के लिए एक उदाहरण है:

func (d *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) { 
    // Update the directory Atime 
    d.Attrs.Atime = time.Now() 

    // Create the child directory 
    c := new(Dir) 
    c.Init(req.Name, req.Mode, d) 

    // Set the directory's UID and GID to that of the caller 
    c.Attrs.Uid = req.Header.Uid 
    c.Attrs.Gid = req.Header.Gid 

    // Add the directory to the directory 
    d.Children[c.Name] = c 

    // Update the directory Mtime 
    d.Attrs.Mtime = time.Now() 

    return c, nil 
} 

अंत में, कैसे संकलन करने और चलाने के सर्वर, एक पथ के लिए बढ़ते और शायद कैसे फ्यूज अवरोध गिरी कॉल और अपनी प्रक्रिया के लिए उन्हें गुजरता है के बारे में एक चर्चा के साथ साक्षात्कार सवाल बंद उपयोक्ता स्थान।

+0

विस्मयकारी उत्तर, प्रदान किया गया कोड, धन्यवाद! –

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