Systemeinblicke mit Kommandozeilentools: lsof und lsblk

·6 min·Andreas Haerter·

Hinweis: Dieser Artikel erschien vorab in in englischer Sprache im Fedora Magazin.

In unserer fortlaufenden Serie über Linux-Systemwerkzeuge und -einblicke werfen wir einen Blick auf grundlegende Kommandozeilen-Dienstprogramme, die Informationen über die Hardware und den Status des Systems liefern. Nach unseren vorherigen Artikeln über lscpu, lsusb, dmidecode und lspci, wenden wir uns nun lsof und lsblk zu. Diese Tools sind besonders nützlich für die Untersuchung offener Dateien, aktiver Netzwerkverbindungen und gemounteter Block-Devices auf unserem Linux-System.

Übersicht geöffneter Dateien mit lsof

lsof (list open files) ist ein mächtiges Kommandozeilen-Tool. Da fast alles in Linux als Datei behandelt wird, bietet lsof detaillierte Einblicke in viele Teile des Systems, indem es auflistet, welche Dateien verwendet werden, welche Prozesse auf sie zugreifen und sogar welche Netzwerkports offen sind (siehe z.B. Wikipedia zu Network socket für weitere Informationen).

Nutzung

Wir führen zunächst den grundlegenden lsof-Befehl aus, um einen Überblick über die offenen Dateien des Systems zu erhalten:

$ sudo lsof

sudo wurde zum erlangen erweiterter Rechte verwendet. Dies ist erforderlich, um Informationen über Dateien zu erhalten, die von Prozessen geöffnet wurden, welche nicht über das eigene Benutzerkonto gestartet wurden. Der Befehl gibt viele Informationen aus, wir werden die Ausgabe in den folgenden Beispielen auf spezifische Informationen zu einigen häufigen Anwendungsfällen eingrenzen.

Beispiel 1: Finden offener Dateien nach Benutzer oder Prozess

Um zu identifizieren, welche Dateien ein bestimmter Benutzer oder Prozess geöffnet hat, kann lsof sehr hilfreich sein.

Um alle von einem bestimmten Benutzer geöffneten Dateien aufzulisten:

$ sudo lsof -u <benutzername>

Dies gibt eine Liste der offenen Dateien zurück, die dem angegebenen Benutzer gehören. Zum Beispiel:

$ sudo lsof -u johndoe

Man sieht Details wie die Prozess-ID (PID), den Datei-Deskriptor, -typ und -pfad.

Der -p-Flag kann genutzt werden um nach Prozess-ID (PID) zu filtern:

$ lsof -p <PID>

Dies ist besonders nützlich für die Fehlersuche bei Problemen mit bestimmten Prozessen, beispielsweise um zu überprüfen will, welche Dateien von einem bestimmten Dienst offen gehalten werden. sudo wird verwendet, wenn der Zielprozess nicht dem eigenen Benutzer gehört.

Beispielausgabe:

$ 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

Beispiel 2: Identifizierung offener Netzwerkverbindungen über Sockets

Dank der Fähigkeit, Netzwerkverbindungen aufzulisten, ist lsof auch ein praktischer Helfer für die Diagnose netzwerkbezogener Probleme. Dies ist insbesondere praktisch, da es normalerweise auch auf besonders gehärteten, minimal-Systeminstallation verfügbar ist.

Um alle offenen Netzwerkverbindungen (TCP/UDP Sockets) anzuzeigen, nutzt man den -i-Flag:

$ sudo lsof -i

Dies listet die aktiven Neztwerkverbindungen zusammen mit dem zugehörigen Protokoll, Port und Prozessdetails auf.

Man kann dabei auch nach bestimmten Protokollen (wie TCP oder UDP) filtern, IPv4 und v6 ein- oder ausschließen und mehrere Werte kombinieren (der „Beispiel“-Abschnitt von man lsof bietet viele nützliche Informationen, einschließlich der Möglichkeit zur Negation von Kriterien):

$ sudo lsof -i tcp
$ sudo lsof -i udp
$ sudo lsof -i 4tcp
$ sudo lsof -i 6tcp
$ sudo lsof -i 4tcp@example.com

Verbindungen zu einem bestimmten Port können wie folge gelistet werden:

$ sudo lsof -i :<portnummer>

Beispielsweise Verbindungen zu Port 22 (SSH):

$ 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)

Diese Übersichten können sehr hilfreich dabei sein, um unbefugte Verbindungen zu identifizieren oder einfach die Netzwerkaktivität auf einem System für Debugging-Zwecke zu überwachen.

Untersuchung von Block-Devices mit lsblk

Ein weiteres nützliches Tool ist lsblk, da es Informationen über alle verfügbaren Block-Devices des Systems liefert. Block-Devices sind unter anderem Festplatten, SSDs und USB-Speicher. Das Kommandobietet eine baumähnliche Ansicht und hilft dabei, die Beziehungen zwischen Partitionen, Geräten und ihren Mount-Points (Einhängepunkte im Verzeichnisbaum) zu verstehen.

Nutzung

Das Ausführen von lsblk ohne Optionen erzeugt eine übersichtliche, hierarchische Struktur der Block-Devices:

$ lsblk

Sie zeigt alle Block-Devices in einer Baumstruktur, einschließlich ihrer Größe, ihres Typs (Festplatte, Partition) und ihres Mount-Punkts (falls zutreffend).

Beispiele

Für eine Übersicht über die Dateisysteme und deren Eigenschaften wird das -f-Flag verwendet:

$ lsblk -f

Dies zeigt nicht nur die Devices se;bst, sondern auch Details über die Dateisysteme auf jeder Partition, einschließlich des Typs (z.B. ext4, vfat, swap), der UUID und der aktuellen Mount-Points.

Wenn man weniger Informationen über die Geräte selbst wünscht (ohne Partitionen oder Mount-Punkte anzuzeigen), ist die -d Option nützlich:

$ lsblk -d

Es gibt auch eine -J oder --json Option. Bei Verwendung gibt der Befehl die Informationen im JSON-Format aus. Dies bietet eine strukturierte Ansicht, die besonders nützlich für Scripting und Automatisierung ist.

Beispielausgaben von meinem Laptop (einige lange Informationen wie UUIDs wurden zur besseren Lesbarkeit gekürzt):

$ 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", "/"
                     ]
                  }
               ]
            }
         ]
      }
   ]
}

Fazit

Die Befehle lsof und lsblk bieten Einblicke in die Dateiverwendung, Netzwerkaktivität und Block-Devicee-Strukturen. Ob Sie offene Datei-Handles verfolgen, Netzwerkverbindungen diagnostizieren oder Speichergeräte überprüfen; ob Sie Fehler beheben, optimieren oder einfach nur neugierig sind; diese Tools liefern wertvolle Daten, die Ihnen helfen können, Ihre Fedora Linux-Umgebung besser zu verstehen und zu verwalten. Bis zum nächsten Mal, wenn wir weitere nützliche Auflistungs- und Informations-Kommandozeilen-Tools und ihre Verwendung betrachten werden.