Comment vérifier si une partition est montée par UUID?

16

Si j'ai l'UUID d'une partition de lecteur, comment pourrais-je savoir si elle est montée ou non, en utilisant la ligne de commande?

Arronical
la source
J'ai des UUID dupliqués sur mes disques, et cela ne peut pas être évité.
Joshua
Je crois que vous pouvez changer l'uuid d'une partition avec tune2fs.
Arronical
@Joshua, @Arronical Oui, vous pouvez changer l'UUID avec tune2fs -U random /dev/sdxx. Mais cela ne fonctionnera pas pour tous les types de partitions.
Katu
En fait, cela ne fonctionnera pas. Les lecteurs doivent avoir le même UUID car ils sont en miroir. Essayer de détecter par UUID renvoie des chemins en double plutôt que uniquement le périphérique miroir.
Joshua

Réponses:

20

lsblkpourrait aider. Il peut imprimer uniquement l'UUID et le point de montage, donc, étant donné l'UUID, voyez simplement si le point de montage n'est pas vide:

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

Donc:

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

Puisque lbslkpeut agir sur des appareils spécifiques, vous pouvez également faire:

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

Avec la première méthode, il n'y aura pas d'erreur si cet UUID ne provient pas d'un disque actuellement connecté. Avec la deuxième méthode, lsblkl'erreur sortira si elle /dev/disk/by-uuid/$uuidn'existe pas.

muru
la source
17
lsblk -o UUID,SIZE,MOUNTPOINT

Si vous ne voulez qu'une seule ligne avec votre UUID et votre point de montage ($ UUID représente votre UUID):

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

Le point de montage sera vide s'il est démonté. Essayez lsblk -hpour plus d'options.

Utilisez awkpour imprimer le résultat. si NF(Nombre de champs) est supérieur à un, cela signifie qu'il a un point de montage:

lsblk -o UUID,MOUNTPOINT|grep "$UUID"|awk '{if (NF>1) print $1" is mounted"; else print $1" is unmounted";}'
Katu
la source
3
Oui ca ! exactement ça ! peut également être amélioré avec grep pour filtrer des UUID spécifiques, peut-être même analyser avec awk
Sergiy Kolodyazhnyy
9

Si vous voulez les détails à partir de mount

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

remplacer your-UUID-herepar votre UUID

de manière plus lisible:

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

exemple de sortie:

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

Vous pouvez simplement lui faire vérifier que la chaîne n'est pas nulle et l'écho "monté":

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

mais d'autres ont donné de meilleures façons de le faire :)

Zanna
la source
J'aime l'itinéraire alternatif +1 :)
Arronical
@Arronical très généreux de votre part: D
Zanna
6

Ubuntu utilise le UDisks2démon, qui interroge beaucoup d'informations sur les systèmes de fichiers, et nous pouvons utiliser udisksctlet filtrer sa sortie pour trouver un moyen rapide et sale de trouver les informations dont nous avons besoin:

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)'

Ce que vous voyez ci-dessus, imprimera essentiellement les UUID des systèmes de fichiers et leurs points de montage. Par inspection visuelle, vous pouvez maintenant déterminer quel UUID est monté et lequel ne l'est pas.

$ 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
Sergiy Kolodyazhnyy
la source
6

Ma solution

  • utilise uniquement un shell et procfs, donc aucun problème de formatage de sortie de commande bizarre,
  • ne (ré) analyse pas les UUID du périphérique mais utilise le cache du noyau,
  • ne nécessite donc pas de privilèges de super-utilisateur,
  • ne repose pas sur des noms de chemin canonisés mais utilise l'identité de fichier (périphérique).
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
David Foerster
la source
5

En me basant sur les excellentes réponses que j'ai reçues pour cette question, j'ai réalisé qu'il était beaucoup plus facile de travailler avec des noms d'appareils. Pour obtenir le nom de l'appareil à partir de l'UUID:

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

Ce qui signifie que je peux rapidement déduire s'il est monté en saluant la sortie de df:

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

Ou en utilisant le code dans la réponse de Muru , qui a l'avantage supplémentaire de me dire où le lecteur est monté:

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

Vous pouvez utiliser la dfcommande pour voir les systèmes de fichiers montés et leur point de montage. Voici un exemple de ma machine ... la partition sdb3, sur laquelle j'ai un autre système installé, n'est pas montée, donc pas répertoriée (les partitions sont ré-étiquetées, c'est pourquoi les noms sont affichés à la place des 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  
cl-netbox
la source
Puis-je utiliser la partition UUID avec df?
Arronical
0

S'il y a un lien nommé " the_UUID" dans /dev/disk/by-uuid/la partition est montée. Sur mon 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
waltinator
la source
2
Malheureusement, mon lecteur qui est connecté apparaît dans cette liste même s'il n'est pas monté.
Arronical
Recherchez les messages "intéressants" dans dmesget /var/log/kern.log*. Il semble que le système ne soit pas satisfait du système de fichiers sur la partition et ne puisse pas le monter. Une des causes possibles est l'hibernation de Windows.
waltinator
Je pense que j'ai pu être déroutant, le lecteur monte et se démonte proprement. C'est juste que bien qu'il ne soit pas monté, mais qu'il soit connecté et allumé, il apparaît dans le /dev/disks/by-uuid/répertoire.
Arronical
2
Non, /dev/disk/by-uuidet ses homologues détiennent tous les UUID / ID / étiquettes des appareils connectés connus d'udev, quel que soit leur état de montage.
David Foerster