In che modo findmnt è in grado di elencare i mount bind?


11

Molte persone continuano a dire che Linux non conserva informazioni sui mount dei bind, quindi non c'è modo di ottenere un elenco di loro e delle loro fonti. Ecco alcuni esempi:

  • da uno dei commenti qui :

    IIRC questa informazione non è conservata da nessuna parte: dopo mount --bind, le due copie sono equivalenti, non ce n'è una più "originale" dell'altra. Dopotutto non ci potrebbe essere un originale se avessi già smontato /mnt.

  • da una risposta su questo sito :

    Quindi l'unico modo per ricordare quali erano i montaggi di bind mount è il registro dei comandi di mount rimasti /etc/mtab. Un'operazione di bind mount è indicata dall'opzione bind mount (che fa ignorare il tipo di filesystem). Ma mount non ha alcuna opzione per elencare solo i filesystem montati con un particolare set di set di opzioni.

  • da una segnalazione di bug Debian :

    Questo è intenzionale. Entrambi i punti di mount sono completamente uguali in tutti i modi, quindi il kernel non mantiene alcun flag per differenziarli.

Quanto sopra non ha senso però. Lo strumento findmntè in grado di elencare i percorsi di origine dei montaggi di bind (sotto forma di device[source-path]; sto anche cercando di farlo elencare solo il percorso di origine e non il dispositivo). Se il kernel di Linux deve mantenere un mount bind, allora quelle informazioni devono essere archiviate da qualche parte , altrimenti non potrebbero sapere a cosa /homeè legato /users. Quindi dove sono questi dati? È memorizzato in qualche regione oscura nella RAM? Fa findmntsguardo in /procqualche parte?


Quale versione di findmntstai utilizzando e quali opzioni gli stai offrendo? Il mio non lo stampa in quel modo e guardando il codice sorgente sembra usare quello _PATH_PROC_MOUNTINFOche sembra essere /proc/self/mountinfoche non ha nemmeno queste informazioni.
Bratchley,

OK, credo che /proc/self/mountinforelativamente di recente sia stato ristrutturato. Ero sulla mia macchina RHEL6 prima della quale non avevo le informazioni sul percorso ma la mia macchina RHEL7 ha e come menzionato nel tuo link anche Wheezy.
Bratchley,

Non ha senso: era vero con i kernel più vecchi, ma i kernel più recenti tengono traccia delle informazioni.
Gilles 'SO- smetti di essere malvagio' il

@Gilles Quindi come potrebbe persistere un mount bind se le informazioni che una directory è montata su un'altra non vengono tracciate?
Melab,

@Melab In realtà, è più facile per un mount bind persistere se non si tiene traccia che è un mount bind. Quando /dev/Aè montato su /Be lo fai mount --bind /B /C, i kernel più vecchi ricordano solo /B → /dev/Ae /C → /dev/A, non ricordano alcuna relazione tra /Be /C. Quindi smontare /Bnaturalmente non ha alcun effetto /C. I kernel più recenti ricordano che /Cera un attacco vincolante /B, ma in un modo che non impedisce /Cdi continuare a funzionare se /Bnon montato, non so esattamente come.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


12

Hai frainteso un po '; i due punti di montaggio sono uguali in termini di autorizzazioni, flag, ecc. perché il bind reindirizza efficacemente l'accesso da un percorso all'altro. Ma sono ancora distinti .

Se guardi /proc/self/mountinfovedrai la vista del kernel del mondo di mount per questo processo (gli spazi dei nomi rendono le cose più complicate; non c'è solo una vista della tabella di mount).

man 5 procspiegherà il formato di questo file, ma puoi vedere la gerarchia dell'albero e dove i montaggi di bind hanno il loro "genitore". Questo è il file che findmntanalizza.


9

Linux non conserva le informazioni su quale mount fosse un mount bind . Conserva le informazioni su tutti i supporti, inclusi quelli di collegamento .

È abbastanza simile ai collegamenti reali. Supporta il collegamento a filesystem come i nomi di file si collegano agli inode. Le uniche differenze sono che i mount hanno anche flag per mountpoint e possono fare riferimento a una sottodirectory del filesystem di destinazione anziché alla radice del filesystem.

Quando si crea un collegamento reale, il file system non salva quale nome file era quello originale e quale era il collegamento reale. Entrambi si riferiscono semplicemente allo stesso inode. Se si scollega il file originale, la situazione è indistinguibile se si è creato direttamente il file con il secondo nome file.

Torna ai bind mount: il kernel mantiene una tabella che contiene il filesystem (identificato da una maggiore: coppia di numeri minori), il mountpoint, il percorso relativo alla radice del filesystem e alcuni flag. Puoi accedere a questo elenco guardando /proc/self/mountinfo. (Diventa più complicato quando sono coinvolti gli spazi dei nomi, come menzionato da @ stephen-harris). findmntanalizza questo elenco.

Se la tua radice è /dev/sda1con major: minor 8:1e corri mount --bind /a /b /proc/self/mountinfoconterrà linee simili a questa:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro

Se il vostro /homeè /dev/sda2il maggiore: minore 8:2e si esegue mount --bind /home /usersche sarà simile a questa:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:2 / /home rw - ext4 /dev/sda2 rw
3 1 8:2 / /users rw - ext4 /dev/sda2 rw

Le colonne pertinenti per la tua domanda sono la terza, la quarta e la quinta. Questi sono l'id del filesystem (per i filesystem reali è lo stesso del dispositivo major: minor; per i filesystem virtuali come tmpfs è [0: counter ]), il percorso relativo alla radice del filesystem che è associato al mountpoint (di solito / per normale mount, può essere qualsiasi cosa per i mount bind) e il mountpoint.
Per il significato delle colonne rimanenti consultare la documentazione del kernel Linux .

findmntchiama il percorso di origine relativo alla radice del filesystem "FSROOT". Puoi usarlo findmnt -o TARGET,FSROOTper ottenerlo. Se si desidera il percorso di origine assoluto, probabilmente è necessario analizzare /proc/self/mountinfoda soli e combinare le informazioni sui montaggi per lo stesso filesystem.

Per ulteriori informazioni, consultare la mia risposta a "Elenca solo i collegamenti di associazione" .


Se /proc/self/mountinfopossono contenere linee piace 2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro, allora Linux certamente non mantenere alcune informazioni su supporti bind.
Melab,

No. Guarda il mio secondo esempio. Mantiene le informazioni su quale file system è stato montato e quale percorso relativo alla radice del file system è stato montato . Così, per mount --bind /home/melab /mntla linea risultante potrebbe essere simile a una delle seguenti a seconda di quale di /homee /home/melabè un punto di montaggio: 3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw, 3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw,3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
cg909

È vero che qualcosa di diverso /nella quarta colonna indica spesso un attacco di associazione. Ma potrebbe anche essere un sottovolume di Btrfs.
cg909,

È /dev/sda3supposto per essere montato a /home/melab?
Melab

Sì. Nel mio esempio ho usato /dev/sda1come /, /dev/sda2come /homee /dev/sda3come/home/melab
cg909
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.