आपने प्रोग्रामिंग भाषा निर्दिष्ट नहीं की है, हालांकि FUSE मूल C++ मूल गोलांग बाइंडिंग हैं, bazil.org/fuse पर कार्यान्वित किया गया है।
मैं कहना चाहता हूँ जवाब के प्राथमिक भागों में निम्न शामिल करने की जरूरत है कि:
- नोड्स
- विवरण और inodes
के साथ उनके संबंध स्मृति में फाइल सिस्टम पेड़ को संभालने के लिए एक डेटा संरचना
- क्ली कमांड
- को 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
विशेषता फाइलों की सभी सामग्री रखती है। इसलिए फ़ाइल सिस्टम को केवल माउंट पॉइंट पर "\"
नामक "रूट" निर्देशिका बनाने की आवश्यकता है, और उसके बाद mkdir
Dir
अपने बच्चों में जोड़ा गया है, और cp
File
जोड़ा गया है।
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
}
अंत में, कैसे संकलन करने और चलाने के सर्वर, एक पथ के लिए बढ़ते और शायद कैसे फ्यूज अवरोध गिरी कॉल और अपनी प्रक्रिया के लिए उन्हें गुजरता है के बारे में एक चर्चा के साथ साक्षात्कार सवाल बंद उपयोक्ता स्थान।
मैं समझता हूँ कि इस सवाल को धोखा हो सकता है, लेकिन क्यों उपयोग नहीं [tmpfs] (http://en.wikipedia.org/wiki/Tmpfs) फ्यूज के माध्यम से अपने खुद के फाइल सिस्टम रोलिंग के बजाय? –
@ FrédéricHamidi: tmpfs एक अच्छा विकल्प धन्यवाद है। लेकिन दुख की बात है कि जैसा आपने उल्लेख किया है, उस सवाल का जवाब नहीं देता है। – Gautam
मैं memory_ में _stored लगता है मतलब है कि आप बफर किसी तरह का आवंटन और FS बैकएंड के रूप में है कि बफर का उपयोग करना होगा? –