Esiste un comando per vedere dove è montato un disco?


29

Esiste un semplice comando che accetta il nodo del dispositivo di un disco come input e mi dice dove (e se) quel disco è montato? È possibile ottenere il punto di montaggio da solo, quindi posso passarlo a un altro comando?

Sto lavorando su un sistema live Debian Squeeze con un'installazione minima (posso installare pacchetti extra se necessario).

Risposte:


14

Sotto Linux, puoi ottenere informazioni sul mount point direttamente dal kernel in /proc/mounts. Il mountprogramma registra informazioni simili in /etc/mtab. I percorsi e le opzioni possono essere diversi, in quanto /etc/mtabrappresenta ciò che è mountpassato al kernel mentre /proc/mountsmostra i dati come visualizzati all'interno del kernel. /proc/mountsè sempre aggiornato mentre /etc/mtabpotrebbe non essere se /etcfosse di sola lettura ad un certo punto che non era previsto dagli script di avvio. Il formato è simile a /etc/fstab.

In entrambi i file, il primo campo separato da spazi bianchi contiene il percorso del dispositivo e il secondo campo contiene il punto di montaggio.

awk -v needle="$device_path" '$1==needle {print $2}' /proc/mounts

o se non hai awk:

grep "^$device_path " /proc/mounts | cut -d ' ' -f 2

Esistono numerosi casi limite in cui potresti non ottenere ciò che ti aspetti. Se il dispositivo è stato montato tramite un percorso diverso /devche designa lo stesso dispositivo, non lo noterai in questo modo. In /proc/mounts, i supporti di collegamento sono indistinguibili dall'originale. Potrebbe esserci più di una corrispondenza se un punto di mount ne ombreggia un altro (questo è insolito).

In /proc/selfo /proc/$pidc'è un mountsfile per processo che imita il file globale. Le informazioni di montaggio possono variare tra i processi, ad esempio a causa di chroot. Esiste un file aggiuntivo chiamato mountinfoche ha un formato diverso e include ulteriori informazioni, in particolare i numeri maggiore e minore del dispositivo. Dalla documentazione :

36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
(1)(2)(3)   (4)   (5)      (6)      (7)   (8) (9)   (10)         (11)

(1) mount ID:  unique identifier of the mount (may be reused after umount)
(2) parent ID:  ID of parent (or of self for the top of the mount tree)
(3) major:minor:  value of st_dev for files on filesystem
(4) root:  root of the mount within the filesystem
(5) mount point:  mount point relative to the process's root
(6) mount options:  per mount options
(7) optional fields:  zero or more fields of the form "tag[:value]"
(8) separator:  marks the end of the optional fields
(9) filesystem type:  name of filesystem of the form "type[.subtype]"
(10) mount source:  filesystem specific information or "none"
(11) super options:  per super block options

Quindi, se stai cercando un dispositivo per numero, puoi farlo in questo modo:

awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'

"Se il dispositivo è stato montato tramite un percorso diverso in / dev che designa lo stesso dispositivo, non lo noterai in questo modo." - In realtà è così: ho il udiskslink simbolico (in / dev / disk / by-label / ...). Ma posso risolvere con un nodo del dispositivo usando readlink -f. Mi piace l' /proc/mountsidea, penso che potrebbe essere un po 'più affidabile di /etc/mtab.
Detly

@detly Oppure puoi usare mountinfo. Chiama statper ottenere i numeri del dispositivo (vedi la mia risposta aggiornata, ho dimenticato di includere il comando prima).
Gilles 'SO- smetti di essere malvagio' il

Potresti aver bisogno -d " "dell'opzione per cutin quel grepcomando.
Craig McQueen,


26

Su Linux, ora puoi usare il findmntcomando da util-linux(dalla versione 2.18):

$ findmnt -S /dev/VG_SC/home
TARGET SOURCE                 FSTYPE OPTIONS
/home  /dev/mapper/VG_SC-home ext4   rw,relatime,errors=remount-ro,data=ordered

Oppure lsblk(anche da util-linux, dal 2.19):

$ lsblk /dev/VG_SC/home
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
VG_SC-home 254:2    0  200G  0 lvm  /home

Quello è anche utile per trovare tutto il file system montato su un dispositivo specifico (disco o partizione ...):

$ lsblk  /dev/sda2
NAME                    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda2                      8:2    0  59.5G  0 part
├─linux-debian64 (dm-1) 252:1    0    15G  0 lvm
└─linux-mint (dm-2)     252:2    0    15G  0 lvm  /

