Làm thế nào / Proc / * hoạt động?


62

Có rất nhiều tập tin trong /proc, như /proc/cpuinfo, /proc/meminfo, /proc/devicesvà như vậy, mà khi mở ra, hệ thống thông tin trở lại.

Các tệp này dường như không có bất kỳ sự tồn tại nào trong thực tế, vì chạy filetrên chúng chỉ nói rằng chúng trống.

$ file /proc/cpuinfo
/proc/cpuinfo: empty

Làm thế nào để các tập tin này hoạt động chính xác?

Câu trả lời:


72

Nó thực sự khá đơn giản, ít nhất là nếu bạn không cần các chi tiết thực hiện.

Trước hết, trên Linux, tất cả các hệ thống tệp (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) đều được triển khai trong kernel. Một số có thể giảm tải công việc cho mã người dùng thông qua FUSE và một số chỉ xuất hiện dưới dạng mô-đun hạt nhân ( ZFS nguyên bản là một ví dụ đáng chú ý về sau do hạn chế cấp phép), nhưng dù sao thì vẫn có một thành phần hạt nhân. Đây là một cơ bản quan trọng.

Khi một chương trình muốn đọc từ một tập tin, nó sẽ phát hành các cuộc gọi thư viện hệ thống khác nhau mà cuối cùng kết thúc trong hạt nhân dưới hình thức một open(), read(), close()chụp liên tục (có thể với seek()ném trong cho biện pháp tốt). Hạt nhân lấy đường dẫn và tên tệp được cung cấp, và thông qua hệ thống tệp I / O của hệ thống và thiết bị dịch các yêu cầu đọc vật lý này (và trong nhiều trường hợp cũng viết các yêu cầu - ví dụ như cập nhật atime) cho một số lưu trữ bên dưới.

Tuy nhiên, nó không phải dịch các yêu cầu cụ thể sang lưu trữ vật lý, liên tục . Hợp đồng của kernel là việc phát hành tập hợp các cuộc gọi hệ thống cụ thể đó sẽ cung cấp nội dung của tệp được đề cập . Trường hợp chính xác trong lĩnh vực vật lý của chúng ta, "tập tin" tồn tại là thứ yếu.

Trên /procthường được gắn những gì được gọi là procfs. Đó là một loại hệ thống tệp đặc biệt, nhưng vì nó là một hệ thống tệp, nên nó thực sự không khác gì một ext3hệ thống tệp được gắn ở đâu đó. Vì vậy, yêu cầu được chuyển đến mã trình điều khiển hệ thống tệp Procfs, biết về tất cả các tệp và thư mục này và trả về các mẩu thông tin cụ thể từ cấu trúc dữ liệu kernel .

"Lớp lưu trữ" trong trường hợp này là cấu trúc dữ liệu kernel và procfscung cấp giao diện sạch sẽ, thuận tiện để truy cập vào các lớp đó. Hãy nhớ rằng việc gắn Procfs /procchỉ đơn giản là quy ước; bạn có thể dễ dàng gắn kết nó ở nơi khác. Trong thực tế, điều đó đôi khi được thực hiện, ví dụ như trong các nhà tù chroot khi quá trình đang chạy ở đó cần truy cập vào / Proc vì một số lý do.

Nó hoạt động theo cách tương tự nếu bạn viết một giá trị cho một số tệp; ở cấp hạt nhân, mà dịch để một loạt các open(), seek(), write(), close()cuộc gọi mà một lần nữa có được thông qua để trình điều khiển hệ thống tập tin; một lần nữa, trong trường hợp cụ thể này, mã Procfs.

Lý do cụ thể tại sao bạn thấy filequay trở lại emptylà nhiều tệp được hiển thị bởi Procfs được hiển thị với kích thước 0 byte. Kích thước 0 byte có khả năng là tối ưu hóa ở phía nhân (nhiều tệp trong / Proc là động và có thể dễ dàng thay đổi độ dài, thậm chí có thể từ lần đọc này sang lần đọc tiếp theo và tính toán độ dài của mỗi tệp trên mỗi thư mục đọc có khả năng rất tốn kém). Theo các bình luận cho câu trả lời này, mà bạn có thể xác minh trên hệ thống của mình bằng cách chạy qua strace hoặc một công cụ tương tự, filetrước tiên stat()hãy thực hiện một cuộc gọi để phát hiện bất kỳ tệp đặc biệt nào, sau đó nhân cơ hội này, nếu kích thước tệp được báo cáo là 0 , hủy bỏ và báo cáo các tập tin là trống rỗng.

