Как работает / proc / *?

9287
user2064000

Есть много файлов в /proc, как /proc/cpuinfo, /proc/meminfo, /proc/devicesи так далее, что, когда открыт, возвращение системы информации.

Эти файлы, по-видимому, не существуют на самом деле, поскольку их запуск fileтолько говорит о том, что они пусты.

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

Как эти файлы работают точно?

61

4 ответа на вопрос

72
a CVn

It's actually pretty simple, at least if you don't need the implementation details.

First off, on Linux all file systems (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) are implemented in the kernel. Some may offload work to userland code through FUSE, and some come only in the form of a kernel module (native ZFS is a notable example of the latter due to licensing restrictions), but either way there remains a kernel component. This is an important basic.

When a program wants to read from a file, it will issue various system library calls which ultimately end up in the kernel in the form of an open(), read(), close() sequence (possibly with seek() thrown in for good measure). The kernel takes the provided path and filename, and through the file system and device I/O layer translates these to physical read requests (and in many cases also write requests -- think for example atime updates) to some underlying storage.

However, it doesn't have to translate those requests specifically to physical, persistent storage. The kernel's contract is that issuing that particular set of system calls will provide the contents of the file in question. Where exactly in our physical realm the "file" exists is secondary to this.

On /proc is usually mounted what is known as procfs. That is a special file system type, but since it is a file system, it really is no different from e.g. an ext3 file system mounted somewhere. So the request gets passed to the procfs file system driver code, which knows about all these files and directories and returns particular pieces of information from the kernel data structures.

The "storage layer" in this case is the kernel data structures, and procfs provides a clean, convenient interface to accessing those. Do keep in mind that mounting procfs at /proc is simply convention; you could just as easily mount it elsewhere. In fact, that is sometimes done, for example in chroot jails when the process running there needs access to /proc for some reason.

It works the same way if you write a value to some file; at the kernel level, that translates to a series of open(), seek(), write(), close() calls which again get passed to the file system driver; again, in this particular case, the procfs code.

The particular reason why you see file returning empty is that many of the files exposed by procfs are exposed with a size of 0 bytes. The 0 byte size is likely an optimization on the kernel side (many of the files in /proc are dynamic and can easily vary in length, possibly even from one read to the next, and calculating the length of each file on every directory read would potentially be very expensive). Going by the comments to this answer, which you can verify on your own system by running through strace or a similar tool, file first issues a stat() call to detect any special files, and then takes the opportunity to, if the file size is reported as 0, abort and report the file as being empty.

This behavior is actually documented and can be overridden by specifying -s or --special-files on the file invocation, although as stated in the manual page that may have side effects. The quote below is from the BSD file 5.11 man page, dated Oct 17 2011.

Normally, file only attempts to read and determine the type of argument files which stat(2) reports are ordinary files. This prevents problems, because reading special files may have peculiar consequences. Specifying the -s option causes file to also read argument files which are block or character special files. This is useful for determining the filesystem types of the data in raw disk partitions, which are block special files. This option also causes file to disregard the file size as reported by stat(2) since on some systems it reports a zero size for raw disk partitions.

