Dev linux что это
Перейти к содержимому

Dev linux что это

  • автор:

Dev linux что это

Ядро Linux реализует поддержку двух типов устройств – символьных и блочных. Основное их отличие в том, что для блочных устройств операции ввода вывода осуществляются не отдельными байтами (символами), а блоками фиксированного размера.

В Linux вся работа с устройствами ведется через специальные файлы, которые обычно расположены в каталоге /dev . Специальные файлы не содержат данных, а просто служат точками, через которые можно обратиться к драйверу соответствующего устройства. У каждого специального файла есть три характеристики – тип устройства (character или block), старший номер устройства (major number) и младший номер (minor number). Для примера, посмотрим на содержимое каталога /dev :

Как видно, в листинге присутствует описание семи устройств, четырех блочных и трех символьных. Для каждого файла можно увидеть его тип (первая буква в списке прав доступа), пользователя-владельца, группу-владельца, major number, minor number, дату модификации и имя файла.

Для поддержки работы с устройствами в ядре хранятся две таблицы, одна для списка символьных устройств, другая для списка блочных устройств. Каждая строка таблицы сопоставлена какой-то разновидности устройств соответствующего типа – например, для типа “символьные устройства” можно выделить следующие разновидности: COM-порты, LPT-порты, PS/2-мыши, USB-мыши и т.д., для типа “блочные устройства” можно выделить SCSI-диски, IDE-диски, SCSI-CD-приводы, виртуальные диски которыми представляются RAID-контролеры и т.п.

Каждая ячейка в этих системных таблицах сопоставляется конкретному экземпляру устройства. Таким образом, с точки зрения ядра каждое устройство оказывается однозначно проидентифицировано тремя параметрами – типом устройства (блочное или символьное) и двумя числами – номерами строки и номером столбца таблицы, в которой хранится ссылка на драйвер этого устройства.

Пример таблицы символьных и устройств

Диспетчер томов LVM

Микшер первой зв. карты

Первая видеокарта NVidia

Пример таблицы блочных устройств

IDE Primary Master

Раздел 1 на IDE Primary Master

Раздел 2 на IDE Primary Master

Раздел 16 на IDE Primary Master

IDE Primary Slave

Раздел 1 на IDE Primary Slave

Раздел 1 на SCSI-диске 1

Раздел 2 на SCSI-диске 1

Раздел 1 на SCSI-диске 4

При попытке обращения к такому специальному файлу ядро переадресует обращение через нужный драйвер на устройство в соответствии с теми данными, которые указаны в таблице устройств, причем конкретная таблица устройств будет выбрана в зависимости от типа устройства, строка из таблицы будет выбрана по major number, и столбец будет выбран по minor number. Если мы посмотрим на примеры наших таблиц, то увидим, что обращение на специальный файл /dev/ttyS1 , который представляет символьное устройство со старшим номером 4 и младшим номером 65 будет адресовано на последовательный порт COM2, а обращение к файлу /dev/hda2 (блочное устройство со старшим номером 3 и младшим номером 2) будет адресовано на 2-й раздел жесткого диска IDE, работающего в режиме primary master.

13.1. Статическая организация каталога /dev

В настоящее время существует два подхода к организации /dev – статическая организация и динамическая организация. В первом случае в каталоге /dev заранее создаются специальные файлы для всех возможных устройств вне зависимости от того, загружен драйвер соответствующего устройства или нет. Во втором случае специальные файлы в /dev создаются по мере инициализации устройств и загрузки драйверов, и удаляются при выгрузке соответствующего драйвера или удалении устройства.

Процесс работы со статическим /dev особых проблем не вызывает – системный администратор при необходимости просто создает отсутствующие файлы командой mknod или MAKEDEV . В том случае, когда какая-либо программа обращается к устройству, чей драйвер не загружен (или загружен, но ни одного соответствующего устройства не было обнаружено), операционная система возвращает ошибку при попытке открытия файла такого “неверного” устройства. Ниже приведен пример создания специального файла, соответствующего блочному устройству с мажором 8 и минором 33 и попытка его использования (отметим, что этот специальный файл соответствует разделу на жестком диске, который не существует на тестовой машине, где выполнялись эти команды):

