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 /