GNU/Linux >> Linux Esercitazione >  >> Linux

Findmnt - Un modo migliore per trovare filesystem montati su Linux

Ho lavorato a un progetto di scripting bash per creare automaticamente Linux da zero. Ogni volta che leggo il codice trovo il modo di renderlo più pulito. Prendo una piccola sezione di codice e la rendo migliore.

L'altro giorno stavo apportando una modifica per verificare se un filesystem è montato prima di montarlo. Stavo cercando un modo migliore per farlo. Non volevo usare il solito mount | grep o qualsiasi codice simile. Volevo qualcosa di più pulito.

Monta vs Trova

Non so perché, ma in quel momento mi sono ritrovato a chiedermi perché mi collego a internet così spesso per trovare informazioni che sono già sul mio portatile. Quindi accendo man mount, Ho dato un'occhiata rapidamente alla pagina man e ho notato questo:

E lì ho avuto la mia risposta. Per prima cosa sto usando il comando sbagliato da un po' di tempo. In secondo luogo, Google non ha sempre la risposta migliore.

L'ironia qui è che questo non è menzionato nelle pagine man online che di solito guardo. Guarda tu stesso, nella pagina man di mount, findmnt si fa riferimento solo alla fine. Se fossi passato attraverso i miei canali regolari per trovare una risposta, non avrei scritto questo articolo.

Mi sono subito incuriosito, quanto è meglio questo findmnt ? Quante pipe potrò rimuovere dai miei script? Si scopre che è molto meglio di montare elenco. Innanzitutto, confrontiamo l'output predefinito di ciascun comando.

Monta output predefinito

Guardando l'elenco sopra del file system montato, è facile capire perché grep è diventato così popolare. Le informazioni sono tutte lì, ma un formato migliore semplificherebbe la lettura. Per farlo, avresti già bisogno di una pipe e di un comando esterno. Ora diamo un'occhiata a findmnt .

Trova l'output predefinito

Sembra molto meglio. Migliora, con findmnt non dovrai più usare una combinazione di strumenti. È molto flessibile e ti dà la possibilità di scrivere codice più pulito quando viene utilizzato in uno script.

Utilizzo pratico del comando findmnt in Linux

Verifica se un file system è montato con findmnt è molto più facile. Puoi cercare una fonte o bersaglio senza utilizzare alcuna opzione. Fornisci un punto di montaggio (target ) o dispositivo (fonte ) senza alcuna opzione e trova tenterà di confrontare l'argomento fornito con entrambi.

findmnt /boot

Findmnt funziona davvero come un comando di ricerca per il file system. Se vengono trovate corrispondenze, verranno stampate e trova restituisce 0. Quando nulla corrisponde alla tua richiesta, findmnt non stampa nulla e restituisce 1.

Con findmnt viene fornito un lungo elenco di opzioni . Hai 2 categorie principali di opzioni, restringendo la ricerca e formattando l'output.

Mi piace trova per trovare i file, trova serve per trovare il file system. Sai già come limitare la tua ricerca fornendo una stringa che verrà confrontata con SOURCE e TARGET. Se hai bisogno di restringere la tua ricerca a una SORGENTE o a un TARGET, usa le opzioni -S e -T.

Già a questo punto, mi è stato chiesto di utilizzare findmnt invece di montare . Posso interrogare la partizione che voglio. E non uso una pipa. Findmnt non si ferma qui, ha una moltitudine di opzioni progettate per darti una ricerca potente nel file system.

Penso che una delle opzioni più interessanti sia -O , –opzioni . Il -O opzioni ti consente di scrivere un elenco di opzioni per confrontare la tua ricerca. La ricerca di file system di sola lettura ora è facile come findmnt -O ro.

Il -O le opzioni possono anche richiedere un elenco separato da virgole. Ciò ti consente di cercare più opzioni ed elencare solo il file system che ha tutte le opzioni desiderate.

Anche la ricerca di un determinato tipo di file system non richiede l'uso di strumenti esterni. Usa semplicemente il -t opzioni. Nell'esempio seguente ho elencato tutti i tmpfs monta.