Сообщение No such device or address как раз и означает, что записи для данного устройства в таблице блочных устройств не существует.

Ядро Linux совместно с некоторыми системными утилитами поддерживает такую интересную возможность, как загрузка драйверов “по требованию”. Реализуется это следующим образом – в момент, когда какая-либо программа пытается открыть специальный файл, не связанный ни с каким драйвером, ядро делает попытку подобрать соответствующий драйвер самостоятельно. Необходимый драйвер для каждого специального файла определяется в файле /etc/modules.conf путем задания специального алиаса (alias) для модуля. Для активизации автоматической загрузки драйвера какого-либо символьного устройства в большинстве случаев достаточно просто записать в /etc/modules.conf строку следующего вида:

Для блочных устройств соответствующая запись слегка меняет свою форму:

X и Y – это major и minor специального файла, попытка открыть который должна активизировать автоматическую загрузку драйвера. Владельцы видеокарт на чипе nVidia могут увидеть этот подход в действии – программа инсталляции драйвера nVidia автоматически прописывает в modules.conf запись для загрузки «по требованию» той части драйвера, которая работает в режиме ядра.

Вместо X или Y может также быть подставлен символ “*” , означающий “любое число”. Например, пусть в modules.conf будет написан следующий текст:

Тогда при обращении к любому символьному устройству с major number равным 81 и которое не ассоциировано ни с каким драйвером, система попытается загрузить драйвер bttv (драйвер TV-тюнера на основе чипа bt848).

Эта возможность обеспечивает Linux возможность плавной загрузки и эффективного использования ресурсов – драйвер не загружается, пока в нем не возникнет необходимости. К сожалению, за простоту этой схемы приходится платить большим количеством специальных файлов в /dev .

13.2. Что такое DevFS

Для того, чтобы избавить администратора от ручного создания специальных файлов и для уменьшения количества файлов в /dev был реализован второй способ организации /dev – динамическое создание специальных файлов процессе загрузки драйверов. Реализовано это было следующим образом:

Ядро монтирует к каталогу /dev специальную файловую систему, называемую devfs – эта файловая система хранится целиком в оперативной памяти и не занимает никакого места на диске. Когда какой-либо драйвер в процессе загрузки или работы обнаруживает обслуживаемое им устройство, он регистрирует это устройство и сообщает о нем драйверу devfs. Драйвер devfs создает специальный файл, который виден прикладным программам и может быть корректно открыт. При выгрузке же драйвер устройства сообщает devfs о том, что соответствующее устройство уже не активно, и драйвер devfs удаляет запись о соответствующем специальном файле из файловой системы devfs.

Файловая система devfs отличается тем, что как правило специальный файл для устройства создается с длинным путем – например, для раздела на scsi-диске путь может выглядеть примерно так: /dev/scsi/host1/bus1/target3/lun4/partition2 .

Эта особенность является весьма важным плюсом devfs, поскольку она позволяет адресовать дисковые устройства путем указания логического пути их подключения и избежать смены имен SCSI-дисков в некоторых случаях (об этих случаях будет рассказано позднее).

Для того, чтобы организовать более прозрачную структуру каталогов и файлов устройств, используется специальный демон devfsd. Он взаимодействует с драйвером devfs и ядром и в процессе активизации и деактивизации устройств он создает и удаляет символьные ссылки вида /dev/disks/disc0 или /dev/hda1 .

Надо отметить, что схема динамического /dev в некотором смысле близка к той организации каталога /dev , которая используется некоторыми коммерческими UNIX-системами (например, в Solaris), когда есть виртуальная файловая система /devices , и на ее файлы создаются ссылки из /dev , только в Linux роль программы cfgadm играет демон devfsd, и все изменения в состав /dev вносятся автоматически.