Hành vi này thực sự được ghi lại-s--special-filesfile và có thể được ghi đè bằng cách chỉ định hoặc trên lệnh gọi, mặc dù như đã nêu trong trang hướng dẫn có thể có tác dụng phụ. Trích dẫn dưới đây là từ trang BSD tệp 5.11, ngày 17 tháng 10 năm 2011.

Thông thường, tệp chỉ cố gắng đọc và xác định loại tệp đối số mà báo cáo stat (2) là các tệp thông thường. Điều này ngăn ngừa các vấn đề, bởi vì đọc các tệp đặc biệt có thể có hậu quả đặc biệt. Chỉ định -stùy chọn khiến tệp cũng đọc các tệp đối số là các tệp đặc biệt của khối hoặc ký tự. Điều này rất hữu ích để xác định các loại hệ thống tệp của dữ liệu trong các phân vùng đĩa thô, là các tệp đặc biệt. Tùy chọn này cũng khiến tệp bỏ qua kích thước tệp như được báo cáo bởi stat (2) vì trên một số hệ thống, nó báo cáo kích thước bằng không cho các phân vùng đĩa thô.


5
Khi bạn nhìn vào nó bằng strace file /proc/versionhoặc ltrace -S /proc/version, tối ưu hóa là khá nhỏ. Nó thực hiện stat()cuộc gọi trước và thấy rằng kích thước bằng 0, do đó bỏ qua open()- nhưng trước đó nó đang tải một số tệp ma thuật.
ott--

2
@ ott-- Đó thực sự là một chuỗi các sự kiện kỳ ​​lạ, nhưng nó thể liên quan đến thực tế là bạn có thể chuyển nhiều tên tệp cho file. Bằng cách này, tệp tải trước các tệp ma thuật, sau đó xử lý tham số dòng lệnh theo tham số; thay vì di chuyển các tập tin tải ma thuật vào "làm điều này ngay trước khi cố gắng để xác định loại tập tin này một cụ thể là" một phần của mã, mà sẽ tăng tính phức tạp. Gọi stat()và hành động trên giá trị trả về của nó về cơ bản là vô hại; thêm phức tạp trong việc theo dõi các rủi ro nhà nước nội bộ bổ sung giới thiệu các lỗi.
một CVn

@ ott-- Trên thực tế, lý do filebáo cáo tệp tin là trống rỗng vì nó gọi statđể phát hiện các tệp đặc biệt (được đặt tên là đường ống, thiết bị, kỹ thuật) và nhân cơ hội này dừng xử lý các tệp trống. file -s /proc/versionbáo cáo văn bản ASCII
Gilles 'SO- ngừng trở nên xấu xa'

4
@Gilles Được -scho là dành cho các thiết bị đặc biệt khối / char. Cuối cùng tôi đã xem filenguồn, và ở cuối fsmagic.c tôi đã thấy lời giải thích này tại sao nó trở lại ASCII textthay vì empty:If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
ott--

15

Trong thư mục này, bạn có thể kiểm soát cách kernel xem thiết bị, điều chỉnh cài đặt kernel, thêm thiết bị vào kernel và xóa chúng lại. Trong thư mục này, bạn có thể trực tiếp xem việc sử dụng bộ nhớ và thống kê I / O.

Bạn có thể xem đĩa nào được gắn và hệ thống tệp nào được sử dụng. Nói tóm lại, mọi khía cạnh của hệ thống Linux của bạn đều có thể được kiểm tra từ thư mục này, nếu bạn biết phải tìm gì.

