¿Hay un comando para ver dónde está montado un disco?

29

¿Existe un comando simple que toma el nodo del dispositivo de un disco como entrada y me dice dónde (y si) ese disco está montado? ¿Es posible obtener el punto de montaje por sí mismo, para poder pasarlo a otro comando?

Estoy trabajando en un sistema en vivo de Debian Squeeze con una instalación mínima (puedo instalar paquetes adicionales si es necesario).

desviarse
fuente

Respuestas:

14

En Linux, puede obtener información del punto de montaje directamente desde el núcleo /proc/mounts. El mountprograma registra información similar en /etc/mtab. Las rutas y opciones pueden ser diferentes, ya que /etc/mtabrepresenta lo que mountpasó al núcleo mientras que /proc/mountsmuestra los datos tal como se ven dentro del núcleo. /proc/mountssiempre está actualizado, mientras que /etc/mtabpodría no serlo si /etcfuera de solo lectura en algún momento que los scripts de arranque no esperaban. El formato es similar a /etc/fstab.

En ambos archivos, el primer campo separado por espacios en blanco contiene la ruta del dispositivo y el segundo campo contiene el punto de montaje.

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

o si no tienes awk:

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

Hay varios casos extremos en los que es posible que no obtenga lo que espera. Si el dispositivo se montó a través de una ruta diferente /devque designa el mismo dispositivo, no lo notará de esta manera. En /proc/mounts, las monturas de unión no se pueden distinguir del original. Puede haber más de una coincidencia si un punto de montaje sombrea a otro (esto es inusual).

En /proc/selfo /proc/$pid, hay un mountsarchivo por proceso que imita el archivo global. La información de montaje puede variar entre procesos, por ejemplo debido a chroot. Hay un archivo adicional llamado mountinfoque tiene un formato diferente e incluye más información, en particular los números mayores y menores del dispositivo. De la documentación :

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

Entonces, si está buscando un dispositivo por número, puede hacerlo así:

awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'
Gilles 'SO- deja de ser malvado'
fuente
"Si el dispositivo se montó a través de una ruta diferente en / dev que designa el mismo dispositivo, no lo notará de esta manera". - Ese es realmente el caso: tengo el udisksenlace simbólico (en / dev / disk / by-label / ...). Pero puedo resolver a un nodo de dispositivo usando readlink -f. Me gusta la /proc/mountsidea, creo que podría ser un poco más confiable que /etc/mtab.
desvío
@detly O puedes usar mountinfo. Llame statpara obtener los números de dispositivo (vea mi respuesta actualizada, olvidé incluir el comando anteriormente).
Gilles 'SO- deja de ser malvado'
Es posible que necesite una -d " "opción cuten ese grepcomando.
Craig McQueen
26

En Linux, ahora puede usar el findmntcomando desde util-linux(desde la versión 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

O lsblk(también de util-linux, desde 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

Ese también es útil para encontrar todo el sistema de archivos montado bajo un dispositivo específico (disco o partición ...):

$ 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  /

Para obtener solo el punto de montaje:

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

Lo anterior findmntvuelve con un estado de salida de falla si el dispositivo no está montado, no lsblk.

Asi que:

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
Stéphane Chazelas
fuente
Siempre es bueno aprender algo nuevo
roaima
6

El mountcomando sin argumentos enumerará todos los sistemas de archivos actualmente montados; puede grephacerlo para el disco que desea (o grep /etc/mtab, que es el archivo mountlee la información de):

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
Michael Mrozek
fuente
Sin embargo, eso tiene mucho texto extraño. Necesito poder pasar el punto de montaje a otros comandos. (Lo siento, lo he aclarado en la Q.)
deténte el
Ah, grep ${NODE} /etc/mtab | cut -d ' ' -f 2debería hacerlo.
desvío
Aunque grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"es mucho menos frágil ...
detly
2

Sí. Puede ver Mostrar solo puntos de montaje interesantes / Filtrar tipos no interesantes o Directorios de listados debajo de /No están bajo el mismo punto de montaje para algún uso de ejemplo, pero también hay un breve resumen a continuación. El comando que está preguntando es findmnt (aunque lsblktambién podría servir) :

lsblk -f /dev/sda[12]

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

Ahora, como puedes ver, /dev/sda1está montado /esp. Me pregunto si también está montado en otro lugar.

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

Ajá. Veo. También se --bindmonta una subcarpeta sobre el arranque. Okay...

sudo umount /boot /esp
findmnt /dev/sda1

Nada. ¿Que demonios?

echo "$?"

1

Ohhh ... Bueno, eso está bien. 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í, eso es realmente lindo.

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

/dev/sda2[/arch_root] /

Ahora volvamos a colocar sda1 donde pertenece e intentemos eso de nuevo ...

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] /

¿Pero dónde encontré este comando mágico?

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

Para una salida más robusta y personalizable, use findmnt(8) , especialmente en sus scripts. Tenga en cuenta que los caracteres de control en el nombre del punto de montaje se reemplazan con ?.

mikeserv
fuente
1

No conozco una manera limpia y simple de detectar si un nodo de dispositivo /devestá montado o no . Sin embargo, esto es lo que puedo ofrecer. Maneja dispositivos montados directamente ( /dev/sda1) y dispositivos montados por UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f). Se rompe si los nombres de sus dispositivos contienen espacios en blanco.

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 función escribe la entrada desde /proc/mountsen stdout si se encuentra, también establece el estado de salida en 0. De lo contrario, el estado de salida es 1.

roaima
fuente
-1

Simplemente ejecute el siguiente comando:

df -h
Steve
fuente