Per ottenere solo il mountpoint:

$ findmnt -nr -o target -S /dev/storage/home
/home
$ lsblk -o MOUNTPOINT -nr /dev/storage/home
/home

Sopra findmntrestituisce con uno stato di uscita di errore se il dispositivo non è montato, no lsblk.

Così:

if mountpoint=$(findmnt -nr -o target -S "$device"); then
  printf '"%s" is mounted on "%s"\n' "$device" "$mountpoint"
else
  printf '"%s" does not appear to be directly mounted\n' "$device"
fi

È sempre bello imparare qualcosa di nuovo
roaima,

6

Il mountcomando senza argomenti elencherà tutti i filesystem attualmente montati; puoi farlo grepper il disco che vuoi (o grep /etc/mtab, che è il file mountlegge le informazioni da):

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0

Questo ha un sacco di testo estraneo però. Devo essere in grado di passare il punto di montaggio ad altri comandi. (Mi dispiace, l'ho chiarito nel Q.)
detly

Ah, grep ${NODE} /etc/mtab | cut -d ' ' -f 2dovrei farlo.
Detly

Anche se grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"è molto meno fragile ...
detly

2

Sì. Puoi vedere Mostrare solo punti di mount interessanti / Filtrare tipi non interessanti o Elenchi di directory /che non sono sotto lo stesso mountpoint per un uso di esempio, ma c'è anche una breve carrellata di seguito. Il comando di cui stai chiedendo è findmnt (anche se lsblkpotrebbe anche servire) :

lsblk -f /dev/sda[12]

NAME FSTYPE LABEL UUID                                 MOUNTPOINT
sda1 vfat   ESP   F0B7-5DAE                            /esp
sda2 btrfs  sys   94749918-bde1-46e6-b77c-b66e0368ecdb /    

Ora, come puoi vedere, /dev/sda1è montato /esp. Mi chiedo se è montato anche altrove?

findmnt /dev/sda1

TARGET SOURCE                    FSTYPE OPTIONS
/esp   /dev/sda1                 vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
/boot  /dev/sda1[/EFI/arch_root] vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro

Aha. Vedo. Una sottocartella è anche --bindmontata sopra l'avvio. Ok...

sudo umount /boot /esp
findmnt /dev/sda1

Niente. Che diavolo?

echo "$?"

1

Ohhh ... Beh, è ​​carino. Hmmm ...

for d in 1 2
do    findmnt "/dev/sda$d" >/dev/null
      printf  "/dev/sda$d%.$((6>>!$?))s%s\n"\
              " isn't" " currently mounted."
done

/dev/sda1 isn't currently mounted.
/dev/sda2 is currently mounted.

Oh sì, è davvero carino.

for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda2[/arch_root] /

Ora rimettiamo sda1 al suo posto e riproviamo ...

sudo mount -a
for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda1                 /esp
/dev/sda1[/EFI/arch_root] /boot
/dev/sda2[/arch_root] /

Ma dove ho trovato questo comando magico?

man mount | sed -e:n -e'/findmnt/!d;N;/\n$/q;bn'

Per un output più robusto e personalizzabile, utilizzare findmnt(8) , specialmente negli script. Si noti che i caratteri di controllo nel nome mountpoint vengono sostituiti con ?.


1

Non conosco un modo pulito e semplice per rilevare se /devè montato o meno un nodo del dispositivo . Questo è ciò che posso offrire, però. Gestisce dispositivi montati direttamente ( /dev/sda1) e dispositivi montati da UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f). Si interrompe se i nomi dei dispositivi contengono spazi bianchi.

deviceIsMounted()
{
    local DEVICE="$1"
    local MOUNT=$(
        (
            echo "$DEVICE"
            find /dev -type l -lname "*${DEVICE/*\/}" -exec readlink -f {} \; -print |
                xargs -n2 |
                awk -v device="$DEVICE" '$1 == device {print $2}'
        ) |
            xargs -n1 -i{} grep -F {} /proc/mounts
    )
    test -n "$MOUNT" && echo "$MOUNT"
}

deviceIsMounted /dev/sda1 && echo yes              # Mountpoint and status
deviceIsMounted /dev/md2 >/dev/null && echo yes    # Just status

La funzione scrive la voce dal /proc/mountsal stdout se trovato, anche impostando stato di uscita a 0. In caso contrario, lo stato di uscita è 1.


-1

Basta eseguire il comando seguente:

df -h
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.