Sé que lo primero a lo que accede el sistema operativo en el disco duro es al superbloque.
¿Pero entonces, qué?
Respuesta1
El sistema operativo depende del kernel, que a su vez utiliza controladores para varios sistemas de archivos para lectura/escritura. El manejo de archivos se abstrae a través de los controladores y las llamadas al sistema a través de interfaces, de modo que cuando dice open("file.txt")
que no necesita saber cómo está almacenado el archivo en el disco, etc. Existe una gran variedad de sistemas de archivos, cada uno con su propia manera. de manejar las cosas. Aquí hay un fragmento genérico del sistema ext.
Ejemplo por ext.
- Bloques: El disco se divide enBloquesdel espacio contiguo.
- Grupos de bloques: Los bloques se dividen en grupos.
- Inodo: un conjunto estructurado de información sobre una entrada, como un archivo, directorio, etc.
- Directorio: Una lista de inodos <–> nombres
CadaGrupo de bloquestiene una tabla de estructuras de inodos que pertenecen al grupo.
Diseño central:
Padding 1024 bytes
Super-Block 1 block *
Block Group Descriptor Table many blocks *
Reserved many blocks
Data Block Bitmap 1 block *
inode Bitmap 1 block *
inode Table many blocks *
Data Blocks many more blocks *
superbloquecontiene información como:
- Número total de inodos
- Número total de bloques
- Número de bloques en un grupo
- Número de inodos en un grupo
Además de almacenarse en el grupo de bloques 0, las copias redundantes se almacenan en otro lugar como copias de seguridad (en caso de corrupción).
Tabla de descriptores de grupo de bloquesestá directamente después delSúper bloque. Contiene, entre otras cosas:
- Número deGrupos de bloquesen la partición
- Descriptor para cadaGrupo de bloques
Donde cada Descriptor contiene información sobre dónde se encuentran las estructuras de datos para eseGrupo de bloquesse encuentra.
Grupo de bloquessostiene, entre otras cosas:
- Dirección de bloque donde comienza la tabla de inodos
- Número de directorios en el grupo
mapas de bitscontiene información sobre el uso. 0
para no utilizados y 1
para usados.
Inodo(nodo de índice)
Una estructura de inodo nonosostener:
- nombre
- datos de archivo
Un inodo contiene información como:
- Tipo, Permisos, Usuario, Fechas,… Punteros a DATOS
Los DATOS de un archivo se guardan en bloques. Un inodo contiene información sobre qué bloques ocupa el archivo. Esto se hace mediante punteros en el inodo. Hay más de unotipode punteros. Si llamamos a un puntero a datos PTR de la siguiente manera:
[PTR] Dirección a bloquear con DATOS
- 12 - Punteros directos:
- [PTR] Dirección a bloquear con DATOS
- 1 - Puntero indirecto simple:
- [S_PTR] Dirección a bloquear con lista de PTR
- 1 - Puntero doblemente indirecto:
- [D_PTR] Dirección a bloquear con lista de S_PTR
- 1 - Triple puntero indirecto:
- [T_PTR] Dirección a bloquear con lista de D_PTR
Números de punteros en uno.bloqueardepende detamaño de bloque.
Un directorio es un inodo. Sus datos contienen información sobre archivos. Cada entrada vincula un nombre y un inodo. Cada directorio también tiene .
, por sí mismo, ..
un enlace efectivo al directorio principal. Estos no se pueden eliminar.
El directorio raíz siempre tiene el inodo 2 en la ext. Hacer stat /
o cd /; stat .
ver. Son ..
enlaces a.
Cuando se crea un archivo, se agrega automáticamente a su directorio adecuado.
Los números de inodo son índices. Son índices ordenados en la tabla de inodos de una estructura de inodos. Como las estructuras de inodo tienen un tamaño fijo, se puede calcular dónde se encuentra una estructura de inodo.
Como la supermanzana tiene unainodos_por_grupose puede encontrar el grupo de bloques mediante:
block_group = (inode - 1) / inodes_per_group;
Y luego busque el índice:
inode_index = (inode - 1) % inodes_per_group;
Lea la estructura y los enlaces a los datos. Lee los datos.
depuración
Se puede utilizar debugfs
para extraer diversa información sobre el sistema de archivos.
Asegúrese de no utilizar la -w
bandera si le importan los datos.
Opcionalmente, cree una pequeña muestra para jugar.
truncate -s 2M test
mkfs.ext4 -F test
mkdir x
sudo mount test x
sudo chown me x
cd x
echo "Hello Disk" >hello.txt
mkdir a b c
echo "Hello Bee" >b/hib.txt
sudo unount x
debugfs test
Ingrese ?
para ver la lista de comandos.
debugfs: stats
(minimizado)
Inode count: 256
Block count: 2048
Reserved block count: 102
Free blocks: 953
Free inodes: 240
First block: 1
Block size: 1024
Fragment size: 1024
Group descriptor size: 64
Blocks per group: 8192
Inodes per group: 256
Inode blocks per group: 32
First inode: 11
Inode size: 128
Directories: 5
Group 0: block bitmap at 18, inode bitmap at 34, inode table at 50
953 free blocks, 240 free inodes, 5 used directories, 240 unused inodes
[Checksum 0x055a]
...
debugfs: imap hello.txt
Inode 12 is part of block group 0
located at block 51, offset 0x0180
Otros ejemplos: https://www.cs.montana.edu/courses/309/topics/4-disks/debugfs_example.html