¿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 findmnt
comando 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 findmnt
regresa 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 mount
programa registra información similar en formato /etc/mtab
. Las rutas y opciones pueden ser diferentes, ya que /etc/mtab
representan lo que mount
pasó al kernel y /proc/mounts
muestran los datos tal como se ven dentro del kernel. /proc/mounts
siempre está actualizado, mientras que /etc/mtab
podría no estarlo si fuera de /etc
solo 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 /dev
que 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/self
o /proc/$pid
hay un mounts
archivo 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 mountinfo
que 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 mount
comando sin argumentos enumerará todos los sistemas de archivos actualmente montados; Puede grep
hacerlo para el disco que desee (o grep
/etc/mtab
, que es el archivo mount
del 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 /dev
está 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/mounts
hastasalida estándarsi lo encuentra, también establezca el estado de salida en 0. De lo contrario, el estado de salida es 1.