¿Por qué los sistemas de archivos ext no llenan todo el dispositivo?

8

Acabo de notar que ninguno de los sistemas de archivos ext {2,3,4} que estoy tratando de crear en el disco duro 500G no usa todo el espacio disponible (466G). También probé reiser3, xfs, jfs, btrfs e incluso vfat. Todos ellos crean fs de tamaño 466G (como se muestra por df -h ). Sin embargo, ext * crea fs de 459G. Deshabilitar los bloques reservados aumenta el espacio disponible para el usuario, pero el tamaño de fs sigue siendo 459G.

Lo mismo es para 1Tb HDD: 932G reiserfs, 917G ext4.

Entonces, ¿cuál es esta diferencia del 1.5%? ¿Por qué sucede y existe la manera de hacer que ext llene todo el volumen?

UPD: Todas las pruebas realizadas en la misma máquina, en el mismo HDD, etc. No importa cómo 466G difiere de la comercialización de 500G. El problema es que difiere para diferentes FS '.

Acerca de df: muestra el tamaño total de FS, el tamaño utilizado y el espacio libre. En este caso tengo:

para reiserfs:

/ dev / sda1 466G 33M 466G 1% / mes

para ext4:

/ dev / sda1 459G 198M 435G 1% / mes

Si desactivo la reserva de bloqueo de raíz, 435G cambia a 459G - tamaño completo de fs (menos 198M). ¡Pero fs en sí mismo sigue siendo 459G para ext4 y 466G para reiser!

UPD2: llenado de volúmenes con datos reales a través de dd:

reiserfs:

fs: ~ # dd if = / dev / zero of = / mnt / 1
dd: запись в «/ mnt / 1»: На устройстве кончилось место
975702649 + 0 записей считано
975702648 + 0 записей написано
 скопировано 499559755776 байт (500 GB), 8705,61 c, 57,4 MB / c

ext2 con la reserva de bloques desactivada (mke2fs -m 0):

fs: ~ # dd if = / dev / zero of = / mnt / 1
dd: запись в «/ mnt / 1»: На устройстве кончилось место
960356153 + 0 записей считано
960356152 + 0 записей написано
 скопировано 491702349824 байта (492 GB), 8870,01 c, 55,4 MB / c

Perdón por el ruso, pero lo ejecuté en la configuración regional predeterminada y repetirlo es demasiado largo. No importa, la salida dd es obvia.

Entonces, resulta que mke2fs realmente crea un sistema de archivos más pequeño que otros mkfs.