In tutti gli esempi precedenti, findmnt ha cercato /etc/fstab, /etc/mtab e /proc/self/mountinfo. Puoi facilmente limitare questa vasta ricerca con le seguenti opzioni:

  • –fstab (Riduci la ricerca solo a /etc/fstab)
  • –mtab (Restringi la ricerca solo a /etc/mtab)
  • –kernel (Cerca solo in /proc/self/mountinfo)

Un'altra opzione interessante è -i , –inverti . Che invertono il senso di corrispondenza. In un esempio precedente, abbiamo elencato tutti i tmpfs con -t opzione. L'esempio seguente elencherà tutti i file system di tipo swap solo da fstab.

findmnt --fstab -t swap

Questo elencherà tutti i file system tranne quelli di tipo swap.

findmnt --fstab -t swap -i

Già con le opzioni fornite puoi evitare di utilizzare molte pipe e programmi esterni. E non si ferma qui. Trova fornisce una buona serie di opzioni per personalizzare l'output dei risultati di ricerca.

Personalizzazione dell'output del comando findmnt

Non sarà necessario utilizzare il comando head per rimuovere l'intestazione. Chiama semplicemente findmnt con -n opzione:

Non mi aspettavo che la prossima opzione fosse nemmeno un'opzione. Findmnt può imitare l'output del comando df. Chiamando trova con -D o –df dirà findmnt per visualizzare le informazioni sullo spazio per ogni file system elencato.

Le opzioni possono essere combinate per una ricerca più specifica. In questo prossimo esempio, utilizzo findmnt per elencare tutti i file system da /etc/fstab e richiedere di visualizzare le informazioni df.

findmnt --fstab --df

Non so voi, ma sto iniziando a divertirmi con findmnt . Fatta eccezione per quegli UUID con l'ultimo comando Ho capito, è un buon modo per identificare il dispositivo per il sistema operativo. Io, vorrei un modo leggibile più umano. Puoi farlo con la -e opzione.

La -e o –valuta opzione con convertire tutti i tag come UUID, LABEL, PARTLABEL, PARTUUID nel nome del dispositivo corrispondente. Guarda i risultati quando eseguo lo stesso comando con -e opzioni.

Mi piace il modo trovare formatta è l'output. È più umano. D'altra parte, questo formato quando viene utilizzato in uno script può essere più difficile da manipolare. Un semplice set di dati riga per riga e separato da spazi sarebbe più semplice. Questo può essere fatto facilmente con -r , –grezzo opzione.

Questa prossima opzione è davvero carina. Penso che elimini la necessità di | grep quasi interamente. Puoi dire a trova esattamente quale colonna stampare con -o , –output . Queste opzioni richiedono la stampa di un elenco di colonne separate da virgole. Usando il comando seguente puoi ottenere solo lo spazio disponibile della tua partizione di root senza intestazioni.

findmnt -T / --df -o AVAIL -n

Tutto quello che devi fare nei tuoi script è rimuovere l'ultimo carattere. Nel comando precedente, ho dato il –df opzione. Non era necessario, gli stessi risultati verranno stampati anche senza quell'opzione.

Findmnt fornisce un elenco piuttosto ampio di colonne di output. Ti fornisco di seguito un breve elenco di colonne che penso possano essere di interesse. Puoi visualizzare l'elenco completo con findmnt –help

  • Dispositivo sorgente SORGENTE
  • Punto di montaggio TARGET
  • Tipo di filesystem FSTYPE
  • OPZIONI tutte le opzioni di montaggio
  • Etichetta del filesystem LABEL
  • UUID del file system UUID
  • MAJ:MIN major:minor numero dispositivo
  • SIZE dimensione del filesystem
  • DISPONIBILE dimensione del filesystem disponibile
  • Dimensione del filesystem UTILIZZATA utilizzata
  • USE% percentuale di utilizzo del filesystem
  • Root del filesystem FSROOT

L'elenco predefinito delle colonne stampate può essere esteso anziché sostituito. Fornisci semplicemente un elenco utilizzando il seguente formato:+elenco . Il comando seguente fornirà le stesse informazioni dell'utilizzo di –df , tranne per il fatto che le colonne verranno aggiunte alla fine.

findmnt -T / -o +SIZE,USE%,AVAIL