С помощью devfsd файловая система devfs также реализует автоматическую загрузку модулей, но в этом случае выбор модуля идет не через комбинацию type/major/minor, а путем указания имени запрошенного файла – когда приложение пытается открыть несуществующий файл устройства, devfs передает имя запрошенного файла демону devfsd, и последний загружает необходимые модули, например такой код в файле modules.devfs :

Приведет к тому, что при попытке обращения к любому файлу, чей полный путь начинается строкой /dev/nvidia , будет произведена попытка загрузить драйвер nvidia.o (для ядра 2.6 nvidia.ko )

В принципе, на сегодняшний день выбор того, каким именно образом необходимо организовывать /dev , остается за пользователем и создателем дистрибутива. Например, в Mandrake Linux используется devfs, а в RedHat, Fedora и SUSE каталог /dev организован статическим образом, а опытные пользователи часто меняют способ организации /dev в зависимости от своих предпочтений.

13.3. Немного о UDEV

В современных дистрибутивах и ядрах поддержка devfs/devfsd отключена, и на смену этой паре пришел специальный демон, называемый udev. В отличие от devsfd, который требовал поддержки со стороны ядра, udev такой поддержки не требует. При инициализации устройства ядро подает сигнал через файловую систему sysfs, и демон udevd, получив сигнал об этом событии, самостоятельно создает соответствующий специальный файл устройства в каталоге /dev в соответствии с правилами, описанными в его конфигурационных файлах. При необходимости в этих файлах можно указать например вызов некоторой внешней программы, создание символьной ссылки и так далее.

Например, если некоторое устройство после подключения перед началом работы требует дополнительной настройки с использованием внешних программ, можно создать соответствующее правило для udev, в котором будет указано какую программу вызвать и какие параметры ей необходимо передать – в частности, это может потребоваться для data-кабелей к некоторым мобильным телефонам Nokia, для устройств которым для корректной работы требуется firmware, или для сохранения или восстановления текущих настроек устройства.

Тем не менее, несмотря на внешние отличия между статической организацией /dev , devfs и udev, следует помнить что это всего лишь способ заполнения каталога /dev , и во всех случаях в конечном итоге на файловой системе создаются те же самые файлы символьных и блочных устройств.

Device file

In Unix-like operating systems, a device file or special file is an interface to a device driver that appears in a file system as if it were an ordinary file.

On Linux they are in the /dev directory, according to the Filesystem Hierarchy Standard.

On Arch Linux the device nodes are managed by udev.

Block devices

A block device is a special file that provides buffered access to a hardware device. For a detailed description and comparison of virtual file system devices, see Wikipedia:Device file#Block devices.

Block device names

The beginning of the device name specifies the kernel’s used driver subsystem to operate the block device.

Storage devices, like hard disks, SSDs and flash drives, that support the SCSI command (SCSI, SAS, UASP), ATA (PATA, SATA) or USB mass storage connection are handled by the kernel’s SCSI driver subsystem. They all share the same naming scheme.

The name of these devices starts with sd . It is then followed by a lower-case letter starting from a for the first discovered device ( sda ), b for the second discovered device ( sdb ), and so on.

  • /dev/sda — device a , the first discovered device.
  • /dev/sde — device e , the fifth discovered device.

The name of storage devices, like SSDs, that are attached via NVM Express (NVMe) starts with nvme . It is then followed by a number starting from 0 for the device controller, nvme0 for the first discovered NVMe controller, nvme1 for the second, and so on. Next is the letter «n» and a number starting from 1 expressing the device on a controller, i.e. nvme0n1 for first discovered device on first discovered controller, nvme0n2 for second discovered device on first discovered controller, and so on.

  • /dev/nvme0n1 — device 1 on controller 0 , the first discovered device on the first discovered controller.
  • /dev/nvme2n5 — device 5 on controller 2 , the fifth discovered device on the third discovered controller.

alt=»Tango-view-fullscreen.png» width=»48″ height=»48″ />This article or section needs expansion. alt=»Tango-view-fullscreen.png» width=»48″ height=»48″ />

