В нашей продолжающейся серии статей о системе Linux мы рассмотрим основные утилиты командной строки, которые предоставляют информацию об оборудовании и состоянии системы. После наших предыдущих обсуждений lscpu, lsusb, dmidecode и lspci мы теперь обратим внимание на lsof и lsblk. Эти инструменты особенно полезны для поиска открытых файлов, активных сетевых подключений и смонтированных блочных устройств в вашей системе Fedora Linux.

Поиск открытых файлов с помощью lsof

lsof (list open files) - мощный инструмент командной строки. Поскольку почти все в Linux рассматривается как файл, lsof обеспечивает детальное представление о многих частях вашей системы. Он перечисляет какие файлы используются, какие процессы к ним обращаются и даже какие сетевые порты открыты (см., например, Wikipedia о сетевых сокетах для получения дополнительной информации).

Пример использования

Для начала просто выполните команду lsof, что бы получить список открытых в системе файлов:

1
$ sudo lsof

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

Пример 1: поиск открытых пользователем или процессом файлов

lsof может быть очень полезен, что бы определить какие файлы открыты конкретным пользователем или процессом.

Вывести список файлов открытых конкретным пользователем можно так:

1
$ sudo lsof -u <username>

Такая команда вернет список открытых файлов занятых указанным пользователем. Например:

1
$ sudo lsof -u johndoe

Вы увидите такую информацию как: идентификатор процесса (PID), файловый дескриптор, тип файла и его путь.

Для фильтрации вывода по процессу нужно передать флаг -p:

1
$ lsof -p <PID>

Это особенно полезно для устранения неполадок, связанных с определенными процессами или когда вам нужно проверить, какие файлы служба держит открытыми. Используйте sudo, если процесс не принадлежит вашему пользователю.

Пример вывода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ lsof -p 873648
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
bash    873648 user  cwd    DIR   0,39     8666      257 /home/user
bash    873648 user  rtd    DIR   0,35      158      256 /
bash    873648 user  txt    REG   0,35  1443376 12841259 /usr/bin/bash
bash    873648 user  mem    REG   0,33          12841259 /usr/bin/bash (path dev=0,35)
bash    873648 user  mem    REG   0,33          14055145 /usr/lib/locale/locale-archive (path dev=0,35)
bash    873648 user  mem    REG   0,33          14055914 /usr/lib64/libc.so.6 (path dev=0,35)
bash    873648 user  mem    REG   0,33          13309071 /usr/lib64/libtinfo.so.6.4 (path dev=0,35)
bash    873648 user  mem    REG   0,33          14059926 /usr/lib64/gconv/gconv-modules.cache (path dev=0,35)
bash    873648 user  mem    REG   0,33          14055911 /usr/lib64/ld-linux-x86-64.so.2 (path dev=0,35)
bash    873648 user    0u   CHR  136,3      0t0        6 /dev/pts/3
bash    873648 user    1u   CHR  136,3      0t0        6 /dev/pts/3
bash    873648 user    2u   CHR  136,3      0t0        6 /dev/pts/3
bash    873648 user  255u   CHR  136,3      0t0        6 /dev/pts/3

Пример 2: идентификация открытых сетевых подключений

Благодаря возможности показывать список сетевых подключений, lsof так же становится удобным инструментом для диагностики сетевых проблем, поскольку он доступен обычно даже в защищенных и минимальных системах.

To display all open network connections (TCP/UDP sockets), run: Что бы показать все открытые сетевые соединения ( TCP/UDP сокеты), выполните:

1
$ sudo lsof -i

Команда выведет список активных интернет соединений вместе с используемым для них протоколом, портом и информацией о процессе.

Вы можете отфильтровать вывод для специфического протокола (например, TCP или UDP), включить или исключить IPv4 и IPv6, а так же комбинировать несколько значений (раздел примеров man lsof предоставляет много полезной информации, включая отрицание):

1
2
3
4
5
$ sudo lsof -i tcp
$ sudo lsof -i udp
$ sudo lsof -i 4tcp
$ sudo lsof -i 6tcp
$ sudo lsof -i [email protected]

Для подключений связанных с определенным портом:

1
$ sudo lsof -i :<port_number>

Например, вывести список соединений к порту 22 (SSH):

1
2
3
4
$ sudo lsof -i :22
COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    904379 root    3u  IPv4 5622530      0t0  TCP *:ssh (LISTEN)
sshd    904379 root    4u  IPv6 5622532      0t0  TCP *:ssh (LISTEN)

Эта информация может иметь решающее значение для выявления несанкционированных подключений или простого мониторинга сетевой активности в системе с целью отладки.

Исследование блочных устройств с помощью lsblk

