c linux filesystems inode superblock

¿Por qué los números de inodo comienzan desde 1 y no 0?



linux filesystems (4)

La convención del lenguaje C cuenta con índices de matriz de 0. ¿Por qué los números de inodo comienzan con 1 y no con 0?

Si el inodo 0 está reservado para un uso especial, ¿cuál es el significado del inodo 0?


0 se utiliza como un valor de centinela para indicar nulo o sin inodo. de manera similar a como los punteros pueden ser NULOS en C. sin un centinela, necesitaría un bit adicional para probar si un inodo en una estructura estaba configurado o no.

Más información aquí:

Todas las direcciones de bloque e inodo comienzan en 1. El primer bloque en el disco es el bloque 1. 0 se utiliza para indicar que no hay bloque. (Los archivos dispersos pueden tener estos dentro de ellos)

http://uranus.chrysocome.net/explore2fs/es2fs.htm

por ejemplo, en sistemas de archivos antiguos donde los directorios se representaban como una matriz fija de entradas de archivos, eliminar un archivo daría como resultado que el inodo val de la entrada se estableciera en 0. Al atravesar el directorio, cualquier entrada con un inodo de 0 sería ignorada.


Cuando escribí un sistema de archivos hace mucho tiempo, usé el inodo 0 para el .badblocks .

En algunos sistemas de archivos .badblocks está realmente presente en el directorio raíz como un archivo normal propiedad de root y mode 0. root puede abrirlo pero leerlo o escribirlo no está definido.

Existe una antigua tradición de que los inodos comienzan desde 1, el # 1 es .badblocks y el # 2 es el directorio raíz. A pesar de que .badblocks no está particularmente bien garantizado, muchos sistemas de archivos hacen todo lo posible para hacer la raíz # 2.


Generalmente, el inodo 0 está reservado porque un valor de retorno de 0 generalmente indica un error. El método múltiple en el kernel de Linux, especialmente en la capa VFS compartida por todos los sistemas de archivos, devuelve un ino_t, por ejemplo, find_inode_number .

Hay números de inodo más reservados. Por ejemplo en ext2 :

#define EXT2_BAD_INO 1 /* Bad blocks inode */ #define EXT2_ROOT_INO 2 /* Root inode */ #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */

y ext3 tiene:

#define EXT3_BAD_INO 1 /* Bad blocks inode */ #define EXT3_ROOT_INO 2 /* Root inode */ #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ #define EXT3_JOURNAL_INO 8 /* Journal inode */

y ext4 tiene:

#define EXT4_BAD_INO 1 /* Bad blocks inode */ #define EXT4_ROOT_INO 2 /* Root inode */ #define EXT4_USR_QUOTA_INO 3 /* User quota inode */ #define EXT4_GRP_QUOTA_INO 4 /* Group quota inode */ #define EXT4_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT4_UNDEL_DIR_INO 6 /* Undelete directory inode */ #define EXT4_RESIZE_INO 7 /* Reserved group descriptors inode */ #define EXT4_JOURNAL_INO 8 /* Journal inode */

Otros sistemas de archivos utilizan el ino 1 como número de inodo raíz. En general, un sistema de archivos es libre de elegir sus números de inodo y sus valores de ino reservados (con la excepción de 0).