SD cards, MMC cards and eMMC storage devices are handled by the kernel’s mmc driver and name of those devices start with mmcblk . It is then followed by a number starting from 0 for the device, i.e. mmcblk0 for first discovered device, mmcblk1 for second discovered device and so on.

  • /dev/mmcblk0 — device 0 , the first discovered device.
  • /dev/mmcblk4 — device 4 , the fifth discovered device.
SCSI optical disc drive

The name of optical disc drives (ODDs), that are attached using one of the interfaces supported by the SCSI driver subsystem, start with sr . The name is then followed by a number starting from 0 for the device, ie. sr0 for the first discovered device, sr1 for the second discovered device, and so on.

Udev also provides /dev/cdrom that is a symbolic link to /dev/sr0 . The name will always be cdrom regardless of the drive’s supported disc types or the inserted media.

  • /dev/sr0 — optical disc drive 0 , the first discovered optical disc drive.
  • /dev/sr4 — optical disc drive 4 , the fifth discovered optical disc drive.
  • /dev/cdrom — a symbolic link to /dev/sr0 .
virtio-blk

The name of drives attached to a virtio block device (virtio-blk) interface start with vd . It is then followed by a lower-case letter starting from a for the first discovered device ( vda ), b for the second discovered device ( vdb ), and so on.

  • /dev/vda — device a , the first discovered device.
  • /dev/vde — device e , the fifth discovered device.
Partition

Partition device names are a combination of the drive’s device name and the partition number assigned to them in the partition table, i.e. /dev/drivepartition . For drives whose device name ends with a number, the drive name and partition number is separated with the letter «p», i.e. /dev/driveppartition .

  • /dev/sda1 — partition 1 on /dev/sda .
  • /dev/nvme2n5p3 — partition 3 on /dev/nvme2n5 .
  • /dev/mmcblk3p4 — partition 4 on /dev/mmcblk3 .
  • /dev/vda1 — partition 1 on /dev/vda .
  • /dev/loop0p2 — partition 2 on /dev/loop0 .

Utilities

lsblk

The util-linux package provides the lsblk(8) utility which lists block devices, for example:

In the example above, only one device is available ( sda ), and that device has three partitions ( sda1 to sda3 ), each with a different file system.

wipefs

alt=»Tango-view-fullscreen.png» width=»48″ height=»48″ />This article or section needs expansion. alt=»Tango-view-fullscreen.png» width=»48″ height=»48″ />

wipefs can list or erase file system, RAID or partition-table signatures (magic strings) from the specified device to make the signatures invisible for libblkid(3) . It does not erase the file systems themselves nor any other data from the device.

See wipefs(8) for more information.

For example, to erase all signatures from the device /dev/sdb and create a signature backup

Understanding /dev and its subdirs and files

Tim's user avatar

Almost all the files under /dev are device files. Whereas reading and writing to a regular file stores data on a disk or other filesystem, accessing a device file communicates with a driver in the kernel, which generally in turn communicates with a piece of hardware (a hardware device, hence the name).

There are two types of device files: block devices (indicated by b as the first character in the output of ls -l ), and character devices (indicated by c ). The distinction between block and character devices is not completely universal. Block devices are things like disks, which behave like large, fixed-size files: if you write a byte at a certain offset, and later read from the device at that offset, you get that byte back. Character devices are just about anything else, where writing a byte has some immediate effect (e.g. it’s emitted on a serial line) and reading a byte also has some immediate effect (e.g. it’s read from the serial port).

The meaning of a device file is determined by its number, not by its name (the name matters to applications, but not to the kernel). The number is actually two numbers: the major number indicates which driver is responsible for this device, and the minor number allows a driver to drive several devices¹. These numbers appear in the ls -l listing, where you would normally find the file size. E.g. brw-rw—- 1 root disk 8, 0 Jul 12 15:54 /dev/sda → this device is major 8, minor 0.