Mi sto già innamorando di findmnt . Questo mi farà risparmiare un sacco di piping e lunghe righe di comando. E trova non si ferma qui. C'è un'altra funzionalità di cui voglio parlare. Sondaggio .

Sì, trova può essere utilizzato per monitorare le modifiche nel file /proc/self/mountinfo. Ciò ti consente di controllare efficacemente il tuo sistema per il montaggio di attività correlate. Non più loop negli script bash.

Trova ascolterà le seguenti azioni, montare , importo , rimonta e sposta . Puoi limitare questo fornendo un elenco di azioni separate da virgole da ascoltare. Ad esempio, quanto segue monitorerà solo il montaggio del file system.

Nell'immagine sopra, vedi l'output stampato da findmnt quando una nuova partizione è stata montata. Noti la nuova colonna AZIONE ? Con il -sondaggio opzione hai 3 nuove colonne che possono essere visualizzate:

  • AZIONE:disponibile per montare, smontare, rimontare e spostare
  • VECCHIO BERSAGLIO:disponibile per lo smontaggio e l'azione di movimento.
  • OPZIONI VECCHIE:disponibili per lo smontaggio e il rimontaggio.

Se utilizzato in questa modalità, trova bloccherà, se utilizzato in uno script, lo script si "bloccherà". L'ora del sondaggio bloccherà e ascolterà le azioni può essere limitato con 2 opzioni

  • –solo primo :Findmnt si chiuderà dopo il rilevamento della prima azione.
  • –timeout X :Findmnt si chiuderà dopo X millisecondi.

Quando metti tutto insieme, trova è uno strumento potente. Se utilizzato negli script, eliminerai molto codice extra. La necessità di reindirizzare al comando esterno è stata notevolmente ridotta.

Le opzioni elencate in precedenza possono essere utilizzate anche con –poll . Nell'esempio seguente, trova ascolterà un'azione di montaggio e stamperà la SOURCE, TARGET, SIZE e USE %. Ma solo se il target di montaggio corrisponde a -T opzioni.

findmnt -T /mnt/lfs --poll=mount -o SOURCE,TARGET,SIZE,USE%

Suggerimento bonus:esempio reale di findmnt

Da un po' di tempo sto lavorando su un ambiente con script bash per compilare Linux da Scratch. Utilizzando trova nei miei script ha prodotto un codice migliore e più pulito.

Durante l'avvio iniziale del mio script, controllo per vedere se la partizione LFS è montata, in caso contrario gli script le montano. Il codice usato per assomigliare a questo:

if [[ `grep "$pd on $pm" < <(mount) | wc -l` < 1 ]]; 
then   
...   
... 
fi

Il progetto è a scopo didattico, ecco perché ho usato la sostituzione del processo e la pipe nel test di cui sopra. In tutto il mio codice visualizzo più modi per eseguire la stessa attività. Utilizzando trova Ho trovato un modo più pulito per fare lo stesso.

findmnt -S $pd -T $pm > /dev/null || (
  ...
  ...
)

Reindirizzerò l'output a /dev/null, non ho bisogno di avere findmnt output stampato sulla console. Trova restituirà 1 se la ricerca non riesce, il che farà eseguire il codice all'interno di ( … ).

Spero ti sia piaciuto e hai imparato un nuovo comando. Se ne hai un uso interessante, condividilo nei commenti. C'è anche un'altra versione di questo articolo:le ricerche online non sono sempre le migliori. Tendiamo a dimenticare che Linux viene fornito con un manuale.


Linux
  1. Usa anacron per un crontab migliore

  2. 10 articoli per imparare Linux a modo tuo

  3. Abbiamo un annullamento in Linux?

  4. csplit:un modo migliore per dividere il file in Linux in base al suo contenuto

  5. Opzioni di montaggio NFS comuni in Linux

11 motivi per cui Linux è migliore di Windows

Come elencare i filesystem in Linux usando Lfs

Come trovare il tipo di filesystem montato in Linux

Un modo semplice per elencare i collegamenti simbolici in Linux

Perché Linux è così cattivo e Windows 11 è migliore in ogni singolo modo?

Opzioni di comando ed esempi di Tee Command in Linux