Когда вы смотрите на это с помощью `strace file / proc / version` или` ltrace -S / proc / version`, оптимизация довольно мала. Сначала он вызывает `stat ()` и находит, что размер равен 0, пропуская, таким образом, `open ()` - но перед этим он загружает несколько магических файлов. ott-- 10 лет назад 5
@ ott-- Это действительно странная последовательность событий, но она ** может ** быть связана с тем фактом, что вы можете передавать несколько имен файлов в `file`. Таким образом, файл предварительно загружает магические файлы, а затем обрабатывает параметр командной строки по параметру; вместо того, чтобы перемещать загрузку магического файла в «сделайте это непосредственно перед попыткой определить, какой тип файла * этот * конкретный» является частью кода, что увеличило бы сложность. Вызов `stat ()` и изменение его возвращаемого значения практически безвредны; сложность в отслеживании дополнительных внутренних состояний рискует привнести ошибки. a CVn 10 лет назад 2
@ ott-- На самом деле причина, по которой файл сообщает о том, что файл пуст, заключается в том, что он вызывает stat для обнаружения специальных файлов (именованных каналов, устройств и т. д.), и использует эту возможность, чтобы прекратить обработку пустых файлов. `file -s / proc / version` сообщает“ текст ASCII ”. Gilles 10 лет назад 0
@Gilles `-s` предназначен для специальных устройств block / char. Наконец, я посмотрел на источник `file` и в конце fsmagic.c увидел объяснение, почему он возвращает` ASCII text` вместо `empty`:` Если stat () сообщает нам, что файл имеет нулевую длину, сообщите здесь что файл пуст, поэтому мы можем пропустить всю работу по открытию и чтению файла. Но если была задана опция -s, мы пропускаем эту оптимизацию, поскольку в некоторых системах stat () сообщает о нулевом размере для разделов необработанного диска. ott-- 10 лет назад 4
15
stderr

In this directory, you can control how the kernel views devices, adjust kernel settings, add devices to the kernel and remove them again. In this directory you can directly view the memory usage and I/O statistics.

You can see which disks are mounted and what file systems are used. In short, every single aspect of your Linux system can be examined from this directory, if you know what to look for.

The /proc directory is not a normal directory. If you were to boot from a boot CD and look at that directory on your hard drive, you would see it as being empty. When you look at it under your normal running system it can be quite large. However, it doesn't seem to be using any hard disk space. This is because it is a virtual file system.

Since the /proc file system is a virtual file system and resides in memory, a new /proc file system is created every time your Linux machine reboots.

In other words, it is just a means of easily peeking and poking at the guts of the Linux system through a file and directory type interface. When you look at a file in the /proc directory, you are looking directly at a range of memory in the Linux kernel and seeing what it can see.

The layers in the file system

Enter image description here

Examples:

  • Inside /proc, there is a directory for each running process, named with its process ID. These directories contain files that have useful information about the processes, such as:
    • exe: which is a symbolic link to the file on disk the process was started from.
    • cwd: which is a symbolic link to the working directory of the process.
    • wchan: which, when read, returns the waiting channel the process is on.
    • maps: which, when read, returns the memory maps of the process.
  • /proc/uptime returns the uptime as two decimal values in seconds, separated by a space:
    • the amount of time since the kernel was started.
    • the amount of time that the kernel has been idle.
  • /proc/interrupts: For information related to interrupts.
  • /proc/modules: For a list of modules.

For more detailed information see man proc or kernel.org.

* «Если бы вы загружались с загрузочного компакт-диска и смотрели на этот каталог на вашем жестком диске, вы бы увидели, что он пустой». * Это не относится к / proc, это обычно для любой точки монтирования, где находится базовая файловая система. не был установлен. Если вы загрузитесь с того же загрузочного CD и сделаете что-то вроде `mount -t procfs procfs / mnt / proc`, вы увидите работающее в данный момент ядро ​​/ proc. a CVn 10 лет назад 0
5
LawrenceC

You are correct, they are not real files.

In simplest terms, it's a way to talk to the kernel using the normal methods of reading and writing files, instead of calling the kernel directly. It's in line with Unix's "everything is a file" philosophy.

The files in /proc don't physically exist anywhere, but the kernel reacts to the files you read and write within there, and instead of writing to storage, it reports information or does something.

Similarly, the files in /dev aren't really files in the traditional sense (although on some systems the files in /dev may actually exist on disk, they won't have much to them other than what device they refer to) - they enable you to talk to a device using the normal Unix file I/O API - or anything that uses it, like shells

Больше похоже на * nix, что только файл может быть защищен. Поскольку списки контроля доступа сохраняются в файловой системе, удобно защищать привилегированные ресурсы, используя общий механизм, уже предоставленный драйвером файловой системы. Это упрощает реализацию инструментов, обращающихся к структурам ядра, и позволяет им работать без повышенных разрешений, вместо этого читая из виртуальных файлов файловой системы proc. Pekka 10 лет назад 1
3
Shailesh

Inside the /proc directory, there are two types of content, first numbered directory and the second one is system information file.

/proc is a virtual file system. For example, if you do ls -l /proc/stat, you’ll notice that it has a size of 0 bytes, but if you do “cat /proc/stat”, you’ll see some content inside the file.

Do a ls -l /proc, and you’ll see lot of directories with just numbers. These numbers represents the process IDs (PIDs). The files inside this numbered directory corresponds to the process with that particular PID.

Some files which are available under /proc, contains system information such as cpuinfo, meminfo, and loadavg.

Some Linux commands read the information from these /proc files and display it. For example, the free command, reads the memory information from the /proc/meminfo file, formats it, and displays it.

To learn more about the individual /proc files, do “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. 
Это звучит для меня больше как "как использовать то, что находится в / proc?" а не «как работает / proc?». Полезная информация, но не обязательно отвечающая * на этот конкретный вопрос *. a CVn 10 лет назад 2
Каждый файл в / proc является информацией времени выполнения, это означает, что когда вы используете cat / proc / meminfo, часть ядра запускает функцию, которая генерирует содержимое файла. Shailesh 10 лет назад 0

Похожие вопросы