← Linux: файловая система вглубь
12 мин · средне · Урок 3 из 7

Псевдо-ФС: /proc и /sys

Виртуальные ФС /proc и /sys.

Файлы, которых нет на диске

Обычный файл лежит на разделе, занимает блоки, у него есть inode с метаданными. С /proc и /sys всё иначе.

/proc — виртуальная файловая система с информацией о процессах и ядре (kernel). /sys — виртуальная файловая система про устройства, драйверы и параметры ядра. Слово «виртуальная» здесь буквальное: содержимого нет на диске, ядро генерирует его на лету в момент чтения.

Проверить легко. Смонтированы обе как отдельные типы ФС, а не как раздел диска:

$ mount | grep -E ' /proc | /sys '
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)

Тип proc и sysfs это интерфейсы ядра, а не файловая система на разделе вроде ext4. Отсюда первая ловушка: /proc не занимает место на диске. Он живёт в памяти и собирается заново при каждом обращении.

Что лежит в /proc

Часть путей в /proc — это числа. Каждое число это PID процесса, и внутри такой директории ядро показывает его состояние. Например, /proc/<PID>/status отдаёт память и статус процесса:

$ cat /proc/self/status | head -n 8
Name:   cat
State:  R (running)
Tgid:   4821
Pid:    4821
PPid:   4630
VmSize: 5904 kB
VmRSS:  1152 kB
Threads:        1

VmRSS — сколько физической памяти процесс реально занимает сейчас. /proc/self всегда указывает на процесс, который читает файл, поэтому удобно смотреть без подстановки конкретного PID.

Отдельные файлы вне числовых директорий описывают систему целиком. /proc/meminfo — память машины, /proc/cpuinfo — процессоры:

$ cat /proc/cpuinfo | grep -E 'model name|processor' | head -n 4
processor       : 0
model name      : AMD Ryzen 7 5800X 8-Core Processor
processor       : 1
model name      : AMD Ryzen 7 5800X 8-Core Processor

Вторая ловушка прячется здесь. /proc/cpuinfo выглядит как текстовый файл, но это интерфейс к ядру. Числа в нём ядро формирует при чтении, на диске такого файла нет. cat просто дёргает ядро и печатает ответ.

Что лежит в /sys

/sys организован по устройствам и подсистемам. Сетевые интерфейсы видны в /sys/class/net, блочные устройства (диски) в /sys/block:

$ ls /sys/class/net
enp3s0  lo  wlan0

$ ls /sys/block
nvme0n1  sda

Дальше внутрь: /sys/class/net/enp3s0/address покажет MAC-адрес интерфейса, /sys/block/sda/size покажет размер диска в секторах. Ядро отдаёт эти значения из своих структур, а не из файла на разделе.

Файлы, которые можно писать

Часть путей доступна на запись, и запись меняет поведение ядра. Ветка /proc/sys — это тот же набор параметров, что настраивает sysctl:

$ cat /proc/sys/net/ipv4/ip_forward
0
$ echo 1 > /proc/sys/net/ipv4/ip_forward   # включить форвардинг пакетов
$ sysctl net.ipv4.ip_forward               # то же значение через sysctl
net.ipv4.ip_forward = 1

Запись в такой файл не сохраняет байты на диск. Она передаёт значение ядру, и оно сразу начинает вести себя иначе. После перезагрузки значение вернётся к дефолту, если не записать его в конфиг.

Раньше всё складывали в /etc/sysctl.conf, но на RHEL 8 и 9 такого файла уже нет, а systemd рекомендует отдельные drop-in файлы в /etc/sysctl.d/:

$ echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-local.conf
$ sudo sysctl --system        # применить всё из каталогов sysctl.d

Файлы читаются в порядке имён, поэтому номер побольше перебивает дефолты дистрибутива. sysctl --system показывает, какие файлы подхватил и что применил.

Смежные факты для контекста

Внутри /proc/<PID>/fd видно открытые файловые дескрипторы процесса. Файловый дескриптор — процесс-уникальное неотрицательное целое, которым ядро адресует открытый файл. Дескрипторы 0, 1, 2 это stdin, stdout и stderr:

$ ls -l /proc/self/fd
lrwx------ 1 user user 0 -> /dev/pts/2   # 0: stdin
lrwx------ 1 user user 1 -> /dev/pts/2   # 1: stdout
lrwx------ 1 user user 2 -> /dev/pts/2   # 2: stderr

Через /sys/block видно диски, и часто за ними стоит RAID-массив. Уровни RAID отличаются запасом на отказ и потерей ёмкости:

УровеньМинимум дисковПолезная ёмкостьПереживает отказ
RAID 02100%0 дисков
RAID 1250% (зеркало)1 диск
RAID 53(n-1)/n1 диск
RAID 10450%зависит от пары

Ещё одна деталь про пути в системе. Разделение /bin и /usr/bin по спецификации исторически означало «критичное для загрузки» против «прикладного». На современных дистрибутивах это разделение размыто процессом usrmerge: /bin теперь чаще всего симлинк на /usr/bin:

$ ls -ld /bin
lrwxrwxrwx 1 root root 7 -> usr/bin   # /bin ведёт в /usr/bin

Что важно запомнить

/proc и /sys — виртуальные ФС. Содержимое генерирует ядро при чтении, на диске его нет, места оно не занимает.

/proc/<PID>/status и VmRSS — память процесса; /proc/meminfo и /proc/cpuinfo — про машину; /sys/class/net и /sys/block — про устройства.

cat /proc/cpuinfo читает не файл, а интерфейс к ядру.

/proc/sys доступен на запись через sysctl и сразу меняет поведение ядра; чтобы значение пережило перезагрузку, его кладут в drop-in /etc/sysctl.d/99-local.conf и применяют sysctl --system.

Дескрипторы 0/1/2 это stdin/stdout/stderr; их видно в /proc/<PID>/fd.

В следующем уроке — tmpfs: файловая система, живущая в оперативной памяти.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

Что такое pseudo-filesystem?

LIN-007
02

Где в системе можно посмотреть сводку по текущему потреблению памяти?

LIN-012
03

Как менять параметры ядра в рантайме? Как сохранить после ребута?

LIN-079

Прошли материал до конца? Отметьте урок пройденным.