2012-01-25 34 views
11

Viết một hệ thống tệp FUSE đơn giản được lưu trữ trong bộ nhớ. Các hệ thống tập tin có để hỗ trợ các lệnh sau:Trong hệ thống tệp FUSE bộ nhớ

ls, mkdir, cp

Câu hỏi này gần đây đã được hỏi trong một cuộc phỏng vấn, tôi đã không trả lời có thể nó. Vì vậy, tôi đã quyết định tìm hiểu nó.

Đã thực hiện một số tìm kiếm và tìm thấy một số hướng dẫn về cách xây dựng hệ thống tệp FUSE của riêng tôi. Tôi thực sự không biết gì về cách triển khai hệ thống tệp trong bộ nhớ.

Câu hỏi của tôi là

  • Am Tôi hướng đi đúng hướng?
  • Tôi nên đọc gì khác?
  • Giải pháp là gì?

Liên kết mà tôi đang đọc:

Trong liên kết cuối cùng có một đề cập trên trong bộ nhớ cache với PyFileSystem. Tôi không chắc chắn về cách thức đó có thể hữu ích.

PS: Đây là một cuộc phỏng vấn bằng văn bản Câu hỏi, Vì vậy, câu trả lời phải đơn giản, đủ để viết trên giấy trong vòng 10-15 phút.

+1

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? –

+0

@ 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

+0

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? –

Trả lời

5

Tôi đã thực hiện một khóa học mà chúng tôi phải xây dựng một hệ thống tệp phân phối trong bộ nhớ tương tự như thiết kế đến Frangipani. Khóa học được lấy cảm hứng từ số MIT's Distributed Systems course. Làm vài bài tập trong phòng thí nghiệm đầu tiên của họ sẽ là một bài tập tốt.

This tutorial cũng khá hữu ích.

3

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:

  1. Một cấu trúc dữ liệu để xử lý các file hệ thống trong bộ nhớ
  2. Mô tả Nodes và mối quan hệ của họ để inodes
  3. Móc để nắm bắt yêu cầu máy chủ FUSE để xử lý các lệnh cli
  4. 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 ChildrenParent. 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.

+0

Câu trả lời tuyệt vời, mã được cung cấp, cảm ơn bạn! –

Các vấn đề liên quan