Ich habe an einem Bash-Scripting-Projekt gearbeitet, um Linux automatisch von Grund auf neu zu erstellen. Jedes Mal, wenn ich den Code durchgehe, finde ich einen Weg, ihn sauberer zu machen. Ich nehme einen kleinen Abschnitt des Codes und mache ihn besser.
Neulich habe ich eine Änderung vorgenommen, um zu prüfen, ob ein Dateisystem gemountet ist, bevor ich es mounte. Ich suchte nach einem besseren Weg, dies zu tun. Ich wollte nicht das übliche mount | verwenden grep oder einen ähnlichen Code. Ich wollte etwas Saubereres.
Mount gegen Findmnt
Ich weiß nicht warum, aber in diesem Moment fragte ich mich, warum ich mich so oft mit dem Internet verbinde, um Informationen zu finden, die sich bereits auf meinem Laptop befinden. Also feuere ich man mount an Ich habe schnell einen Blick auf die Manpage geworfen und folgendes bemerkt:
Und da hatte ich meine Antwort. Erstens verwende ich seit einiger Zeit den falschen Befehl. Zweitens hat Google nicht immer die beste Antwort.
Die Ironie dabei ist, dass dies in den Online-Manpages, die ich normalerweise durchschaue, nicht erwähnt wird. Überzeugen Sie sich selbst auf der Manpage von mount, findmnt wird nur am Ende verwiesen. Hätte ich meine üblichen Kanäle durchlaufen, um eine Antwort zu finden, würde ich diesen Artikel nicht schreiben.
Ich war sofort sehr neugierig, wie viel besser dieser findmnt ist ? Wie viele Pipes kann ich aus meinen Skripten entfernen? Es stellt sich heraus, dass es so viel besser ist als mount Auflistung. Vergleichen wir zunächst die Standardausgabe jedes Befehls.
Standardausgabe bereitstellen
Wenn man sich die obige Liste der gemounteten Dateisysteme ansieht, ist es leicht zu erkennen, warum grep so beliebt wurde. Die Informationen sind alle vorhanden, aber ein besseres Format würde das Lesen erleichtern. Um dies zu erreichen, benötigen Sie bereits eine Pipe und einen externen Befehl. Sehen wir uns nun findmnt an .
Findmnt-Standardausgabe
Das sieht viel besser aus. Mit findmnt wird es noch besser Sie müssen keine Kombination von Tools mehr verwenden. Es ist sehr flexibel und gibt Ihnen die Möglichkeit, saubereren Code zu schreiben, wenn es in einem Skript verwendet wird.
Praktische Nutzung des findmnt-Befehls in Linux
Überprüfen, ob ein Dateisystem mit findmnt gemountet ist ist viel einfacher. Sie können nach einer Quelle suchen oder Ziel ohne irgendwelche Optionen zu verwenden. Geben Sie einen Einhängepunkt an (Ziel ) oder Gerät (Quelle ) ohne Option und findmnt wird versuchen, das von Ihnen angegebene Argument gegen beide abzugleichen.
findmnt /boot
Findmnt funktioniert wirklich wie ein Suchbefehl für das Dateisystem. Wenn Übereinstimmungen gefunden werden, werden sie gedruckt und findmnt gibt 0 zurück. Wenn nichts mit Ihrer Abfrage übereinstimmt, findmnt gibt nichts aus und gibt 1 zurück.
findmnt enthält eine lange Liste von Optionen . Sie haben 2 Hauptkategorien von Optionen, die Ihre Suche einschränken und die Ausgabe formatieren.
Eingrenzen Ihrer Suche
Wie finden um Dateien zu finden, findmnt dient zum Auffinden des Dateisystems. Sie wissen bereits, wie Sie Ihre Suche einschränken können, indem Sie eine Zeichenfolge angeben, die mit SOURCE und TARGET abgeglichen wird. Wenn Sie Ihre Suche auf eine QUELLE oder ein ZIEL einschränken müssen, verwenden Sie die Optionen -S und -T.
Schon zu diesem Zeitpunkt war ich davon überzeugt, findmnt zu verwenden statt mount . Ich kann die gewünschte Partition abfragen. Und ich benutze keine Pfeife. Findmnt hört hier nicht auf, es hat eine Vielzahl von Optionen, die entwickelt wurden, um Ihnen eine leistungsstarke Suche im Dateisystem zu ermöglichen.
Ich denke, eine der interessantesten Optionen ist -O , –Optionen . Das -O Mit options können Sie eine Liste mit Optionen schreiben, mit denen Sie Ihre Suche abgleichen können. Die Suche nach schreibgeschützten Dateisystemen ist jetzt so einfach wie findmnt -O ro.
Das -O Optionen können auch eine durch Kommas getrennte Liste annehmen. Dadurch können Sie nach mehreren Optionen suchen und nur Dateisysteme auflisten, die alle gewünschten Optionen haben.
Die Suche nach einem bestimmten Dateisystemtyp erfordert auch keine Verwendung externer Tools. Verwenden Sie einfach das -t Optionen. Im Beispiel unten habe ich alle tmpfs aufgelistet montieren.
In allen obigen Beispielen durchsuchte findmnt /etc/fstab, /etc/mtab und /proc/self/mountinfo. Sie können diese breite Suche einfach mit den folgenden Optionen einschränken:
- –fstab (Suche nur auf /etc/fstab beschränken)
- –mtab (Suche nur auf /etc/mtab beschränken)
- –Kernel (Suche nur in /proc/self/mountinfo)
Eine weitere interessante Option ist -i , –invertieren . Die den Sinn der Übereinstimmung umkehren. In einem vorherigen Beispiel haben wir alle tmpfs aufgelistet mit dem -t Möglichkeit. Das folgende Beispiel listet alle Dateisysteme des Typs swap auf nur von fstab.
findmnt --fstab -t swap
Dieses listet alle Dateisysteme auf, außer denen vom Typ swap.
findmnt --fstab -t swap -i
Bereits mit den gegebenen Optionen können Sie viele Pipes und externe Programme vermeiden. Und hier hört es nicht auf. Finden bietet eine Reihe von Optionen zum Anpassen der Ausgabe Ihrer Suchergebnisse.
Anpassen der Ausgabe des findmnt-Befehls
Sie müssen den Head-Befehl nicht verwenden, um den Header zu entfernen. Einfach findmnt anrufen mit -n Möglichkeit:
Ich hatte nicht erwartet, dass die nächste Option überhaupt eine Option ist. Findmnt kann die Ausgabe des df-Befehls imitieren. Aufruf von findmnt mit -D oder –df wird findmnt mitteilen um Informationen über den Speicherplatz für jedes aufgelistete Dateisystem anzuzeigen.
Optionen können für eine spezifischere Suche kombiniert werden. In diesem nächsten Beispiel verwende ich findmnt um alle Dateisysteme aus /etc/fstab aufzulisten und die Anzeige von df-Informationen anzufordern.
findmnt --fstab --df
Ich weiß nicht, wie es euch geht, aber ich fange an, findmnt zu genießen . Bis auf diese UUID mit dem letzten Befehl. Ich verstehe, es ist eine gute Möglichkeit, das Gerät für das Betriebssystem zu identifizieren. Ich hätte gerne eine menschenlesbarere Art und Weise. Dies erreichen Sie mit dem -e Option.
Das -e oder –auswerten Option mit konvertieren Sie alle Tags wie UUID, LABEL, PARTLABEL, PARTUUID in den entsprechenden Gerätenamen. Sehen Sie sich die Ergebnisse an, wenn ich denselben Befehl mit -e ausführe Optionen.
Ich mag findmnt formatieren Sie die Ausgabe. Es ist menschenfreundlicher. Andererseits kann dieses Format, wenn es in einem Skript verwendet wird, schwieriger zu manipulieren sein. Ein einfacher zeilenweiser, durch Leerzeichen getrennter Datensatz wäre einfacher. Das geht ganz einfach mit -r , –roh Option.
Diese nächste Option ist wirklich nett. Ich denke, es macht | überflüssig grep fast vollständig. Sie können findmnt mitteilen genau welche Spalte gedruckt werden soll mit dem -o , –Ausgabe . Diese Optionen akzeptieren eine kommagetrennte Liste von Spalten zum Drucken. Mit dem folgenden Befehl können Sie nur den verfügbaren Speicherplatz Ihrer Root-Partition ohne Header abrufen.
findmnt -T / --df -o AVAIL -n
Alles, was Sie in Ihren Skripten tun müssen, ist, das letzte Zeichen zu entfernen. Im obigen Befehl habe ich das –df angegeben Möglichkeit. Das war nicht nötig, auch ohne diese Option werden die gleichen Ergebnisse gedruckt.
Findmnt bietet eine ziemlich umfangreiche Liste von Ausgabespalten. Ich stelle Ihnen unten eine kurze Liste von Kolumnen zur Verfügung, von denen ich denke, dass sie von Interesse sein werden. Sie können die vollständige Liste mit findmnt –help anzeigen
- SOURCE-Quellgerät
- TARGET-Einhängepunkt
- FSTYPE-Dateisystemtyp
- OPTIONS alle Mount-Optionen
- LABEL Dateisystembezeichnung
- UUID Dateisystem-UUID
- MAJ:MIN major:minor Gerätenummer
- SIZE Dateisystemgröße
- AVAIL-Dateisystemgröße verfügbar
- USED Dateisystemgröße verwendet
- USE% Dateisystemnutzung in Prozent
- FSROOT-Dateisystemstamm
Die Standardliste der gedruckten Spalten kann erweitert statt ersetzt werden. Stellen Sie einfach eine Liste im folgenden Format bereit:+Liste . Der folgende Befehl liefert dieselben Informationen wie die Verwendung von –df , außer dass die Spalten am Ende hinzugefügt werden.
findmnt -T / -o +SIZE,USE%,AVAIL
Ich verliebe mich jetzt schon in findmnt . Das erspart mir viel Piping und lange Befehlszeilen. Und findmnt hört hier nicht auf. Es gibt noch eine weitere Funktion, über die ich sprechen möchte. Umfrage .
Ja, findmnt kann verwendet werden, um Änderungen in der Datei /proc/self/mountinfo zu überwachen. Auf diese Weise können Sie Ihr System effektiv auf das Montieren verwandter Aktivitäten überwachen. Keine While-Schleife mehr in Bash-Skripten.
Finden wird auf die folgenden Aktionen warten, mount , Menge , remount und bewegen . Sie können dies einschränken, indem Sie eine durch Kommas getrennte Liste von Aktionen bereitstellen, auf die gewartet werden soll. Folgendes überwacht beispielsweise nur das Mounten des Dateisystems.
Im obigen Bild sehen Sie die von findmnt gedruckte Ausgabe wenn eine neue Partition gemountet wurde. Sie sehen die neue Spalte AKTION ? Mit der –Umfrage Option haben Sie 3 neue Spalten, die angezeigt werden können:
- AKTION:Verfügbar für mount, umount, remount und move
- OLD-TARGET:Verfügbar für umount- und move-Aktionen.
- OLD-OPTIONS:Verfügbar für umount und remount.
Bei Verwendung in diesem Modus findmnt blockiert, wenn es in einem Skript verwendet wird, „hängt“ das Skript. Die Zeit, zu der –poll blockiert und wartet auf Aktionen kann mit 2 Optionen eingeschränkt werden
- – nur zuerst :Findmnt wird beendet, nachdem die erste Aktion erkannt wurde.
- –Zeitüberschreitung X :Findmnt wird nach X Millisekunden beendet.
Wenn Sie alles zusammenfügen, findmnt ist ein mächtiges Werkzeug. Bei der Verwendung in Skripten sparen Sie sich viel zusätzlichen Code. Die Notwendigkeit, an externe Befehle zu leiten, wurde stark verringert.
Die zuvor aufgeführten Optionen können auch mit –poll verwendet werden . Im folgenden Beispiel findmnt lauscht auf eine Mount-Aktion und gibt SOURCE, TARGET, SIZE und USE % aus. Aber nur, wenn das Einhängeziel mit dem -T übereinstimmt Optionen.
findmnt -T /mnt/lfs --poll=mount -o SOURCE,TARGET,SIZE,USE%
Bonus-Tipp:Real-life-Beispiel von findmnt
Ich arbeite seit einiger Zeit an einer Bash-Skriptumgebung, um Linux von Grund auf neu zu kompilieren. Verwenden von findmnt in meinen Skripten führte zu besserem und saubererem Code.
Während des ersten Starts meines Skripts überprüfe ich, ob die LFS-Partition gemountet ist, wenn nicht, werden sie vom Skript gemountet. Der Code sah früher so aus:
if [[ `grep "$pd on $pm" < <(mount) | wc -l` < 1 ]];
then
...
...
fi
Das Projekt dient Bildungszwecken, deshalb habe ich im obigen Test Prozesssubstitution und Pipe verwendet. In meinem gesamten Code zeige ich mehrere Möglichkeiten, dieselbe Aufgabe auszuführen. Verwenden von findmnt Ich habe mir einen saubereren Weg ausgedacht, dasselbe zu tun.
findmnt -S $pd -T $pm > /dev/null || (
...
...
)
Ich leite die Ausgabe nach /dev/null um, ich brauche findmnt nicht Ausgabe auf der Konsole gedruckt. Finden gibt 1 zurück, wenn die Suche fehlschlägt, wodurch der Code innerhalb von ( … ) ausgeführt wird.
Ich hoffe, es hat Ihnen gefallen und Sie haben einen neuen Befehl gelernt. Wenn Sie eine interessante Verwendung dafür haben, teilen Sie dies bitte in den Kommentaren mit. Es gibt noch eine andere Sichtweise zu diesem Artikel:Die Online-Suche ist nicht immer die beste. Wir neigen dazu zu vergessen, dass Linux mit einem Handbuch geliefert wird.