Come verificare se una partizione è montata da UUID?


16

Se ho l'UUID di una partizione di unità, come farei per scoprire se è montato o meno, usando la riga di comando?


Ho UUID duplicati sui miei dischi e questo non può essere evitato.
Joshua,

Credo che puoi cambiare l'UUID di una partizione con tune2fs.
Arronical,

@Joshua, @Arronical Sì, puoi cambiare l'UUID con tune2fs -U random /dev/sdxx. Ma questo non funzionerà per tutti i tipi di partizioni.
Katu,

In effetti non funzionerà. Le unità devono avere lo stesso UUID perché sono speculari. Il tentativo di rilevare tramite UUID restituisce percorsi duplicati anziché solo il dispositivo mirror.
Giosuè,

Risposte:


20

lsblkpotrebbe aiutare. Può stampare solo l'UUID e il punto di montaggio, quindi, dato l'UUID, vedi solo se il punto di montaggio non è vuoto:

uuid=foo
lsblk -o UUID,MOUNTPOINT | awk -v u="$uuid" '$1 == u {print $2}'

Così:

uuid=foo
mountpoint=$(lsblk -o UUID,MOUNTPOINT | awk -v u="$uuid" '$1 == u {print $2}')
if [[ -n $mountpoint ]]
then
    echo mounted
else
    echo not mounted
fi

Poiché lbslkpuò agire su dispositivi specifici, puoi anche fare:

mountpoint=$(lsblk -o MOUNTPOINT "/dev/disk/by-uuid/$uuid" | awk 'NR==2')

Con il primo metodo, non ci sarà un errore se l'UUID non proviene da un disco attualmente connesso. Con il secondo metodo, lsblksbaglierà se /dev/disk/by-uuid/$uuidnon esiste.


17
lsblk -o UUID,SIZE,MOUNTPOINT

Se vuoi solo una riga con il tuo UUID e mountpoint ($ UUID rappresenta il tuo UUID):

lsblk -o UUID,MOUNTPOINT|grep "$UUID"

Il punto di montaggio sarà vuoto se non è montato. Prova lsblk -haltre opzioni.

Utilizzare awkper stampare il risultato. se NF(Numero di campi) è più di uno significa che ha un punto di montaggio:

lsblk -o UUID,MOUNTPOINT|grep "$UUID"|awk '{if (NF>1) print $1" is mounted"; else print $1" is unmounted";}'

3
si Questo ! esattamente questo! inoltre può essere migliorato con grep per filtrare l'UUID specifico, forse anche analizzarlo con awk
Sergiy Kolodyazhnyy,

9

Se vuoi i dettagli a partire da mount

