2010-02-03 2 views
7

Là một dự án đại học, tôi cần triển khai hệ thống tệp cơ bản từ bên trong tệp. Vì vậy, làm thế nào để tôi đi về điều này? Những điều tôi cần biết là gì? Các yêu cầu bao gồm có một quy trình daemon trong nền. Ngoài ra các ứng dụng có sử dụng hệ thống này cần phải kết nối với máy chủ bằng cách sử dụng ổ cắm miền UnixTriển khai hệ thống tệp cơ bản

Các hệ thống tập tin nên có các khả năng sau:

  1. Liệt kệ file được lưu trữ cùng với kích thước của chúng.
  2. Tạo file
  3. Cho phép thay đổi các tập tin
  4. file Xóa
+0

Chúng tôi có thể đưa ra một số giả định ở đây: Chúng tôi không tạo hệ thống tệp thực: nghĩa là chúng tôi không mong sử dụng lệnh ls hoặc dir thông thường để xem mọi thứ. Thay vào đó, chúng tôi đang triển khai một dịch vụ hiển thị các tệp thông qua giao diện tùy chỉnh trên ổ cắm. Chúng tôi đang viết cả máy chủ và thư viện máy khách. Dữ liệu cho máy chủ được lưu trữ trong một tệp duy nhất. Điều này có đúng không? –

+0

Tương tự như câu hỏi chung chung hơn: http://stackoverflow.com/questions/4714056/how-to-implement-a-very-simple-filesystem –

Trả lời

0

Cách đơn giản nhất để làm điều này là tạo mẫu để lưu trữ dữ liệu và phân tích tệp thành ram, tất nhiên, đây không phải là hiệu quả nhất.

Cái gì đó như ...

MỘT SỐ/VỊ TRÍ/Tên tập tin >>> nội dung của file ở đây, blah blah blah < < < MỘT SỐ/KHÁC/VỊ TRÍ/File2Name >>> nội dung của người khác nộp đây < < <

sau đó, để ra khỏi danh sách thư mục, sử dụng regex tìm tất cả các dòng kết thúc bằng >>>, sau đó phân tích lên đến slash khoá X (dựa trên số lượng các dấu gạch chéo trong thư mục tìm kiếm), và làm tìm kiếm nhạy cảm trong trường hợp, dựa trên việc bạn có muốn phân biệt chữ hoa chữ thường hay không. Tất nhiên, như tôi đã đề cập tải nó vào bộ nhớ, bạn có thể tìm kiếm một hashmap khóa-> giá trị, có lẽ sẽ đơn giản hơn rất nhiều.

1

Hệ thống tệp là một cơ sở dữ liệu về mặt tiểu sử cho các tệp. Điều chính bạn cần là một bảng tra cứu để lưu trữ độ lệch byte và độ dài tập tin. Tên tệp cũng có thể được lưu trữ trong bảng hoặc chúng có thể được lưu trữ trong vài byte đầu tiên ở mỗi lần bù. Nó sẽ dễ dàng hơn nhiều nếu bạn làm cho hệ thống tập tin của bạn có kích thước cố định.

Điều này tương tự như cách thức hoạt động của hệ thống tệp FAT.

Bạn cũng có thể xem http://en.wikipedia.org/wiki/Database_storage_structures vì ở các hệ thống tệp và cơ sở dữ liệu ở mức thấp nhất là rất giống nhau.

3

Dưới đây là an example của việc triển khai FUSE rất cơ bản được hỗ trợ bởi phân đoạn bộ nhớ được chia sẻ vinh quang (xenstore). Đó là một ngã ba của hệ thống tập tin xen kẽ FUSE gốc mà tôi duy trì.

Bạn cũng sẽ tìm thấy một số mã để chỉ cho bạn cách làm cho Valgrind hữu ích hơn khi gỡ lỗi triển khai FUSE.

Bạn viết các chức năng để mở/tạo/đọc/ghi/truncate/getattr/etc và vượt qua chúng để cầu chì (số dòng là từ ví dụ liên kết):

343 static struct fuse_operations const xsfs_ops = { 
    344 .getattr = xsfs_getattr, 
    345 .mknod = xsfs_mknod, 
    346 .mkdir = xsfs_mkdir, 
    347 .unlink = xsfs_rm, 
    348 .rmdir = xsfs_rmdir, 
    349 .truncate = xsfs_truncate, 
    350 .open = xsfs_open, 
    351 .read = xsfs_read, 
    352 .write = xsfs_write, 
    353 .readdir = xsfs_readdir, 
    354 .create = xsfs_create, 
    355 .destroy = xsfs_destroy, 
    356 .utime = xsfs_utime, 
    357 .symlink = xsfs_symlink, 
    358 .init = (void *)xsfs_init 
    359 }; 

Như bạn thấy, nó cực kỳ tự giải thích. Một chút tìm kiếm sẽ dẫn đến việc tìm kiếm nhiều ví dụ cơ bản được sao lưu của các triển khai FUSE.

Tôi thực sự khuyên bạn nên làm điều đó hoàn toàn trong không gian người dùng, trừ khi bạn có đủ thời gian để làm quen với hạt nhân.