ext4 – ¿Por qué mi partición de exactamente 100 MiB con un tamaño de bloque de 1 KiB no tiene los bloques / espacio disponibles correspondientes?

Pregunta:

Tengo un entorno virtualizado de muy alta densidad con contenedores, por lo que estoy tratando de hacer que cada contenedor sea realmente pequeño. "Realmente pequeño" significa 87 MB en la base Ubuntu 14.04 (Trusty Tahr) sin romper la compatibilidad del administrador de paquetes.

Así que utilizo LVM como almacenamiento de respaldo para mis contenedores y recientemente encontré números muy extraños. Aquí están.

Creemos un volumen lógico de 100 MiB (sí, potencia de 2).

sudo lvcreate -L100M -n test1 /dev/purgatory

Me gustaría comprobar el tamaño, así que sudo lvs --units k

test1             purgatory  -wi-a----  102400.00k

Dulce, esto es realmente 100 MiB.

Ahora hagamos un sistema de archivos ext4 . Y, por supuesto, recordamos el parámetro -m 0 , que evita el desperdicio de espacio.

sudo mkfs.ext4 -m 0 /dev/purgatory/test1

mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

Dulce y limpio. Tenga en cuenta el tamaño del bloque: nuestro volumen lógico es pequeño, por lo que mkfs.ext4 decidió hacer un bloque del tamaño de 1 KiB, no los 4 KiB habituales.

Ahora lo montaremos.

sudo mount /dev/purgatory/test1 /mnt/test1

Y llamemos df sin parámetros (nos gustaría ver bloques de 1 KiB)

/dev/mapper/purgatory-test1     95054    1550     91456   2% /mnt/test1

Espera, oh shi ~

Tenemos 95054 bloques en total. Pero el dispositivo en sí tiene 102400 bloques de 1 KiB. Tenemos solo el 92,8% de nuestro almacenamiento. ¿Dónde están mis bloques, hombre?

Veámoslo en un dispositivo de bloque real. A tiene un disco virtual de 16 GiB, 16777216 bloques de 1K, pero solo 15396784 bloques están en la salida df. 91,7%, ¿qué es?

Ahora sigue la investigación (spoiler: sin resultados)

  1. El sistema de archivos no pudo comenzar al comienzo del dispositivo. Esto es extraño, pero posible. Afortunadamente, ext4 tiene bytes mágicos, verifiquemos su presencia.

    sudo hexdump -C / dev / purgatory / test1 | grep "53 ef"

Esto muestra el superbloque:

00000430  a9 10 e7 54 01 00 ff ff  53 ef 01 00 01 00 00 00  |...T....S.......|

Hex 430 = diciembre de 1072, por lo que en algún lugar después del primer kilobyte. Parece razonable, ext4 omite los primeros 1024 bytes para rarezas como VBR, etc.

  1. ¡Esto es diario!

No, no es. El diario toma espacio de Disponible si es salida df.

  1. ¡Oh, tenemos dump2fs y podríamos comprobar los tamaños allí!

… muchos greps …

sudo dumpe2fs /dev/purgatory/test1 | grep "Free blocks"

Ay.

Free blocks:              93504
  Free blocks: 3510-8192
  Free blocks: 8451-16384
  Free blocks: 16385-24576
  Free blocks: 24835-32768
  Free blocks: 32769-40960
  Free blocks: 41219-49152
  Free blocks: 53249-57344
  Free blocks: 57603-65536
  Free blocks: 65537-73728
  Free blocks: 73987-81920
  Free blocks: 81921-90112
  Free blocks: 90113-98304
  Free blocks: 98305-102399

Y tenemos otro número. 93504 bloques libres.

La pregunta es: ¿qué está pasando?

  • Dispositivo de bloque: 102400k (lvs dice)
  • Tamaño del sistema de archivos: 95054k (df dice)
  • Bloques libres: 93504k (dice dumpe2fs)
  • Tamaño disponible: 91456k (df dice)

Respuesta:

Pruebe esto: mkfs.ext4 -N 104 -m0 -O ^has_journal,^resize_inode /dev/purgatory/test1

Creo que esto te permite entender "lo que está pasando".

-N 104 (establezca el número de iNodes que debe tener el sistema de archivos)

  • cada iNode "cuesta" espacio utilizable (128 bytes)

