¿Cómo verificar si una partición está montada por UUID?

16

Si tengo el UUID de una partición de unidad, ¿cómo podría averiguar si está montado o no, usando la línea de comando?

Arronico
fuente
Tengo UUID duplicados en mis discos, y esto no se puede evitar.
Joshua
Creo que puedes cambiar el uuid de una partición con tune2fs.
Arronico
@Joshua, @Arronical Sí, puede cambiar el UUID con tune2fs -U random /dev/sdxx. Pero esto no funcionará para todos los tipos de particiones.
Katu
De hecho no funcionará. Las unidades deben tener el mismo UUID porque están reflejadas. Intentar detectar mediante UUID devuelve rutas duplicadas en lugar de solo el dispositivo espejo.
Joshua

Respuestas:

20

lsblkpodría ayudar. Puede imprimir solo el UUID y el punto de montaje, por lo tanto, dado el UUID, solo vea si el punto de montaje no está vacío:

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

Entonces:

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

Como lbslkpuede actuar en dispositivos específicos, también puede hacer:

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

Con el primer método, no habrá un error si ese UUID no es de un disco conectado actualmente. Con el segundo método, se lsblkproducirá un error si /dev/disk/by-uuid/$uuidno existe.

muru
fuente
17
lsblk -o UUID,SIZE,MOUNTPOINT

Si solo desea una línea con su UUID y punto de montaje ($ UUID representa su UUID):

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

El punto de montaje estará vacío si se desmonta. Prueba lsblk -hpor más opciones.

Use awkpara imprimir el resultado. si NF(Número de campos) es más de uno, significa que tiene un punto de montaje:

lsblk -o UUID,MOUNTPOINT|grep "$UUID"|awk '{if (NF>1) print $1" is mounted"; else print $1" is unmounted";}'
Katu
fuente
3
si esto ! exactamente esto! también se puede mejorar con grep para filtrar UUID específico, tal vez incluso analizar con awk
Sergiy Kolodyazhnyy
9

Si quieres los detalles a 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

reemplazar your-UUID-herecon su UUID

más legible:

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

ejemplo de salida:

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

Simplemente puede hacer que compruebe que la cadena no es nula y echo "montado":

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

pero otros dieron mejores formas de hacerlo :)

Zanna
fuente
Me gusta la ruta alternativa +1 :)
Arronical
@Arronical muy generoso de tu parte: D
Zanna
6

Ubuntu usa UDisks2daemon, que sondea mucha información sobre sistemas de archivos, y podemos usar udisksctly filtrar su salida para encontrar una manera rápida y sucia de encontrar la información que necesitamos:

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

Lo que ves arriba, básicamente imprimirá UUID de sistemas de archivos y sus puntos de montaje. Mediante inspección visual, ahora puede averiguar qué UUID está montado y cuál 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
Sergiy Kolodyazhnyy
fuente
6

Mi solución

  • sólo utiliza una concha y procfstemas, el formato de salida de comandos por lo que no extraña,
  • no (re) UUID del dispositivo de exploración sino que utiliza la memoria caché del núcleo,
  • por lo tanto no requiere privilegios de superusuario,
  • no se basa en los nombres de ruta canonicalised pero la identidad usos archivo (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
David Foerster
fuente
5

Sobre la base de las excelentes respuestas que recibí para esta pregunta, me di cuenta de que es mucho más fácil trabajar con los nombres de los dispositivos. Para obtener el nombre del dispositivo de UUID:

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

Lo que significa que puedo deducir rápidamente si está montado haciendo grep a la salida de df:

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

O usando el código en la respuesta de Muru , que tiene la ventaja adicional de decirme dónde está montado el disco:

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

Puede usar el dfcomando para ver los sistemas de archivos montados y su punto de montaje. Aquí hay un ejemplo de mi máquina ... la partición sdb3, en la que tengo otro sistema instalado, no está montada, por lo que no aparece en la lista (las particiones se vuelven a etiquetar, por eso se muestran los nombres en lugar de los 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
fuente
¿Puedo usar la partición UUID con df?
Arronico
0

Si hay un enlace llamado " the_UUID" en /dev/disk/by-uuid/la partición está montado. En mi 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
fuente
2
Lamentablemente, mi unidad que está conectada aparece en esta lista incluso si no está montada.
Arronico
Busque mensajes "interesantes" en dmesgy /var/log/kern.log*. Suena como el sistema no está contento con el sistema de archivos en la partición, y no puede montarlo. Una posible causa es la hibernación de Windows.
waltinator
Creo que puede haber sido confuso, los montajes y desmontajes de unidad limpiamente. Es que si bien no está montado, pero está conectada y encendida, se muestra en el /dev/disks/by-uuid/directorio.
Arronico
2
No, /dev/disk/by-uuidy sus homólogos contienen todos los UUID / ID / etiquetas de dispositivos conectados conocidos por udev, independientemente de su estado de montaje.
David Foerster