Другой полезный инструмент - lsblk, который показывает информацию о все доступных в вашей системе блочных устройствах. Блочные устройства включают в себя жесткие диски (HDD), SSD и USB-накопители. Эта команда обеспечивает древовидное представление, что помогает вам понять взаимосвязи между разделами, устройствами и их точками монтирования.

Пример использования

Запуск lsblk без каких-либо параметров предоставляет четкую иерархическую структуру блочных устройств:

1
$ lsblk

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

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

1
$ lsblk -f

При этом будут отображены не только блочные устройства, но и сведения о файловых системах на каждом разделе, включая тип (например, ext4, vfat, swap), UUID и текущие точки монтирования.

Если вам нужно меньше информации о самих устройствах (без отображения разделов или точек монтирования), будет полезен параметр -d:

1
$ lsblk -d

Также есть опция -J или –json. Если используется, команда выводит информацию в формате JSON. Это обеспечивает структурированное представление, которое особенно полезно для сценариев и автоматизации.

Примеры вывода с моего ноутбука (некоторая длинная информация, например UUID, удалена для удобства чтения):

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
$ lsblk
NAME                     MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda                        8:0    1     0B  0 disk  
sdb                        8:16   1     0B  0 disk  
sdc                        8:32   1     0B  0 disk  
zram0                    252:0    0     8G  0 disk  [SWAP]
nvme0n1                  259:0    0 931,5G  0 disk  
├─nvme0n1p1              259:1    0   600M  0 part  /boot/efi
├─nvme0n1p2              259:2    0     1G  0 part  /boot
└─nvme0n1p3              259:3    0 929,9G  0 part  
  └─luks-84257c20[...]   253:0    0 929,9G  0 crypt /home


$ lsblk -d
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda       8:0    1     0B  0 disk 
sdb       8:16   1     0B  0 disk 
sdc       8:32   1     0B  0 disk 
zram0   252:0    0     8G  0 disk [SWAP]
nvme0n1 259:0    0 931,5G  0 disk

$ lsblk -f
NAME                FSTYPE [...]LABEL    UUID           FSAVAIL FSUSE% MOUNTPOINTS
sda
sdb
sdc
zram0                                                                  [SWAP]
nvme0n1             
├─nvme0n1p1         vfat                 4C5B-4355      579,7M  3%     /boot/efi
├─nvme0n1p2         ext4                 30eff827[...]  605M    31%    /boot
└─nvme0n1p3         crypto_LUKS          84257c20[...]              
  └─luks-84257[...] btrfs       fe[...]  666f9d6f[...]  303,1G  67%    /home
                                                                       /
$ lsblk -f -J
{
   "blockdevices": [
   [...],{
         "name": "nvme0n1",
         "fstype": null,
         "fsver": null,
         "label": null,
         "uuid": null,
         "fsavail": null,
         "fsuse%": null,
         "mountpoints": [
             null
         ],
         "children": [
            {
               "name": "nvme0n1p1",
               "fstype": "vfat",
               "fsver": "FAT32",
               "label": null,
               "uuid": "4C5B-4355",
               "fsavail": "579,7M",
               "fsuse%": "3%",
               "mountpoints": [
                   "/boot/efi"
               ]
            },{
               "name": "nvme0n1p2",
               "fstype": "ext4",
               "fsver": "1.0",
               "label": null,
               "uuid": "30eff827-[...]",
               "fsavail": "605M",
               "fsuse%": "31%",
               "mountpoints": [
                   "/boot"
               ]
            },{
               "name": "nvme0n1p3",
               "fstype": "crypto_LUKS",
               "fsver": "2",
               "label": null,
               "uuid": "84257c20-[...]",
               "fsavail": null,
               "fsuse%": null,
               "mountpoints": [
                   null
               ],
               "children": [
                  {
                     "name": "luks-[...]",
                     "fstype": "btrfs",
                     "fsver": null,
                     "label": "fedora_localhost-live",
                     "uuid": "666f9d6f-[...]",
                     "fsavail": "303,1G",
                     "fsuse%": "67%",
                     "mountpoints": [
                         "/home", "/"
                     ]
                  }
               ]
            }
         ]
      }
   ]
}

Заключение

Команды lsof и lsblk предоставляют информацию об использовании файлов, сетевой активности и структурах блочных устройств. Независимо от того, отслеживаете ли вы открытые дескрипторы файлов, диагностируете ли сетевые соединения, просматриваете устройства хранения данных, устраняете ли вы неполадки, оптимизируете или просто любопытствуете эти инструменты предоставляют ценные данные, которые помогут вам лучше понять и управлять вашей средой Fedora Linux. Увидимся в следующий раз, когда мы рассмотрим более полезные инструменты командной строки для просмотра информации и как их использовать.