-m 0 (sin bloques reservados)
-O ^has_journal,^resize_inode (desactiva las funciones has_journal y resize_inode

  • resize_inode "cuesta" espacio libre (la mayoría de los 1550 1K-Blocks / 2% que ve en su df – 12K se utilizan para la carpeta "perdidos + encontrados")
  • has_journal "cuesta" espacio utilizable (4096 1K-Blocks en tu caso)

Obtenemos 102348 de 102400 , otros 52 bloques inutilizables (si hemos eliminado la carpeta "perdidos + encontrados"). Por lo tanto, nos sumergimos en dumpe2fs :

Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
  Checksum 0x5ee2, unused inodes 65533
  Primary superblock at 1, Group descriptors at 2-2
  Block bitmap at 3 (+2), Inode bitmap at 19 (+18)
  Inode table at 35-35 (+34)
  8150 free blocks, 0 free inodes, 1 directories, 65533 unused inodes
  Free blocks: 17-18, 32-34, 48-8192
  Free inodes: 
Group 1: (Blocks 8193-16384) [BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x56cf, unused inodes 5
  Backup superblock at 8193, Group descriptors at 8194-8194
  Block bitmap at 4 (+4294959107), Inode bitmap at 20 (+4294959123)
  Inode table at 36-36 (+4294959139)
  8190 free blocks, 6 free inodes, 0 directories, 5 unused inodes
  Free blocks: 8193-16384
  Free inodes: 11-16
Group 2: (Blocks 16385-24576) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x51eb, unused inodes 8
  Block bitmap at 5 (+4294950916), Inode bitmap at 21 (+4294950932)
  Inode table at 37-37 (+4294950948)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 16385-24576
  Free inodes: 17-24
Group 3: (Blocks 24577-32768) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x3de1, unused inodes 8
  Backup superblock at 24577, Group descriptors at 24578-24578
  Block bitmap at 6 (+4294942725), Inode bitmap at 22 (+4294942741)
  Inode table at 38-38 (+4294942757)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 24577-32768
  Free inodes: 25-32
Group 4: (Blocks 32769-40960) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x79b9, unused inodes 8
  Block bitmap at 7 (+4294934534), Inode bitmap at 23 (+4294934550)
  Inode table at 39-39 (+4294934566)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 32769-40960
  Free inodes: 33-40
Group 5: (Blocks 40961-49152) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x0059, unused inodes 8
  Backup superblock at 40961, Group descriptors at 40962-40962
  Block bitmap at 8 (+4294926343), Inode bitmap at 24 (+4294926359)
  Inode table at 40-40 (+4294926375)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 40961-49152
  Free inodes: 41-48
Group 6: (Blocks 49153-57344) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x3000, unused inodes 8
  Block bitmap at 9 (+4294918152), Inode bitmap at 25 (+4294918168)
  Inode table at 41-41 (+4294918184)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 49153-57344
  Free inodes: 49-56
Group 7: (Blocks 57345-65536) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x5c0a, unused inodes 8
  Backup superblock at 57345, Group descriptors at 57346-57346
  Block bitmap at 10 (+4294909961), Inode bitmap at 26 (+4294909977)
  Inode table at 42-42 (+4294909993)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 57345-65536
  Free inodes: 57-64
Group 8: (Blocks 65537-73728) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0xf050, unused inodes 8
  Block bitmap at 11 (+4294901770), Inode bitmap at 27 (+4294901786)
  Inode table at 43-43 (+4294901802)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 65537-73728
  Free inodes: 65-72
Group 9: (Blocks 73729-81920) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x50fd, unused inodes 8
  Backup superblock at 73729, Group descriptors at 73730-73730
  Block bitmap at 12 (+4294893579), Inode bitmap at 28 (+4294893595)
  Inode table at 44-44 (+4294893611)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 73729-81920
  Free inodes: 73-80
Group 10: (Blocks 81921-90112) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x60a4, unused inodes 8
  Block bitmap at 13 (+4294885388), Inode bitmap at 29 (+4294885404)
  Inode table at 45-45 (+4294885420)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 81921-90112
  Free inodes: 81-88
Group 11: (Blocks 90113-98304) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x28de, unused inodes 8
  Block bitmap at 14 (+4294877197), Inode bitmap at 30 (+4294877213)
  Inode table at 46-46 (+4294877229)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 90113-98304
  Free inodes: 89-96
Group 12: (Blocks 98305-102399) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x9223, unused inodes 8
  Block bitmap at 15 (+4294869006), Inode bitmap at 31 (+4294869022)
  Inode table at 47-47 (+4294869038)
  4095 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 98305-102399
  Free inodes: 97-104

y contamos los bloques usados ​​(para el superbloque de respaldo, descriptores de grupo, mapa de bits de bloque, mapa de bits de Inode y tabla de Inode) o grep y contamos:

LANG=C dumpe2fs /dev/mapper/vg_vms-test1 | grep ' at ' | grep -v ',' | wc -l

que nos da el recuento de líneas que tienen un solo bloque (en nuestro ejemplo) y

LANG=C dumpe2fs /dev/mapper/vg_vms-test1 | grep ' at ' | grep ',' | wc -l

lo que nos da el recuento de líneas que tienen dos bloques (en nuestro ejemplo).

Entonces tenemos (en nuestro ejemplo) 13 líneas con un bloque cada una y 19 líneas con dos bloques cada una.

13+19*2

lo que nos da 51 bloques que están en uso por ext4. Finalmente solo queda una cuadra. El bloque 0, que son los 1024 bytes omitidos al principio para cosas como el sector de arranque.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım