Anteriormente demostré cómo utilizar la herramienta mountpoint para saber si un directorio es un punto de montaje a un sistema de archivos en un dispositivo aparte. Ahora veamos cómo saber a qué dispositivo pertenece un archivo o directorio, lo cual puede ser de utilidad al momento de necesitar desmontar un filesystem para correr un chequeo de disco.

¿Qué ocurre si necesitamos desmontar un sistema de archivos y no sabemos si cierto archivo o directorio en uso se verá afectado? Es necesario saber a qué dispositivo pertenece el archivo o directorio en cuestión.

Tal vez la respuesta parezca trivial, y simplemente baste con examinar la salida de mount. Sin embargo, cuando hay muchos sistemas de archivos montados (incluso algunos de forma anidada), puede ser una tarea no trivial de resolver desde un script.

Por ejemplo, deseamos saber en qué dispositivo se encuentra el directorio /usr/local. La salida de mount lista todos los puntos de montaje junto con los dispositivos y formato de sistema de archivos:

root@devuan:~# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=498936k,nr_inodes=124734,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=102036k,mode=755)
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
pstore on /sys/fs/pstore type pstore (rw,relatime)
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=413360k)
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/elogind type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/elogind/elogind-cgroups-agent,name=elogind)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=102032k,mode=700,uid=1000,gid=1000)

A simple vista ya cuesta determinar en qué sistema de archivos se encuentra. Más aún desde un script.

Puede ser un punto de montaje en sí (/usr/local en una partición independiente); puede estar el directorio /usr en una partición separada; o puede pertenecer directamente al dispositivo del sistema de archivos raíz (/), como es en este caso.

La forma simple y efectiva de determinar el dispositivo al que pertenece un archivo, es utilizando la herramienta df:

root@devuan:~# df /usr/local/
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1        7158264 3758208   3016724  56% /

La herramienta df sirve para determinar el uso de disco, espacio libre, uso de inodos, etc. Tal como se observa en la salida, cuando se pasa un archivo o directorio como parámetro, la primera columna indica el dispositivo al que pertenece:

root@devuan:~# df /var/log/messages
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1        7158264 3758208   3016724  56% /

Agregando un poco de filtrado con grep y cut, se puede obtener sólo el nombre del dispositivo:

root@devuan:~# df /var/log/messages | tail -n 1 | cut -d' ' -f1
/dev/sda1

Y si, en lugar del dispositivo, se requiere conocer el punto de montaje:

root@devuan:~# mount | grep $(df /var/log/messages | tail -n 1 | cut -d' ' -f1) | cut -d' ' -f3
/

Compartí este artículo