Thư mục /prockhông phải là một thư mục bình thường. Nếu bạn đã khởi động từ đĩa CD khởi động và xem thư mục đó trên ổ cứng, bạn sẽ thấy nó trống rỗng. Khi bạn nhìn vào nó dưới hệ thống chạy bình thường của bạn, nó có thể khá lớn. Tuy nhiên, dường như không sử dụng bất kỳ dung lượng đĩa cứng nào. Điều này là do nó là một hệ thống tập tin ảo.

/prochệ thống tệp là một hệ thống tệp ảo và nằm trong bộ nhớ, nên một /prochệ thống tệp mới được tạo mỗi khi máy Linux của bạn khởi động lại.

Nói cách khác, nó chỉ là một phương tiện để dễ dàng nhìn trộm và chọc vào ruột của hệ thống Linux thông qua giao diện loại tệp và thư mục. Khi bạn nhìn vào một tệp trong /procthư mục, bạn đang nhìn trực tiếp vào một phạm vi bộ nhớ trong nhân Linux và xem những gì nó có thể thấy.

Các lớp trong hệ thống tập tin

Nhập mô tả hình ảnh ở đây

Ví dụ:

  • Bên trong /proc, có một thư mục cho mỗi tiến trình đang chạy, được đặt tên với ID tiến trình của nó. Các thư mục này chứa các tệp có thông tin hữu ích về các quy trình, chẳng hạn như:
    • exe: đó là một liên kết tượng trưng đến tệp trên đĩa, quá trình được bắt đầu từ đó.
    • cwd: đó là một liên kết tượng trưng đến thư mục làm việc của quá trình.
    • wchan: trong đó, khi đọc, trả về kênh chờ, quá trình được bật.
    • maps: mà khi đọc sẽ trả về các bản đồ bộ nhớ của quá trình.
  • /proc/uptime trả về thời gian hoạt động dưới dạng hai giá trị thập phân tính bằng giây, cách nhau bởi khoảng trắng:
    • lượng thời gian kể từ khi kernel được khởi động.
    • lượng thời gian mà kernel đã không hoạt động.
  • /proc/interrupts: Đối với thông tin liên quan đến ngắt.
  • /proc/modules: Đối với một danh sách các mô-đun.

Để biết thêm thông tin chi tiết, xem man Proc hoặc kernel.org .


"Nếu bạn đã khởi động từ một đĩa CD khởi động và nhìn vào thư mục đó trên ổ cứng của bạn, bạn sẽ thấy nó trống rỗng." Điều đó không cụ thể đối với / Proc, nó chung cho bất kỳ điểm gắn kết nào mà hệ thống tệp bên dưới chưa được gắn kết. Nếu bạn khởi động từ cùng một đĩa CD khởi động đó và làm một cái gì đó như thế mount -t procfs procfs /mnt/proc, bạn sẽ thấy kernel / Proc hiện đang chạy.
một CVn

5

Bạn đúng, chúng không phải là tập tin thực sự.

Nói một cách đơn giản nhất, đó là một cách để nói chuyện với kernel bằng các phương pháp đọc và ghi tệp thông thường, thay vì gọi kernel trực tiếp. Nó phù hợp với triết lý "mọi thứ là một tập tin" của Unix.

Các tệp trong /procthực tế không tồn tại ở bất cứ đâu, nhưng hạt nhân phản ứng với các tệp bạn đọc và ghi trong đó, và thay vì ghi vào bộ lưu trữ, nó báo cáo thông tin hoặc thực hiện một cái gì đó.

Tương tự, các tệp trong tệp /devkhông thực sự là tệp theo nghĩa truyền thống (mặc dù trên một số hệ thống, các tệp trong đó /devthực sự có thể tồn tại trên đĩa, chúng sẽ không có nhiều thứ cho chúng ngoài thiết bị mà chúng đề cập đến) - chúng cho phép bạn nói chuyện cho một thiết bị sử dụng API I / O tệp Unix bình thường - hoặc bất cứ thứ gì sử dụng nó, như shell


1
Nó giống như * nix rằng chỉ một tệp có thể được bảo mật. Vì danh sách kiểm soát truy cập được duy trì trong hệ thống tệp, nên thuận tiện để bảo mật các tài nguyên đặc quyền bằng cách sử dụng cơ chế chung đã được trình điều khiển hệ thống tệp cung cấp. Điều này giúp đơn giản hóa việc thực hiện các công cụ truy cập các cấu trúc kernel và cho phép chúng chạy mà không có quyền nâng cao bằng cách thay vào đó đọc từ các tệp ảo của hệ thống tệp Proc.
Pekka

