Что такое открытые файлы в Linux, и равны ли они процессам в Linux?

Вопрос или проблема

Мне нужна помощь в понимании, что такое открытый файл в Linux? Как еще называются открытые файлы в Linux? Являются ли открытые файлы и процессы одним и тем же в Linux? Есть ли разница между открытым файлом и обычным файлом в Linux?

$ lsof /run
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
systemd      1  root   31u  FIFO   0,24      0t0 19314 /run/initctl
systemd      1  root   38u  FIFO   0,24      0t0 19331 /run/dmeventd-server
systemd      1  root   39u  FIFO   0,24      0t0 19332 /run/dmeventd-client
systemd-j  713  root  mem    REG   0,24  8388608 12871 /run/log/journal/aaff550ef54147ddb4d1776d86b04055/system.journal
NetworkMa  881  root   20w  FIFO   0,24      0t0 24896 /run/systemd/inhibit/1.ref
rhsmcertd  906  root    3wW  REG   0,24        0 22479 /run/lock/subsys/rhsmcertd
crond      910  root    3uW  REG   0,24        4 24002 /run/crond.pid
rsyslogd  1224  root  mem    REG   0,24  8388608 12871 /run/log/journal/aaff550ef54147ddb4d1776d86b04055/system.journal
rsyslogd  1224  root   10r   REG   0,24  8388608 12871 /run/log/journal/aaff550ef54147ddb4d1776d86b04055/system.journal
sshd      1651  root   11w  FIFO   0,24      0t0 27390 /run/systemd/sessions/1.ref
sshd      1666 admin   11w  FIFO   0,24      0t0 27390 /run/systemd/sessions/1.ref

В приведенном выше примере первый столбец показывает, какие процессы используют какие файлы в каталоге /run. Правильно ли я понимаю? Являются ли процессы (первый столбец) известными как открытые файлы, или регулярные файлы (последний столбец) известны как открытые файлы?

В следующем примере, 890=sshd

lsof -p 890

из многих строк в выводе, некоторые ниже

CMD   PID USER   FD  TYPE DEVICE SIZE/OFF     NODE NAME

sshd  890 root  txt  REG  253,0   886344   646480 /usr/sbin/sshd
sshd  890 root  mem  REG  253,0  6940392 34389337 /var/lib/sss/mc/group
sshd  890 root  mem  REG  253,0  9253600 34389336 /var/lib/sss/mc/passwd

Итак, в приведенном выше примере, процесс sshd использует passwd, и passwd является одним из открытых файлов, верно?

Как CMD (команда) в первом столбце показывает процесс, а столбец NAME показывает команды (такие как passwd и т.п.)?
Можно ли вручную отредактировать открытый файл?

Являются ли открытые файлы и процессы одним и тем же в Linux?

Совершенно нет.

Хотя процесс всегда имеет ссылку на свой собственный файл (не файловый дескриптор, а отображение в память, которое lsof показывает как txt). Но это не значит, что они одно и то же.

Являются ли процессы (первый столбец) известными как открытые файлы, или регулярные файлы (последний столбец) известны как открытые файлы?

Я бы сказал, что ни то, ни другое. Ссылки, удерживаемые процессами – файловые дескрипторы и тому подобное (четвертый столбец под названием FD) – это и есть “открытые файлы”. Конечно, этот термин часто может относиться и к фактическому файлу, но файловые дескрипторы являются основным способом, с помощью которого программа удерживает что-то открытым, будь то файл, сокет или устройство. (В Windows та же концепция называется “handle”).

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

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

Как CMD (команда) в первом столбце показывает процесс, а столбец NAME показывает команды (такие как passwd и т.п.)?

/var/lib/sss/mc/passwd – это не команда. Это совершенно не связанный файл, который просто имеет такое же название, как команда passwd.

Но в этом отношении, сама команда passwd берется из файла – это на самом деле /usr/bin/passwd – и с ней можно работать как с любым другим файлом (например, как вы работали бы с .exe файлом в Windows). Для большинства программ нет необходимости это делать, но вы можете открыть /usr/bin/passwd в подходящей программе, и он тогда появится как ‘открытый файл’.

Ответ или решение

В мире Linux понимание терминологии, связанной с рабочими процессами и открытыми файлами, имеет важное значение для эффективного администрирования системы. Для начала разберём, что такое открытые файлы в Linux и как они отличаются от процессов.

Теория (Theory)

В Linux понятием "открытый файл" обычно обозначают любое файловое дескрипторное соединение, которое удерживается процессом в системе. Когда процесс открывает файл, система создает дескриптор файла — небольшое положительное целое число, которое служит указателем на этот файл. Этот дескриптор находится в контексте процесса и позволяет последнему выполнять операции ввода-вывода с соответствующим файлом. Термин "открытый файл" может как относиться к самим дескрипторам, так и к файловым объектам, доступ к которым осуществляется через эти дескрипторы.

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

Пример (Example)

Рассмотрим вывод команды lsof, которая позволяет получить информацию о том, какие процессы и какие файлы открыты в системе. Например, вывод ниже демонстрирует, как различные процессы (например, systemd, sshd) удерживают открытые файлы, такие как каналы (FIFO) или обычные файлы:

COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
systemd      1  root   31u  FIFO   0,24      0t0 19314 /run/initctl
systemd      1  root   38u  FIFO   0,24      0t0 19331 /run/dmeventd-server
...
sshd      1651  root   11w  FIFO   0,24      0t0 27390 /run/systemd/sessions/1.ref
sshd      1666 admin   11w  FIFO   0,24      0t0 27390 /run/systemd/sessions/1.ref

В первой колонке COMMAND отображается команда, породившая процесс, в колонке PID — его идентификатор, а столбец FD обозначает открытые дескрипторы файла. Например, в данном случае sshd открывает и использует файл /run/systemd/sessions/1.ref через файловый дескриптор, указанный в колонке FD.

В случае использования команды lsof -p 890, которая отображает данные по конкретному процессу (sshd) с PID 890, можно увидеть следующее:

CMD   PID USER   FD  TYPE DEVICE SIZE/OFF     NODE NAME
sshd  890 root  txt  REG  253,0   886344   646480 /usr/sbin/sshd
sshd  890 root  mem  REG  253,0  6940392 34389337 /var/lib/sss/mc/group

Эти строки показывают, что процесс sshd использует файл /usr/sbin/sshd как исполняемый модуль (txt указывает на то, что это текстовые сегменты), а также некоторые другие ресурсы в качестве памяти.

Применение (Application)

Практическое понимание того, что такое открытые файлы и как они связаны с процессами, помогает более эффективно управлять системой или отлаживать её работу. Например:

  1. Управление ресурсами: Знание того, какие файлы открыты процессами, позволяет идентифицировать утечки ресурсов, такие как ненадлежащие закрытия файлов.

  2. Отладка: Наблюдение за открытыми файлами помогает выявлять проблемы с программами, которые располагают некорректными разрешениями на файлы или пытаются получить доступ к несущестующим ресурсам.

  3. Обеспечение безопасности: Мониторинг открытых файлов позволяет объективно оценить, какие процессы взаимодействуют с критически важными для системы данными, что важно для предотвращения несанкционированного доступа.

За счет управления открытыми файлами администраторы могут гарантировать стабильную и безопасную работу системы. Несмотря на некоторую схожесть в терминологии, "процессы" и "открытые файлы" в Linux принципиально различаются по своей природе и функциям в системе.

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

Капча загружается...