Determinar en qué dispositivo se encuentra un directorio

Determinar en qué dispositivo se encuentra un directorio

Si lo hago

# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt

la entrada /proc/mountses

/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0

cuál es el dispositivo que está montado /homey no es fácilmente deducible de $PWDcuál está /test. ¿Cómo puedo determinar en qué dispositivo (es decir, /dev/sda2) aparecerá en /proc/mountsgeneral, dado que el montaje de enlace puede ser en un directorio/archivo que está potencialmente "oculto" por enlaces simbólicos, otros montajes de enlace, etc.?

Respuesta1

Si entiendo su pregunta, querrá saber qué dispositivo se utilizó para un soporte determinado. Para esto puedes usar el dfcomando:

$ df -h 
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/fedora_greeneggs-root   50G   21G   27G  44% /
devtmpfs                           3.8G     0  3.8G   0% /dev
tmpfs                              3.8G   14M  3.8G   1% /dev/shm
tmpfs                              3.8G  984K  3.8G   1% /run
tmpfs                              3.8G     0  3.8G   0% /sys/fs/cgroup
tmpfs                              3.8G  3.4M  3.8G   1% /tmp
/dev/sda1                          477M   99M  349M  23% /boot
/dev/mapper/fedora_greeneggs-home  402G  184G  198G  49% /home

Para encontrar en qué dispositivo se encuentra un archivo/directorio en particular, proporcione el archivo como argumento a df. Usando tu ejemplo:

$ df -h /mnt
Filesystem                         Size  Used Avail Use% Mounted on
/dev/sda1                          477M   99M  349M  23% /

También puedes usar el mountcomando:

$ mount | grep '^/dev'
/dev/mapper/fedora_greeneggs-root on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
/dev/mapper/fedora_greeneggs-home on /home type ext4 (rw,relatime,seclabel,data=ordered)

El directorio montado para cada dispositivo es el tercer argumento en el resultado anterior. Entonces, para el dispositivo /dev/sda1sería /boot. Los otros dispositivos utilizan LVM (administración de volumen lógico) y sería necesario realizar más consultas para saber qué dispositivo real está utilizando LVM.

Respuesta2

En Linux tenemos findmntexactamente util-linuxhecho para esto.

findmnt -n -o SOURCE --target /path/to/FILE

La ventaja de otras soluciones es que todavía funciona si las rutas están oscurecidas por enlaces simbólicos o montajes de enlace duplicados.

Respuesta3

El método más preciso que conozco es utilizar la salida de la llamada al sistema lstat(). Específicamente, el campo st_dev. Existe una utilidad de línea de comando, stat(1) que se puede utilizar para ver esta información. Por ejemplo, la salida de "stat /etc/issue" en mi computadora portátil:

File: ‘/etc/issue’
  Size: 65          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 1610916043  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Observe la tercera línea, primer campo, "Dispositivo". Aquí enumera 801h. Ese valor se puede separar en dos bytes, 8 y 1. El primer byte se conoce como número mayor, el segundo byte es el número menor. Entonces, el siguiente paso es descubrir qué dispositivo es mayor 8, menor 1.

Considero que consultar /proc/partitions es el más rápido. En mi caso, /proc/partitions tiene el contenido:

major minor  #blocks  name

   8       16  234431064 sdb
   8       17   33554432 sdb1
   8       18  200875608 sdb2
   8        0  500107608 sda
   8        1  500106584 sda1

De ese resultado queda bastante claro que mayor 8, menor 1 es sda1. Podemos confirmar esto con un ls -l /dev/sda1

brw-rw---- 1 root disk 8, 1 May  8 05:33 /dev/sda1

Observe el 8, 1 antes de la marca de fecha.

Es importante comprender/recordar que el nombre de un archivo de dispositivo como /dev/sda1 es solo una etiqueta. Los números mayores y menores son los valores importantes y significativos del archivo del dispositivo. Si tiene curiosidad, consulte la utilidad mknod(1) utilizada para crear archivos de dispositivos. Podría crear una nueva entrada/dev llamada aardvark con mayor 8, menor 18 con la siguiente sintaxis:

mknod /dev/aardvark b 8 18

Entonces, podría montarlo fácilmente:

mount /dev/aardvark /mnt

y, si miramos la salida del comando mount o el contenido de /proc/mounts y vemos:

/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)

df -h muestra:

/dev/aardvark   192G  154G   38G  81% /mnt

... De todos modos, el objetivo de todo esto es ilustrar que los detalles importantes para identificar un dispositivo de bloque son los números mayor y menor, no la etiqueta del archivo del dispositivo, y que usar la llamada al sistema lstat() es la mejor manera de consultar esos valores.

Como último comentario, releí tu pregunta para asegurarme de que la estaba respondiendo y me di cuenta de que estabas preguntando qué etiqueta de dispositivo de origen aparecería en /proc/mounts para un montaje vinculado. Esa sería la misma etiqueta de dispositivo fuente que se usó en la llamada mount(2) original para la fuente del punto de montaje del sistema de archivos para el montaje de enlace. Quizás un ejemplo ayudaría:

Tengo /dev/sdb2 y /dev/aardvark (el mismo que el anterior). Ambos son mayores 8, menores 18. Tenga en cuenta que montaré el mismo sistema de archivos dos veces. Hago lo siguiente:

mkdir /mnt1 /mnt2 /foo

mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2

Observe que hago el directorio en algún directorio en /mnt1. Pero dado que /mnt1 y /mnt2 tienen el mismo sistema de archivos montado, también se podrá acceder a algún directorio a través de /mnt2.

mkdir /mnt1/somedir

mkdir /foo/left /foo/right

mount -o bind /mnt1/somedir /foo/left
mount -o bind /mnt2/somedir /foo/right

Ahora, si marcamos /proc/mounts, vemos:

/dev/aardvark /mnt1 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/aardvark /foo/left xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /foo/right xfs rw,relatime,attr2,inode64,noquota 0 0

La etiqueta del dispositivo de origen en los montajes de enlace /foo/... es el mismo que el valor proporcionado originalmente en la llamada mount(2) del sistema de archivos. Recuerde, /dev/aardvark y /dev/sdb2 en mi ejemplo son el mismo dispositivo.

Me doy cuenta de que acabo de escribir una novela y la primera mitad realmente no responde a tu pregunta en absoluto, pero me pareció un desperdicio borrarla. Quizás ayude a alguien más.

Buena suerte.

PD: Tenga en cuenta que algunos sistemas de archivos están basados ​​en red, como NFS o CIFS, o son virtuales, como procfs o sysfs, y no tienen un dispositivo de bloqueo de código fuente. No sé qué se devolverá como dispositivo en la salida estadística, solo por lo que vale.

Respuesta4

El ducomando se puede llamar con un -xmodificador para ignorar el contenido de otros sistemas de archivos montados.

El -kconmutador muestra los tamaños de directorio en KB.

Para mostrar directorios >~ 1 MB de tamaño.

du -xk / | awk ' $1 > 1000000 { print } '

información relacionada