Ineu
fuente
2
Hay una cierta cantidad de sobrecarga con cada FS ... No sé de una que le permita tener acceso a todo el espacio físico disponible en el disco.
prodigitalson
Le recomiendo que cambie su nombre para mostrar y ponga lo que parece ser su blog en el campo del sitio web de su perfil, para que sea menos descaradamente publicitario.
Hola71
1
Hola71, gracias por el consejo. El sitio web realmente no importa, es solo para openid.
Ineu
Para una nota futura, si desea que un programa salga rápidamente en inglés, use LANG=C foooLC_ALL=C foo
Alan Pearce
Alan, bien, gracias. Podría ser incluso LANG = o LANG = POSIX. Pero como dije, este proceso lleva mucho tiempo, por lo que volver a ejecutarlo con una configuración regional diferente solo por un par de líneas no es razonable :) En cualquier caso, demuestra un problema con el tamaño de FS para ext2 :(
Ineu

Respuestas:

19

Hay dos razones por las que esto es cierto.

Primero, por alguna razón u otros escritores del sistema operativo todavía informan el espacio libre en términos de un sistema base 2, y los fabricantes de discos duros informan el espacio libre en términos de un sistema base 10. Por ejemplo, un escritor del sistema operativo llamará a 1024 bytes (2 ^ 10 bytes) por kilobyte, y un fabricante de disco duro llamaría a 1000 bytes por kilobyte. Esta diferencia es bastante menor para los kilobytes, pero una vez que llega a los terabytes, es bastante significativa. Un escritor del sistema operativo llamará a 1099511627776 bytes (2 ^ 40 bytes) un terabyte, y un fabricante de disco duro llamará a 1000000000000 bytes un terabyte.

Estas dos formas diferentes de hablar sobre los tamaños con frecuencia generan mucha confusión.

Hay un prefijo ISO muy compatible para tamaños binarios . Las interfaces de usuario diseñadas con el nuevo prefijo en mente mostrarán TiB, GiB (o más generalmente XiB) cuando muestren tamaños con un sistema de prefijos de base 2.

En segundo lugar, df -h informa cuánto espacio está disponible para su uso. Todos los sistemas de archivos tienen que escribir información de mantenimiento para realizar un seguimiento de las cosas por usted. Esta información ocupa parte del espacio en su disco. En general, no mucho, pero algunos. Eso también explica parte de la aparente pérdida que estás viendo.

Después de que haya editado su publicación para dejar en claro que ninguna de mis respuestas responde realmente a su pregunta, intentaré responder su pregunta ...

Los diferentes sistemas de archivos utilizan diferentes cantidades de espacio para la información de limpieza e informan el uso del espacio de diferentes maneras.

Por ejemplo, ext2 divide el disco en grupos de cilindros. Luego, asigna previamente espacio en cada grupo de cilindros para inodos y mapas de espacio libre. ext3 hace lo mismo ya que es básicamente un diario ext2 +. Y ext4 también hace exactamente lo mismo, ya que es una modificación bastante sencilla (y casi compatible con versiones anteriores) de ext3. Y dado que esta sobrecarga de metadatos se fija en la creación del sistema de archivos o en el cambio de tamaño, no se informa como espacio 'usado'. Sospecho que esto también se debe a que los metadatos del grupo de cilindros están en lugares fijos en el disco, por lo que simplemente se implica que se usan y, por lo tanto, no se marcan ni se tienen en cuenta en los mapas de espacio libre.

Pero reiserfs no asigna previamente metadatos de ningún tipo. No tiene un límite de inodo fijo en la creación del sistema de archivos porque asigna todos sus inodos sobre la marcha como lo hace con los bloques de datos. A lo sumo, necesita algunas estructuras que describan el directorio raíz y un mapa de espacio libre de algún tipo. Por lo tanto, utiliza mucho menos espacio cuando no tiene nada.

Pero esto significa que reiserfs ocupará más espacio a medida que agrega archivos porque asignará metadatos (como inodos), así como el espacio de datos real para el archivo.

No sé exactamente cómo jfs y btrfs rastrean el uso del espacio de metadatos. Pero sospecho que lo rastrean más como lo hace reiserfs. vfat en particular no tiene ningún concepto de inodo en absoluto. Su mapa de espacio libre (cuyo tamaño se fija en la creación del sistema de archivos (la infame tabla FAT)) almacena gran parte de los datos que almacenaría un inodo, y la entrada del directorio (que se asigna dinámicamente) almacena el resto.

De todo género
fuente
2
Hay un estándar ISO para eso: en.wikipedia.org/wiki/Binary_prefix
Bobby
@Bobby - Sí, y comenzó a aparecer en pantallas. Agregaré eso a mi respuesta. ¡Gracias!
Omnifarioso
8

Además de los problemas que menciona Omnifarious, con ext2 / 3/4 se reserva una cierta cantidad de espacio para root: este espacio reservado no se muestra en la salida de df.

Por ejemplo, crear un pequeño sistema de archivos (~ 100mb) con opciones predeterminadas, usando ext2 en lugar de 3 o 4 para ignorar el espacio que de otro modo ocuparía el diario:

swann:/tmp# dd if=/dev/zero of=./loop.fs bs=10240 count=10240
swann:/tmp# mkfs.ext2 loop.fs
swann:/tmp# mkdir loop
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     92480   2% /tmp/loop

Ajustar la opción de bloques reservados ( tune2fsla -mopción establece los bloques reservados como un porcentaje, y la -ropción establece los bloques reservados como un número directo de bloques):

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 25 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     72000   3% /tmp/loop

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 0 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     97600   2% /tmp/loop

Como puede ver en el ejemplo anterior, incluso cuando inició sesión como root dfno muestra el espacio reservado en el recuento "Disponible". El espacio reservado tampoco se muestra en el recuento "Usado", ya sea que haya iniciado sesión como root o como un usuario menos privilegiado. Esto a veces puede causar confusión cuando un sistema de archivos está casi lleno si no espera estos dos hechos.

También tenga en cuenta que tune2fs, a pesar de su nombre, es relevante para los sistemas de archivos ext3 y ext4, así como para los sistemas ext2.

David Spillett
fuente
Gracias por la respuesta. No, no se trata de bloques reservados. Pregunta actualizada
Ineu
0

Acerca de la diferencia entre los sistemas de archivos, los diferentes sistemas de archivos organizan los bloques de manera diferente y necesitan más o menos datos para identificar y realizar un seguimiento de los bloques. El tamaño del bloque también hace la diferencia, ya que si tiene más o menos bloques para el mismo espacio, tiene más o menos espacio "perdido". Además, los sistemas de archivos agrupan bloques para evitar la fragmentación de archivos y cada grupo de bloques tiene un identificador de algún tamaño, por lo que más o menos grupos de bloques utilizarán un espacio físico diferente en el disco. Entonces, la diferencia está en cómo el sistema de archivos organiza el espacio físico.

Aquí hay una descripción de ext2 y probablemente pueda encontrar algo similar para reiserfs, pero nunca lo he usado, así que no tengo ninguno.

Laurent
fuente
2
Reiserfs y btrfs son inusuales porque casi toda la información de contabilidad se asigna dinámicamente. Solo las copias de superbloque y los mapas de bits de espacio libre se asignan en la configuración del sistema de archivos. Por supuesto, esto significa que la cantidad real de espacio disponible para los datos es menos determinista para estos sistemas de archivos.
Omnifarioso
@Omnifarious +1 - Entonces, si entiendo bien en reiserfs y btrfs, el espacio disponible informado es más grande al principio, pero se utilizará tanto con datos como con información de contabilidad en lugar de solo datos, ¿verdad?
Laurent
@ laurent-rpnet: sí, eso es correcto. En el caso de btrfs es aún más interesante. btrfs puede implementar RAID sobre una base de archivo individual, por lo que su informe del espacio libre disponible es aún más difícil de precisar, ya que no puede simplemente asumir que habrá una cierta cantidad de espacio adicional utilizado por bloque utilizado para los datos. Además, permite copias basadas en COW muy baratas, por lo que escribir un bloque en el medio de un archivo existente puede asignar espacio.
Omnifarious
¿Y qué hay de XFS, JFS y VFAT? Es difícil creer que fs tan primitivos como FAT32 sea más dinámico que ext4.
Ineu
FAT32 también tiene bloques reservados para la organización. ¿Cuál es el significado de dinámica aquí? Si la asignación es dynamyc, FAT32 no tiene asignación dinámica, como ext y tampoco muestra todos los bloques en el disco disponibles para datos. También tiene algunas limitaciones. El sistema de archivos ext4 no tiene ningún sistema de permisos, mientras que ext4 tiene permisos POSIX y ACL y el tamaño máximo de archivo es de 4GB en FAT32 y 2TB en ext3 (no estoy seguro acerca de ext4 pero debería ser al menos igual).
Laurent