Bạn không chỉ định ngôn ngữ lập trình, mặc dù FUSE là native C++ có liên kết Golang bản địa, được triển khai tại bazil.org/fuse.
Tôi muốn nói rằng các bộ phận chính của câu trả lời cần phải bao gồm những điều sau đây:
- Một cấu trúc dữ liệu để xử lý các file hệ thống trong bộ nhớ
- Mô tả Nodes và mối quan hệ của họ để inodes
- Móc để nắm bắt yêu cầu máy chủ FUSE để xử lý các lệnh cli
- Mô tả về việc gắn thư mục với máy chủ FUSE.
Gần đây tôi đã viết hệ thống tệp trong bộ nhớ bằng cách sử dụng bộ điều hợp này: github.com/bbengfort/memfs. Ghi chú của tôi về hiệu suất của nó là ở đây: In-Memory File System with FUSE. Một cách nhanh chóng, một vài lựa chọn tôi thực hiện:
Các bộ nhớ trong cấu trúc dữ liệu chứa 2 cấu trúc chính, dir và tập tin đó là cả hai nút:
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
}
Như bạn có thể thấy, đây là một cây đơn giản đó là traversable lên xuống thông qua các liên kết Children
và Parent
. Thuộc tính Data
của Tệp giữ tất cả nội dung của tệp. Do đó, hệ thống tệp chỉ cần tạo thư mục "gốc" được gọi là "\"
tại điểm gắn kết và sau đó là mkdir
a Dir
được thêm vào con của nó và trên cp
a File
được thêm vào. Trong Go, điều này đơn giản như:
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
}
}
Bây giờ bạn cần móc để thực hiện các yêu cầu và cuộc gọi FUSE khác nhau. Dưới đây là một ví dụ cho 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
}
Cuối cùng, đóng câu hỏi phỏng vấn với một cuộc thảo luận về làm thế nào để biên dịch và chạy máy chủ, gắn với một con đường và có lẽ cách FUSE chặn cuộc gọi hạt nhân và chuyển chúng đến quá trình của bạn trong không gian người dùng.
Tôi hiểu điều này có thể là phá vỡ câu hỏi, nhưng tại sao không sử dụng [tmpfs] (http://en.wikipedia.org/wiki/Tmpfs) thay vì lăn hệ thống tệp của riêng bạn thông qua FUSE? –
@ FrédéricHamidi: tmpfs là một giải pháp thay thế tốt. Nhưng thật đáng buồn là không trả lời câu hỏi như bạn đã đề cập. – Gautam
Tôi đoán _stored trong memory_ có nghĩa là bạn phải phân bổ một số loại bộ đệm và sử dụng bộ đệm đó như fs backend? –