for uuid in /dev/disk/by-uuid/*; do if [[ "$uuid" =~ .*your-UUID-here.* ]]; then echo $(mount | grep "$(readlink -e "$uuid")") ; fi; done

sostituisci your-UUID-herecon il tuo UUID

più facilmente:

 for uuid in /dev/disk/by-uuid/*; do 
   if [[ "$uuid" =~ .*your-UUID-here.* ]]
     then echo $(mount | grep "$(readlink -e "$uuid")")
   fi
 done

esempio di output:

/dev/mmcblk1p2 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

Puoi semplicemente verificare che la stringa non sia null ed echo "montato":

for uuid in /dev/disk/by-uuid/*; do if [[ "$uuid" =~ .*your-UUID-here.* ]]; then if [[ $(mount | grep "$(readlink -e "$uuid")") ]]; then echo "mounted"; fi; fi; done

ma altri hanno dato modi migliori per farlo :)


Mi piace il percorso alternativo +1 :)
Arronical,

@Arronical molto generoso da parte tua: D
Zanna,

6

Ubuntu utilizza il UDisks2demone, che esegue il polling di molte informazioni sui file system e possiamo usare udisksctle filtrare il suo output per trovare un modo rapido e sporco per trovare le informazioni di cui abbiamo bisogno:

udisksctl dump | python -c 'import sys;lines = [l.strip() for l in sys.stdin if " UUID" in l or " MountPoints:" in l];print "\n".join(lines)'

Quello che vedi sopra, fondamentalmente stamperà gli UUID dei filesystem e i loro mountpoint. Con l'ispezione visiva ora puoi capire quale UUID è montato e quale no.

$ udisksctl dump | python -c 'import sys;lines = [l.strip() for l in sys.stdin                                           
> if " UUID" in l or " MountPoints:" in l];print "\n".join(lines)'
MountPoints:        /
UUID:               000b5321-01
MountPoints:
UUID:               bbf23a81-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               bbf23a87-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               bbf23a89-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               bbf23a8f-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               02fe8de2-a408-11e4-8eeb-f0761c8c6df7
MountPoints:        /mnt/HDD
UUID:               53827413-0b7e-4ae6-ae09-1daea529d6a1

6

La mia soluzione

  • usa solo una shell e procfsquindi nessun strano problema di formattazione dell'output del comando,
  • non (ri) scansiona gli UUID del dispositivo ma usa la cache del kernel,
  • pertanto non richiede privilegi di superutente,
  • non si basa su nomi di percorsi canonicalizzati ma utilizza l'identità del file (dispositivo).
my_uuid=...
while IFS=' ' read -r dev mnt remainder; do
  case "$dev" in
  /dev/*)
    if [ "$dev" -ef "/dev/disk/by-uuid/$my_uuid" ]; then
      echo "$my_uuid ($dev) mounted at $mnt"
      break
    fi;;
  esac
done < /proc/mounts

5

Sulla base delle eccellenti risposte ricevute per questa domanda, mi sono reso conto che è molto più facile lavorare con i nomi dei dispositivi. Per ottenere il nome del dispositivo da UUID:

disk_uuid=foo
disk_devname=$(blkid -U "$disk_uuid")

Ciò significa che posso dedurre rapidamente se è montato grepping l'output di df:

df | grep -q "$disk_devname" && echo "Disk mounted" || echo "Disk not mounted"

O usando il codice nella risposta di Muru , che ha l'ulteriore vantaggio di dirmi dove è montato il disco:

mountpoint=$(lsblk -no MOUNTPOINT "$disk_devname")
if [[ -n  "$mountpoint" ]]; then
   echo "Disk is mounted at $mountpoint"
else
   echo "Disk not mounted"
fi

4

È possibile utilizzare il dfcomando per visualizzare i file system montati e il loro punto di montaggio. Ecco un esempio dalla mia macchina ... la partizione sdb3, su cui ho installato un altro sistema, non è montata, quindi non elencata (le partizioni sono rietichettate, ecco perché i nomi sono mostrati invece degli UUID):

df
Filesystem                   1K-blocks     Used Available Use% Mounted on
udev                           8100756        0   8100756   0% /dev
tmpfs                          1625296     9952   1615344   1% /run
/dev/sdb4                     41022688  7074348  31834804  19% /
tmpfs                          8126464    19456   8107008   1% /dev/shm
tmpfs                             5120        4      5116   1% /run/lock
tmpfs                          8126464        0   8126464   0% /sys/fs/cgroup
/dev/loop0                       76800    76800         0 100% /snap/ubuntu-core/423
/dev/sdb1                      4186108    12160   4173948   1% /boot/efi
zsc-lxd/containers/uc-1604-1  58620160   516736  58103424   1% /var/lib/lxd/containers/uc-1604-1.zfs
zsc-lxd/containers/uc-1610-1  58637184   533760  58103424   1% /var/lib/lxd/containers/uc-1610-1.zfs
tmpfs                          1625292      124   1625168   1% /run/user/1000
/dev/sdb5                     61796348 10766892  47867344  19% /media/cl/virtual
/dev/sda4                    206293688 13419740 182371804   7% /media/cl/system
/dev/sda3                    206293688 32116600 163674944  17% /media/cl/rescue
/dev/sda2                    206293688  1867604 193923940   1% /media/cl/media
/dev/sda1                    206293688  2539712 193251832   2% /media/cl/data  

Posso usare l'UUID della partizione con df?
Arronical

0

Se è presente un collegamento denominato " the_UUID" nella /dev/disk/by-uuid/partizione è montato. Sul mio Ubuntu 14.04.5 (YMMV):

$ ll /dev/disk/by-uuid
total 0
lrwxrwxrwx 1 root root  9 Nov 14 04:30 0123-4567 -> ../../sde
lrwxrwxrwx 1 root root 10 Nov 11 00:25 06ee65d5-26f7-41f3-91ab-3497021a6213 -> ../../dm-0
lrwxrwxrwx 1 root root 10 Nov 11 00:25 12817b99-9d2b-4357-a4ca-c11eab672a20 -> ../../sdb6
lrwxrwxrwx 1 root root 10 Nov 11 00:25 362254e8-2b99-442d-8ad9-4a348bc08032 -> ../../sda1
lrwxrwxrwx 1 root root 10 Nov 11 00:25 83a64b80-5a37-4659-b797-221b88ef41f8 -> ../../sdb5
lrwxrwxrwx 1 root root 10 Nov 11 00:25 ff359af0-d996-4949-b27e-f24ce453c48c -> ../../sdc1

2
Purtroppo il mio disco collegato è visualizzato in questo elenco anche se non montato.
Arronical

Cerca messaggi "interessanti" in dmesge /var/log/kern.log*. Sembra che il sistema non sia soddisfatto del filesystem sulla partizione e non possa montarlo. Una possibile causa è l'ibernazione di Windows.
Waltinator,

Penso di essere stato un po 'confuso, l'unità si monta e smonta in modo pulito. È solo che mentre non è montato, ma è collegato e acceso, viene visualizzato nella /dev/disks/by-uuid/directory.
Arronical

2
No, /dev/disk/by-uuide le sue controparti detengono tutti gli UUID / ID / etichette dei dispositivi collegati noti a udev indipendentemente dal loro stato di montaggio.
David Foerster,
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.