Псевдо-ФС: /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 0 | 2 | 100% | 0 дисков |
| RAID 1 | 2 | 50% (зеркало) | 1 диск |
| RAID 5 | 3 | (n-1)/n | 1 диск |
| RAID 10 | 4 | 50% | зависит от пары |
Ещё одна деталь про пути в системе. Разделение /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: файловая система, живущая в оперативной памяти.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
Что такое pseudo-filesystem?
LIN-007Где в системе можно посмотреть сводку по текущему потреблению памяти?
LIN-012Как менять параметры ядра в рантайме? Как сохранить после ребута?
LIN-079Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс