Các hệ thống tệp ảo trong Linux: tại sao chúng cần thiết và chúng hoạt động như thế nào? Phần 1

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 "Quản trị viên Linux"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ể đọc ở đây.

Các hệ thống tệp ảo phục vụ như một loại trừu tượng kỳ diệu cho phép triết lý của Linux nói rằng "mọi thứ đều là một tệp".

Các hệ thống tệp ảo trong Linux: tại sao chúng cần thiết và chúng hoạt động như thế nào? Phần 1

Hệ thống tập tin là gì? Dựa trên lời của một trong những người đóng góp và tác giả đầu tiên của Linux dung nham Roberta, "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à Cassandra (Cơ sở dữ liệu NoQuery). 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

Nhân Linux có các yêu cầu nhất định đối với một thực thể có thể được coi là một hệ thống tệp. Nó phải thực hiện các phương pháp 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 lập trình, 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).

Các hệ thống tệp ảo trong Linux: tại sao chúng cần thiết và chúng hoạt động như thế nào? Phần 1

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à hoạt động tập tin. Ngoài ra, một số hệ thống tệp mở rộng và xác định lại chức năng VFS theo cách hướng đối tượng quen thuộc. Như Robert Love đã chỉ ra, bản tóm tắt VFS cho phép người dùng Linux sao chép các tệp vào hoặc từ các hệ điều hành bên thứ ba hoặc các thực thể trừu tượng như đường ống mà không phải lo lắng về định dạng dữ liệu nội bộ của chúng. Về phía người dùng (không gian người dùng), sử dụng lệnh gọi hệ thống, một quy trình có thể sao chép từ tệp sang cấu trúc dữ liệu kernel bằng phương thức 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 fs/*.c 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 cho thấy cách không gian người dùng truy cập các loại hệ thống tệp khác nhau thường được cài đặt trên các hệ thống Linux. Cấu trúc 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.

Các hệ thống tệp ảo trong Linux: tại sao chúng cần thiết và chúng hoạt động như thế nào? Phần 1

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 sai lầm nghiêm trọng, 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?

Các hệ thống tệp ảo trong Linux: tại sao chúng cần thiết và chúng hoạt động như thế nào? Phần 1

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ồ! Nguồn.

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 bản phân phối Linux tạo /tmp trên thiết bị lưu trữ theo mặc định. Đừng thất vọng nếu điều này cũng xảy ra với hệ thống của bạn. Thực hiện theo một vài hướng dẫn đơn giản với Wiki của Wikiđể 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) 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/.

Các hệ thống tệp ảo trong Linux: tại sao chúng cần thiết và chúng hoạt động như thế nào? Phần 1

Здесь /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 đề Mặt trăng có tồn tại khi không có ai nhìn vào nó không? Hiện thực và Thuyết lượng tử"đượ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 cá chép, "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/sys.

Các hệ thống tệp ảo trong Linux: tại sao chúng cần thiết và chúng hoạt động như thế nào? Phần 1

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 "ABI ổn định cho không gian người dùng" cốt lõi, mà không ai có thể, trong bất kỳ trường hợp nào "phá vỡ". Đ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ài liệu.

Các hệ thống tệp ảo trong Linux: tại sao chúng cần thiết và chúng hoạt động như thế nào? Phần 1

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 mở hội thảo trực tuyế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 - Vladimir Drozdetsky.

Nguồn: www.habr.com

Thêm một lời nhận xét