3

Bên trong /procthư mục, có hai loại nội dung, thư mục được đánh số thứ nhất và loại thứ hai là tệp thông tin hệ thống.

/proclà một hệ thống tập tin ảo. Ví dụ: nếu bạn làm như vậy ls -l /proc/stat, bạn sẽ nhận thấy rằng nó có kích thước 0 byte, nhưng nếu bạn thực hiện con mèo mèo / Proc / stat, bạn sẽ thấy một số nội dung bên trong tệp.

Làm một ls -l /proc, và bạn sẽ thấy rất nhiều thư mục chỉ với số. Những con số này đại diện cho ID quá trình (PID). Các tệp bên trong thư mục được đánh số này tương ứng với quy trình với PID cụ thể đó.

Một số tệp có sẵn bên dưới /proc, chứa thông tin hệ thống như cpuinfo, meminfo và loadavg.

Một số lệnh Linux đọc thông tin từ các /proctệp này và hiển thị nó. Ví dụ, lệnh miễn phí , đọc thông tin bộ nhớ từ /proc/meminfotệp, định dạng tệp và hiển thị nó.

Để tìm hiểu thêm về các /proctệp riêng lẻ , hãy làm man man 5 FILENAME.

/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.

2
Điều này nghe với tôi giống như "làm thế nào để sử dụng những gì trong / Proc?" thay vì "làm thế nào / Proc hoạt động?". Thông tin hữu ích, nhưng không nhất thiết phải trả lời câu hỏi cụ thể này .
một CVn

Mỗi tệp trong / Proc là thông tin thời gian chạy, nghĩa là khi bạn cat / Proc / meminfo một phần của kernel chạy một hàm tạo nội dung tệp.
Shailesh

3

Ví dụ runnable tối thiểu

Theo tôi, cách tốt nhất để hiểu những điều này là thực sự chơi xung quanh chúng, vì vậy đây là một mô-đun hạt nhân tạo ra một mục nhập Procfs:

myprocfs.c

#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h> /* seq_read, seq_lseek, single_open, single_release */
#include <uapi/linux/stat.h> /* S_IRUSR */

static const char *filename = "lkmc_procfs";

static int show(struct seq_file *m, void *v)
{
    seq_printf(m, "abcd\n");
    return 0;
}

static int open(struct inode *inode, struct  file *file)
{
    return single_open(file, show, NULL);
}

static const struct file_operations fops = {
    .llseek = seq_lseek,
    .open = open,
    .owner = THIS_MODULE,
    .read = seq_read,
    .release = single_release,
};

static int myinit(void)
{
    proc_create(filename, 0, NULL, &fops);
    return 0;
}

static void myexit(void)
{
    remove_proc_entry(filename, NULL);
}

module_init(myinit)
module_exit(myexit)
MODULE_LICENSE("GPL");

và sau đó chúng tôi tương tác với nó như:

insmod procfs.ko
cat /proc/lkmc_procfs

và điều đó tạo ra đầu ra:

abcd

Từ ví dụ này, chúng ta thấy rõ rằng proccác tệp cho phép chúng ta thực hiện "các cuộc gọi hệ thống liên quan đến tệp" tùy ý, chẳng hạn như open, readllseek.

Những cuộc gọi hệ thống sau đó có thể được sử dụng để liên lạc tùy ý với kernel.

Do đó, những tệp đó không cần phải làm gì với các tệp thực trong hệ thống tệp và đó là trường hợp của hầu hết tất cả chúng.

Trong ví dụ nhỏ của chúng tôi, ví dụ, chúng tôi chỉ cần tạo một tệp vô dụng để readluôn trả về abcd\n.

Dưới đây là thiết lập QEMU + Buildroot hoàn toàn tự động của tôi để xây dựng và chơi dễ dàng và an toàn với mô-đun hạt nhân này:

Một số giao diện tương tự khác bao gồm:

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.