Làm cách nào để triển khai trình điều khiển hệ thống tệp trong Linux? [đóng cửa]


14

Giả sử rằng tôi đã phát minh ra một hệ thống tệp mới và bây giờ tôi muốn tạo trình điều khiển hệ thống tệp cho nó.

Làm thế nào tôi có thể thực hiện trình điều khiển hệ thống tập tin này, điều này được thực hiện bằng cách sử dụng một mô-đun hạt nhân?

Và làm thế nào trình điều khiển hệ thống tệp có thể truy cập vào đĩa cứng, trình điều khiển hệ thống tệp có chứa mã để truy cập vào đĩa cứng hay Linux có chứa trình điều khiển thiết bị để truy cập vào đĩa cứng được sử dụng bởi tất cả các trình điều khiển hệ thống tệp không?

Câu trả lời:


24

Có, các hệ thống tập tin trong Linux có thể được triển khai như các mô-đun hạt nhân. Nhưng cũng có giao diện FUSE (Filesystem in USErspace), có thể cho phép một quy trình không gian người dùng thông thường hoạt động như một trình điều khiển hệ thống tập tin. Nếu bạn đang tạo mẫu hệ thống tệp mới, việc triển khai hệ thống trước tiên bằng giao diện FUSE có thể giúp việc kiểm tra và phát triển dễ dàng hơn. Khi bạn đã xử lý các phần bên trong của hệ thống tập tin ở dạng FUSE, bạn có thể bắt đầu triển khai phiên bản mô-đun hạt nhân được tối ưu hóa hiệu năng của nó.

Dưới đây là một số thông tin cơ bản về việc triển khai một hệ thống tệp trong không gian kernel. Nó khá cũ (từ năm 1996!), Nhưng điều đó ít nhất sẽ cung cấp cho bạn một ý tưởng cơ bản cho loại việc bạn cần làm.

Nếu bạn chọn đi đến tuyến FUSE, đây là libfuse, việc triển khai tham chiếu phía không gian người dùng của giao diện FUSE.

Trình điều khiển hệ thống tập tin như một mô-đun hạt nhân

Về cơ bản, chức năng khởi tạo của mô-đun trình điều khiển hệ thống tệp của bạn chỉ cần gọi một register_filesystem()hàm và cung cấp cho nó như một tham số cấu trúc bao gồm một con trỏ hàm xác định chức năng trong trình điều khiển hệ thống tệp của bạn sẽ được sử dụng làm bước đầu tiên để xác định hệ thống tệp của bạn gõ và gắn nó. Không có gì xảy ra nhiều hơn ở giai đoạn đó.

Khi một hệ thống tệp đang được gắn kết và loại hệ thống tệp được chỉ định để khớp với trình điều khiển của bạn hoặc tự động phát hiện loại hệ thống tệp đang được thực hiện, lớp Virtual FileSystem (gọi tắt là VFS) của hạt nhân sẽ gọi chức năng đó. Về cơ bản, nó nói "Đây là một con trỏ tới một đại diện cấp hạt nhân của một thiết bị khối Linux tiêu chuẩn. Hãy xem nó, xem đó có phải là thứ bạn có thể xử lý không, và sau đó cho tôi biết bạn có thể làm gì với nó."

Tại thời điểm đó, trình điều khiển của bạn có nghĩa vụ phải đọc bất cứ điều gì cần thiết để xác minh đó là trình điều khiển phù hợp cho hệ thống tệp và sau đó trả về cấu trúc bao gồm các con trỏ tới các chức năng khác mà trình điều khiển của bạn có thể làm với hệ thống tệp cụ thể đó. Hoặc nếu trình điều khiển hệ thống tệp không nhận ra dữ liệu trên đĩa, nó được cho là trả về kết quả lỗi thích hợp và sau đó VFS sẽ báo cáo lỗi cho không gian người dùng hoặc - nếu thực hiện tự động phát hiện loại hệ thống tệp - sẽ hỏi hệ thống tệp khác Lái xe để thử.

Các trình điều khiển khác trong kernel sẽ cung cấp giao diện thiết bị khối tiêu chuẩn, vì vậy trình điều khiển hệ thống tập tin sẽ không phải thực hiện hỗ trợ phần cứng. Về cơ bản, trình điều khiển hệ thống tập tin có thể đọc và ghi các khối đĩa bằng cách sử dụng các hàm cấp hạt nhân tiêu chuẩn với con trỏ thiết bị được cung cấp cho nó.

Lớp VFS hy vọng trình điều khiển hệ thống tập tin sẽ cung cấp một số chức năng tiêu chuẩn cho lớp VFS; một vài trong số này là bắt buộc để lớp VFS thực hiện bất cứ điều gì có ý nghĩa với hệ thống tệp, một số khác là tùy chọn và bạn chỉ có thể trả về NULL thay cho con trỏ cho hàm tùy chọn như vậy.


1
Đây là một câu trả lời khá hay mặc dù để trả lời đầy đủ câu hỏi như đã nêu, bạn cũng cần nói một chút về chức năng mà lớp thiết bị khối cung cấp cho lớp hệ thống tệp để xây dựng.
kasperd

Tôi đã ám chỉ điều đó với bit "đây là một con trỏ tới một thiết bị khối tiêu chuẩn", nhưng điểm tốt; Tôi mở rộng về điều đó.
telcoM

Câu trả lời này, cụ thể là mô tả về những gì xảy ra theo thứ tự, là thần thánh. Có một số loại sách / trang web tôi có thể đọc có mô tả như thế cho tất cả "cách thức hoạt động của linux"?
Adam Barnes

Bạn có thể quan tâm đến Linux Kernel Internals hoặc Trình điều khiển thiết bị Linux, Phiên bản thứ 3 . Và tất nhiên, có tùy chọn đọc mã nguồn thực tế.
telcoM

5

Có một trình điều khiển hạt nhân có thể quản lý một hệ thống tập tin.

Giải pháp tốt nhất để mô phỏng, tạo nguyên mẫu cho một hệ thống tệp là sử dụng FUSE. Và sau khi bạn có thể nghĩ về việc chuyển đổi nó thành trình điều khiển kernel.

Wikipedia => https://en.wikipedia.org/wiki/Filesystem_in_Userspace

Nguồn => https://github.com/libfuse/libfuse

một hướng dẫn => https://developer.ibm.com/articles/l-fuse/


0

Có, điều này thường được thực hiện bằng trình điều khiển kernel có thể được tải dưới dạng mô-đun kernel hoặc được biên dịch vào kernel.

Bạn có thể kiểm tra trình điều khiển hệ thống tập tin tương tự và cách chúng hoạt động ở đây .

Các trình điều khiển này có thể sử dụng các hàm nhân bên trong để truy cập các thiết bị lưu trữ dưới dạng các khối byte nhưng bạn cũng có thể sử dụng các khối được trình bày bởi các trình điều khiển trong các thiết bị khốicác thư mục thiết bị ký tự .


0

Bạn có thể sử dụng cầu chì, để tạo một hệ thống tệp người dùng hoặc viết mô-đun hạt nhân. Việc sử dụng cầu chì sẽ dễ dàng hơn vì bạn có nhiều lựa chọn ngôn ngữ và sẽ không làm hỏng kernel (và do đó là toàn bộ hệ thống).

Các mô-đun hạt nhân có thể nhanh hơn, nhưng quy tắc tối ưu hóa đầu tiên là: Đừng làm điều đó cho đến khi bạn đã kiểm tra mã làm việc. Thứ hai là như thế: Đừng làm điều đó cho đến khi bạn có bằng chứng rằng nó quá chậm. Và thứ ba: Đừng giữ nó trừ khi bạn có bằng chứng rằng nó làm cho nó nhanh hơn / nhỏ hơn.

Và vâng, kernel đã có trình điều khiển cho phần cứng, bạn không thực hiện lại chúng.


Có những nhược điểm lớn đối với FUSE ngoài hiệu năng: thật khó để sử dụng nó cho hệ thống tập tin gốc của bạn. (Có lẽ có thể với một initrd, nhưng nhị phân FUSE không thể được trả tự do sau khi khởi động bởi vì nó sẽ vẫn được thực hiện từ các đĩa RAM.)
Peter Cordes

1
@PeterCordes Nó không thể được giải phóng , nhưng điều đó không có nghĩa là nó không thể được liên kết. Nếu vẫn còn một tham chiếu đến nó, nó sẽ được lưu trong bộ nhớ bất kể bạn có rời khỏi initramfs hay không và xóa nhị phân cơ bản.
rừng

@forest: đúng, do đó, bạn không thể ngắt kết nối initrd sau pivot_root, bởi vì vẫn còn các nút bận trong initramfs.
Peter Cordes

Một /initkhởi đầu bình thường từ một initramfs sẽ (tôi nghĩ) sẽ thực thi /initsau p Pivot_root, để chuyển điều khiển sang các FS gốc thực sự /init. Nhưng một nhị phân FUSE không thể tự thay thế bằng thực thi nếu quyền truy cập vào FS gốc phụ thuộc vào quá trình FUSE đáp ứng với kernel. Có lẽ bằng cách mồi mồi trước, nhưng điều đó không đáng tin.
Peter Cordes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.