¿Existe algún comando para ver dónde está montado un disco?

¿Existe algún comando para ver dónde está montado un disco?

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

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

Respuesta1

En Linux, ahora puedes usar el findmntcomando de 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

Éste también es útil para encontrar todo el sistema de archivos montado en 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 sólo el punto de montaje:

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

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

Entonces:

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

Respuesta2

En Linux, puede obtener información del punto de montaje directamente desde el kernel en formato /proc/mounts. El mountprograma registra información similar en formato /etc/mtab. Las rutas y opciones pueden ser diferentes, ya que /etc/mtabrepresentan lo que mountpasó al kernel y /proc/mountsmuestran los datos tal como se ven dentro del kernel. /proc/mountssiempre está actualizado, mientras que /etc/mtabpodría no estarlo si fuera de /etcsolo lectura en algún momento no esperado por los scripts de arranque. 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 una serie de 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ás de esta manera. En /proc/mounts, los soportes de enlace son indistinguibles del original. Puede haber más de una coincidencia si un punto de montaje sigue a otro (esto es inusual).

En /proc/selfo /proc/$pidhay un mountsarchivo por proceso que imita el archivo global. La información de montaje puede variar entre procesos, por ejemplo debido achroot. 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. Desde eldocumentació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 buscas un dispositivo por número, puedes 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}'

Respuesta3

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

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

Respuesta4

No conozco una forma limpia y sencilla de detectar si un nodo de dispositivo /devestá montado o no. Pero 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/mountshastasalida estándarsi lo encuentra, también establezca el estado de salida en 0. De lo contrario, el estado de salida es 1.

información relacionada