Some device files under /dev don’t correspond to hardware devices. One that exists on every unix system is /dev/null ; writing to it has no effect, and reading from it never returns any data. It’s often convenient in shell scripts, when you want to ignore the output from a command ( >/dev/null ) or run a command with no input ( </dev/null ). Other common examples are /dev/zero (which returns null bytes ad infinitum) /dev/urandom (which returns random bytes ad infinitum).

A few device files have a meaning that depends on the process that accesses it. For example, /dev/stdin designates the standard input of the current process; opening from has approximately the same effect as opening the original file that was opened as the process’s standard input. Somewhat similarly, /dev/tty designates the terminal to which the process is connected. Under Linux, nowadays, /dev/stdin and friends are not implemented as character devices, but instead as symbolic links to a more general mechanism that allows every file descriptor to be referenced (as opposed to only 0, 1 and 2 under the traditional method); for example /dev/stdin is a symbolic link to /proc/self/fd/0 . See How does /dev/fd relate to /proc/self/fd/?.

You’ll find a number of symbolic links under /dev . This can occur for historical reasons: a device file was moved from one name to another, but some applications still use the old name. For example, /dev/scd0 is a symbolic link to /dev/sr0 under Linux; both designate the first CD device. Another reason for symbolic links is organization: under Linux, you’ll find your hard disks and partitions in several places: /dev/sda and /dev/sda1 and friends (each disk designated by an arbitrary letter, and partitions according to the partition layout), /dev/disk/by-id/* (disks designated by a unique serial number), /dev/disk/by-label/* (partitions with a filesystem, designated by a human-chosen label); and more. Symbolic links are also used when a generic device name could be one of several; for example /dev/dvd might be a symbolic link to /dev/sr0 , or it might be a link to /dev/sr1 if you have two CD readers and the second one is to be the default DVD reader.

Finally, there are a few other files that you might find under /dev , for traditional reasons. You won’t find the same on every system. On most unices, /dev/log is a socket that programs use to emit log messages. /dev/MAKEDEV is a script that creates entries in /dev . On modern Linux systems, entries in /dev/ are created automatically by udev, obsoleting MAKEDEV .

¹ This is actually no longer true under Linux, but this detail only matters to device driver writers.

Файловые системы /dev и /proc в Linux 2.4 0

Статья была опубликована 1 февраля 2010 года в 00:00, а последний раз правилась 4 февраля 2010 года в 00:05.

В Linux есть две файловые системы, которые абсолютно непоняты новым пользователям. У этих двух каталогов, /proc и /dev, нет аналогов в Windows. Тем не менее, они очень важны для понимания и использования Linux.

В Linux есть две файловые системы, которые абсолютно непоняты новым пользователям. У этих двух каталогов, /proc и /dev, нет аналогов в Windows. Тем не менее, они очень важны для понимания и использования Linux.

Данная статья представляет собой краткий обзор файловых систем для устройств (/dev) и для процессов (/proc). В ней рассказывается о том, что они из себя представляют, как работают и как используются.

/dev: файловая система для устройств

Устройства: В Linux’е устройство является специальным «оборудованием» (или кодом, эмулирующим его), которое представляет методы для ввода или вывода информации (IO — Input/Output). Например, клавиатура — устройство для ввода. Жесткий диск — устройства для ввода (запись) и вывода (чтение). Большинство устройств в Linux’е представлено как файлы в особой файловой системе (за исключением сетевых карт). Эти файлы хранятся в каталоге /dev, куда к ним обращается система для выполнения задач, связанных с вводом/выводом.

Грубо говоря, устройства можно разделить на две категории: символьные и блочные. Символьные устройства вводят/выводят по символам. Наиболее показательным примером служит клавиатура, у которой нажатие каждой клавиши формирует символ, передаваемый компьютеру. Мышь работает немного по-другому. Каждое движение или нажатие на кнопку отправляет символ на /dev/mouse.

Блочные устройства считывают данные большими объемами. Примерами служат устройства для хранения данных, такие как IDE жесткие диски (/dev/hd), SCSI жесткие диски (/dev/sd) и CD-ROM’ы (например, /dev/cdrom0 — символическая ссылка на первый CD-ROM). Операции ввода/вывода блочные устройства проводят с определенными блоками данных, что позволяет работать с большими объемами информации более эффективно.

Названия устройств: Устройства часто называются путем сокращения имен представляемого ими оборудования. Устройства с именами /dev/fb представляют буферы фреймов (frame buffers) для графики. Устройства /dev/hd представляют IDE жесткие диски (hard disks). В некоторых случаях для пояснения того, чем является устройство, используются символические ссылки: например, /dev/mouse, устройство, представляющее мышь, может быть прилинковано к последовательному, USB или PS2 устройству, в зависимости от железа. Символическая ссылка помогает и человеку, и машине разобраться, какое из устройств — мышь.

Иногда бывает несколько устройств одного типа. Например, у машины два ATAPI CD-ROM’а. Каждому CD-приводу нужен файл в /dev. В таком случае, возможен вариант, что /dev/cdrom0 будет первым CD-ROM’ом, а /dev/cdrom1 — вторым.

С именами жестких дисков немного сложнее. Название устройства жесткого диска зависит от типа диска, его позиции и раздела (partition’а). Первый жесткий диск может быть назван /dev/hda, где часть «hd» означает, что это IDE жесткий диск, а «a» показывает, что это первый жесткий диск. Тогда /dev/hdb будет ссылаться на второй жесткий диск. Каждый жесткий диск разбит на разделы. Первый раздел первого жесткого диска получит название /dev/hda1, где единица в конце обозначает номер раздела. Обратите внимание на то, что, если индексы некоторых устройств (например, /dev/cdrom0) могут начинаться с нуля, то индекс устройств с разделами обычно начинается с единицы. Вот примерный список файлов в /dev для двух IDE жестких дисков:

  • /dev/hda;
  • /dev/hda1;
  • /dev/hda2;
  • /dev/hda3;
  • /dev/hda4;
  • /dev/hdb;
  • /dev/hdb1;
  • /dev/hdb2;
  • /dev/hdb3.

SCSI жесткие диски используют /dev/sd вместо /dev/hd, но все остальное выглядит также. /dev/sda1 ссылается на первый раздел первого SCSI жесткого диска.

Специальные устройства: Существует несколько специальных устройств, которые порой бывают очень полезны: /dev/null, /dev/zero, /dev/full и /dev/random.

Нулевое устройство, /dev/null представляет собой что-то типа «мусорной корзины». Часто некоторые программы выводят множество ненужной информации. Shell-скрипты обычно используют /dev/null для того, чтобы пользователь не видел ненужных ему сообщений от вызываемых утилит. Вот пример вызова модуля ядра с выводом всех сообщений в /dev/null.

/dev/zero близок к /dev/null. Как и /dev/null, устройство может быть использовано для блокирования вывода ненужной информации, но чтение /dev/zero возвращает \0 символы (чтение /dev/null возвращает символы end-of-file — конец файла). Поэтому /dev/zero обычно используется для создания пустых файлов.

Такая команда (см. выше) создаст файл размером в 100 кб, наполненный null-символами.

/dev/full служит для имитации «полного» устройства. Запись в /dev/full сопровождается ошибкой. «Полное» устройство полезно для того, чтобы посмотреть, как тестируемое приложение будет себя вести при попытки доступа к заполненному устройству (т.е. например, к жесткому диску, на котором не осталось места).

Устройства /dev/random и /dev/urandom создают «случайные» данные. Хотя вывод обоих может показаться абсолютно случайным, /dev/random более случаен чем /dev/urandom. /dev/random создает случайные символы, основываясь на «окружающем шуме». Так как количество этого случайного шума ограничено, /dev/random работает медленно и может временно останавливаться для дальнейшего сбора данных. /dev/urandom использует тот же шум, что и /dev/random, но если случайных данных больше нет, оно создает псевдо-случайные данные. Таким образом увеличивается его скорость, но уменьшается безопасность.

Старая файловая система /dev: Раньше файловая система /dev была частью обычной файловой системы. Она состояла из специальных файлов, созданных однажды (обычно при установке системы) и сохраненных на жестком диске.

В старых системах файловая система /dev должна содержать информацию обо всех устройствах, которые могут быть подключены к компьютеру. Из-за этого /dev была слишком большой — приходилось хранить сведения о множестве жестких дисков, дисководов и т.п. Ранее мы рассматривали список разделов жесткого диска hdb. В старой файловой системе /dev приходилось содержать файлы с /dev/hdb1 до /dev/hdb11. Чтобы выяснить, какие устройства действительно привязаны к разделам жесткого диска (если помните, у меня всего три раздела на hdb), нужно вызвать специальную утилиту. Команда «file -s hdb*» поможет в этом разобраться:

Если указанного файла устройства не было, приходилось его создавать с помощью mknod или другой программы (типа MAKEDEV). Хотя «старый способ» работал, он был сложен и неудобен.

DevFS: В ядрах 2.4.x была представлена альтернативная дисковая файловая система /dev. Эта альтернатива, DevFS, подключала код нового устройства в ядро. В DevFS файловая система /dev создается во время каждого запуска компьютера и сохраняется в оперативной памяти, а не на жестком диске. При использовании этой модели пропадает нужда в поддержке списка всех возможных устройств, а когда появляется новое устройство, ядро просто делает для него запись в /dev. Если же устройствам нужна особая настройка в DevFS, существует конфигурационный файл (обычно /etc/devfsd.conf).

/proc: Файловая система для процессов

Процессы: В любое время в Linux’е одновременно запущено множество процессов. Некоторые из них, такие как оконные менеджеры, email-клиенты и Web-браузеры, видны конечному пользователю. Другие, вроде серверов и вспомогательных процессов, в глаза не бросаются, но запущены в фоновом режиме, выполняя задания, не требующие каких-либо действий со стороны пользователя. Запуск «ps -ef» в shell’е выведет список всех запущенных на данный момент процессов. А выглядеть будет примерно так:

Многие из задач в выводе ps являются процессами, работающими в фоновом режиме. Те, что взяты в квадратные скобочки — процессы ядра. Только некоторые, вроде процессов kde и записей в конце списка, являются процессами, с которыми я взаимодействую напрямую.

Для управления системой ядро должно хранить информацию о каждом запущенном процессе, включая само себя. Также должна быть возможность просмотра сведений о запущенных приложениях пользовательского уровня (хорошим примером служит «ps», а также «top»). В файловой системе /proc ядро и хранит информацию о процессах.

Как и DevFS, /proc хранится в памяти, а не на диске. Если вы посмотрите в файл /proc/mounts (в котором приводится список всех примонтированных файловых систем), то увидите строку вроде этой:

/proc контролируется ядром, у этой файловой системы нет «под собой» какого-либо устройства. Так как в ней в основном содержится информация, управляемая ядром, наиболее логичным место для хранения такой информации является память, также контролируемая ядром.

Информация о запущенных процессах: Чтобы хранить информацию обо всех процессах, ядро присваивает каждому из них PID (Process ID — идентификатор процесса) в виде числа. Запуск команды «ps -ef» (см. выше) выведет список всех запущенных процессов в порядке их PID’ов (вторая колонка). Файловая система /proc хранит информацию о каждом PID.

В /proc названиями многих каталогов являются числа. Эти директории ссылаются на номера PID. В таких каталогах находятся файлы, которые предоставляют подробную информацию о положении, окружении и прочих деталях процесса. В выводе ps (см. выше) была следующая строка:

Этот процесс — запущенный bash shell, имеющий PID 1219. Каталог /proc/1219 содержит информацию об этом процессе.

В файле «cmdline» располагается команда, которая вызвала процесс. В файле «environ» находятся данные о значениях окружения для процесса. «status» содержит информацию о статусе процесса, среди которой пользовательский (UID) и групповой (GID) идентификаторы для пользователя, запустившего процесс, идентификатор родительского процесса (parent process ID — PPID) и текущий статус процесса (например, «Sleep» или «Running»).

У каждого каталога процесса есть несколько символических ссылок. «cwd» ссылается на текущий рабочий каталог для процесса. «exe» — ссылка на исполняемую программу процесса, а «root» ссылается на каталог, который процесс рассматривает как корневой (обычно «/»). В каталоге «fd» содержится список символических ссылок на дескрипторы файлов, используемых процессом.

Существуют и другие файлы в каталоге процесса, предоставляющие исчерпывающую информацию: от занятности процессора и памяти до количества времени, которое запущен процесс. Большая часть этих файлов описана в документации исходников ядра («Documentation/file systems/proc.txt»), а также доступна в man — «man proc».

Информация о ядре: Кроме хранения сведений о процессах, файловая система /proc содержит множество информации, самостоятельно созданной ядром для описания общего состояния системы.

Ядро и модули могут создавать файлы в /proc для того, чтобы предоставить информацию о своем текущем состоянии. Например, /proc/fb показывает, какие сейчас доступны устройства типа frame buffer (буферы фреймов обычно используются для отображения загрузочного логотипа).

Обратите внимание, что 0 ссылается на индекс frame buffer’а и устройство /dev/fb0. Если бы у меня был второй framebuffer, то появилась бы еще и строка с 1, соответствующая /dev/fb1. Часто данные proc ссылаются на устройства в /dev.

В /proc хранится немало информации о железе. В файле /proc/pci написано про все обнаруженные в системе PCI устройства. Запуск команды «lspci» выводит идентичную информацию, так как использует /proc/pci для получения сведений об устройствах. В /proc/bus находятся каталоги для bus-архитектур (PCI, PCCard, USB), в которых содержится информация об устройствах, присоединенных таким образом (PCI, PCCard, USB). Информация о сети располагается в /proc/net. Информацию о жестких дисках можно найти в /proc/ide и /proc/scsi (в зависимости от типа устройства). В /procs/devices присутствует список всех устройств системы (они разделены на две категории: «block» — блочные, «character» — символьные).

В действительности, в /proc находится намного больше файлов, чем было описано здесь. У каждого ядра они могут несколько различаться, в зависимости от того, что было включено в ядро, какое железо и программное обеспечение используется и в каком состоянии в настоящий момент находится компьютер. К некоторым из этих файлов постоянно обращается машина, а другие предоставляют «интуитивную» информацию.

Работа с процессами через /proc: Некоторые файлы /proc предназначены не только для чтения. Запись в них может влиять на состояние ядра. Просмотр содержимого файла в /proc обычно безопасно, но запись в них без точной уверенности в своих действиях может приводить к фатальным последствиям. Несмотря на это, иногда запись в /proc — единственный способ связи с ядром.

Например, в некоторых версиях ядра присутствует опция включения Web-сервера (khttp), работающего на уровне ядра. Из-за того, что запуск Web-сервера по умолчанию является риском с точки зрения безопасности, khttp требует записи в /proc для запуска.

Когда ядро видит, что содеримое /proc/sys/net/khttps/start меняется с 0 (по умолчанию) на 1, оно запускает сервер khttpd.

Существуют десятки других настраиваемых параметров в /proc — некоторые для конфигурации железа, другие для управления ядром. Однако, многие из них являются низкоуровневыми и могут привести к печальным последствиям, если указать неправильные значения. Поэтому, если вы твердо не уверены в своих действиях, менять параметры в /proc строго не рекомендуется.

/proc и /dev представляют интерфейсы к внутренностям Linux’а с помощью файлов. Они способствуют настройке и получению сведений об устройствах и процессах системы. Благодаря ним, можно с легкостью обновлять, изучать, запускать систему и устранять разнообразные неполадки. Понимание и применение знаний этих двух файловых систем являются ключом к созданию «более вашей» Linux-системы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *