Chào mọi người! Chúng tôi tiếp tục tung ra các luồng mới cho các khóa học mà bạn đã yêu thích và bây giờ chúng tôi xin thông báo rằng chúng tôi đang bắt đầu một loạt khóa học mới sẽ ra mắt vào cuối tháng Tư. Một ấn phẩm mới sẽ được ghi ngày cho sự kiện này. Với tài liệu ban đầu, bạn có thể .
Hệ thống tập tin ảo hoạt động như một dạng trừu tượng kỳ diệu cho phép triết học Linux Nói rằng "mọi thứ đều là một tập tin."

Hệ thống tập tin là gì? Theo một trong những người đóng góp và tác giả đầu tiên. Linux , "Hệ thống tệp là kho lưu trữ dữ liệu có thứ bậc được lắp ráp theo một cấu trúc cụ thể." Tuy nhiên, định nghĩa này cũng phù hợp với VFAT (Bảng phân bổ tệp ảo), Git và (). Vì vậy, những gì xác định chính xác một thứ như một "hệ thống tập tin"?
Khái niệm cơ bản về hệ thống tập tin
Hạt nhân Linux Để một thực thể được coi là hệ thống tập tin, nó phải đáp ứng một số yêu cầu nhất định. Nó phải triển khai các phương thức. open(), read() и write() cho các đối tượng liên tục có tên. Từ quan điểm hướng đối tượng , kernel định nghĩa một hệ thống tệp chung là một giao diện trừu tượng và ba chức năng lớn này được coi là "ảo" và không có định nghĩa cụ thể. Theo đó, việc triển khai hệ thống tệp mặc định được gọi là hệ thống tệp ảo (VFS).

Nếu chúng ta có thể mở, đọc và ghi vào một thực thể thì thực thể đó được coi là một tệp, như chúng ta có thể thấy từ ví dụ trong bảng điều khiển ở trên.
Hiện tượng VFS chỉ nhấn mạnh quan sát giống như Unix rằng "mọi thứ đều là tệp". Hãy nghĩ rằng thật kỳ lạ khi ví dụ /dev/console nhỏ ở trên cho thấy cách thức hoạt động của bảng điều khiển thực sự. Hình ảnh hiển thị một phiên Bash tương tác. Gửi một chuỗi tới bàn điều khiển (thiết bị điều khiển ảo) sẽ hiển thị chuỗi đó trên màn hình ảo. VFS có những đặc tính khác, thậm chí xa lạ. Ví dụ, nó cho phép bạn tìm kiếm theo .
Các hệ thống quen thuộc như ext4, NFS và /proc có ba chức năng quan trọng trong cấu trúc dữ liệu C được gọi là Ngoài ra, một số hệ thống tập tin mở rộng và triển khai lại chức năng của VFS theo cách hướng đối tượng quen thuộc. Như Robert Love đã lưu ý, sự trừu tượng hóa của VFS cho phép người dùng Linux Việc sao chép tệp tin một cách bất cẩn giữa các hệ điều hành của bên thứ ba hoặc các thực thể trừu tượng như đường ống mà không quan tâm đến định dạng dữ liệu bên trong của chúng là điều không thể. Từ phía người dùng (không gian người dùng), một tiến trình có thể sao chép dữ liệu từ một tệp tin vào các cấu trúc dữ liệu của nhân hệ điều hành bằng cách sử dụng lệnh gọi hệ thống. read() một hệ thống tập tin và sau đó sử dụng phương pháp write () một hệ thống tệp khác để xuất dữ liệu.
Các định nghĩa chức năng thuộc về các loại VFS cơ sở có trong các tệp mã nguồn hạt nhân, trong khi các thư mục con fs/ chứa các hệ thống tập tin nhất định. Lõi cũng chứa các thực thể như cgroups, /dev и tmpfs, được yêu cầu trong quá trình khởi động và do đó được xác định trong thư mục con kernel init/. Thông báo rằng cgroups, /dev и tmpfs không gọi các chức năng "ba lớn" file_operations, nhưng trực tiếp đọc và ghi vào bộ nhớ.
Sơ đồ bên dưới minh họa cách không gian người dùng truy cập các loại hệ thống tập tin khác nhau thường được gắn kết trên hệ thống. LinuxNhững công trình như vậy không được hiển thị pipes, dmesg и POSIX clocks, cũng thực hiện cấu trúc file_operations, được truy cập thông qua lớp VFS.

VFS là một "lớp bao bọc" giữa các cuộc gọi hệ thống và việc triển khai một số file_operationsChẳng hạn như ext4 и procfs. Chức năng file_operations có thể tương tác với trình điều khiển thiết bị hoặc thiết bị truy cập bộ nhớ. tmpfs, devtmpfs и cgroups không được dùng file_operations, nhưng truy cập trực tiếp vào bộ nhớ.
Sự tồn tại của VFS cung cấp khả năng sử dụng lại mã, vì các phương thức cơ bản liên quan đến hệ thống tệp không phải được triển khai lại theo từng loại hệ thống tệp. Tái sử dụng mã là một thực tế phổ biến giữa các kỹ sư phần mềm! Tuy nhiên, nếu mã tái sử dụng chứa , tất cả các triển khai kế thừa các phương thức phổ biến đều bị ảnh hưởng bởi chúng.
/tmp: Gợi ý đơn giản
Một cách dễ dàng để phát hiện VFS có trên hệ thống là gõ mount | grep -v sd | grep -v :/, sẽ hiển thị tất cả được gắn (mounted) hệ thống tệp không nằm trên đĩa và không phải NFS, điều này đúng trên hầu hết các máy tính. Một trong những thú cưỡi được liệt kê (mounts) VFS chắc chắn sẽ /tmp, bên phải?

Mọi người đều biết rằng lưu trữ / tmp trên một phương tiện vật lý - điên rồ! .
Tại sao nó không mong muốn để lưu trữ /tmp trên phương tiện vật lý? Bởi vì các tập tin trong /tmp là tạm thời và các thiết bị lưu trữ chậm hơn bộ nhớ nơi tmpfs được tạo. Hơn nữa, phương tiện vật lý dễ bị ghi đè hơn bộ nhớ. Cuối cùng, các tệp trong /tmp có thể chứa thông tin nhạy cảm, vì vậy làm cho chúng biến mất sau mỗi lần khởi động lại là một tính năng cần thiết.
Thật không may, một số tập lệnh cài đặt Linux Các bản phân phối mặc định tạo thư mục /tmp trên thiết bị lưu trữ. Đừng lo lắng nếu điều này xảy ra với hệ thống của bạn. Hãy làm theo một vài hướng dẫn đơn giản sau: để khắc phục điều này và lưu ý rằng bộ nhớ được phân bổ cho tmpfs trở nên không khả dụng cho các mục đích khác. Nói cách khác, một hệ thống có tmpfs khổng lồ và các tệp lớn trên đó có thể hết bộ nhớ và gặp sự cố. Một gợi ý khác: trong khi chỉnh sửa tệp /etc/fstab, hãy nhớ rằng nó phải kết thúc bằng một dòng mới, nếu không hệ thống của bạn sẽ không khởi động được.
/proc và /sys
ngoài ra /tmp, VFS (hệ thống tệp ảo), là loại quen thuộc nhất với người dùng. Linux - là /proc и /sys. (/dev nằm trong bộ nhớ dùng chung và không có file_operations). Tại sao hai thành phần này? Hãy xem xét vấn đề này.
procfs tạo ảnh chụp nhanh của hạt nhân và các quy trình mà nó theo dõi userspace. Trong /proc hạt nhân in thông tin về những gì nó có sẵn, chẳng hạn như ngắt, bộ nhớ ảo và bộ lập lịch. Bên cạnh đó, /proc/sys là nơi chứa các tham số được cấu hình bằng lệnh sysctl, có sẵn cho userspace. Trạng thái và số liệu thống kê của các quy trình riêng lẻ được hiển thị trong các thư mục /proc/.

Здесь /proc/meminfo là một tệp trống tuy nhiên chứa thông tin có giá trị.
Hành vi /proc các tệp cho thấy các hệ thống tệp đĩa VFS khác nhau như thế nào. Một bên, /proc/meminfo chứa thông tin có thể được xem bằng lệnh free. Mặt khác, nó trống rỗng! Làm thế nào nó hoạt động? Tình huống này gợi nhớ đến bài báo nổi tiếng có tiêu đề được viết bởi giáo sư vật lý David Mermin của Đại học Cornell vào năm 1985. Thực tế là hạt nhân thu thập số liệu thống kê bộ nhớ khi có yêu cầu /proc, và thực sự trong các tập tin /proc không có gì khi không có ai đang tìm kiếm. Như đã nói , "Học thuyết lượng tử cơ bản nói rằng phép đo nói chung không tiết lộ giá trị tồn tại trước của thuộc tính được đo." (Và coi câu hỏi về mặt trăng là bài tập về nhà!)
Dường như trống rỗng procfs có ý nghĩa vì thông tin ở đó là động. Một tình huống hơi khác với sysfs. Hãy so sánh có bao nhiêu tệp có kích thước ít nhất một byte trong /proc và /sys.

Procfs có một tệp, cụ thể là cấu hình hạt nhân đã xuất, đây là một ngoại lệ vì nó chỉ cần được tạo một lần cho mỗi lần khởi động. Mặt khác, trong /sys có nhiều tệp lớn hơn, nhiều tệp chiếm toàn bộ trang bộ nhớ. Thông thường các tập tin sysfs chứa chính xác một số hoặc dòng, không giống như các bảng thông tin thu được từ việc đọc các tệp như /proc/meminfo.
mục tiêu sysfs - cung cấp các thuộc tính đọc/ghi của những gì kernel gọi «kobjects» trong không gian người dùng. Mục tiêu duy nhất kobjects đang đếm liên kết: khi liên kết cuối cùng đến một kobject bị xóa, hệ thống sẽ khôi phục các tài nguyên được liên kết với nó. Tuy nhiên, /sys chiếm phần lớn sự nổi tiếng cốt lõi, mà không ai có thể, trong bất kỳ trường hợp nào . Điều này không có nghĩa là các tệp trong sysfs là tĩnh, điều này sẽ không phù hợp với việc đếm tham chiếu của các đối tượng không ổn định.
ABI ổn định của nhân giới hạn những gì có thể xuất hiện trong /sys, không phải những gì thực sự có mặt tại thời điểm cụ thể đó. Liệt kê các quyền của tệp trong sysfs cung cấp thông tin chi tiết về cách cài đặt có thể định cấu hình cho thiết bị, mô-đun, hệ thống tệp, v.v. có thể được cấu hình hoặc đọc. Kết luận hợp lý là procfs cũng là một phần của ABI ổn định của nhân, mặc dù điều này không được nêu rõ ràng trong .

tập tin trong sysfs mô tả một thuộc tính cụ thể cho từng thực thể và có thể đọc được, ghi được hoặc cả hai. "0" trong tệp có nghĩa là không thể xóa SSD.
Hãy bắt đầu phần thứ hai của bài dịch với cách theo dõi VFS bằng công cụ eBPF và bcc, và bây giờ chúng tôi đang chờ ý kiến của bạn và theo truyền thống mời bạn , sẽ được tổ chức bởi giáo viên của chúng tôi vào ngày 9 tháng XNUMX - .
Nguồn: www.habr.com
