2010-01-20 17 views
16

La convenzione del linguaggio C conta gli indici di matrice da 0. Perché i numeri di inode iniziano da 1 e non da 0?Perché i numeri di inode iniziano da 1 e non da 0?

Se l'inode 0 è riservato è per un uso speciale, qual è il significato di inode 0?

+0

Avete un riferimento per eseguire il backup l'affermazione che un numero di inode non può essere 0 in qualsiasi file system?Non sono riuscito a trovarne. –

+0

Quindi la tua citazione risponde esattamente alla tua domanda, vero? –

+1

Sì, ma non sono in produzione, e sto cercando risposte solo per scopi accademici;) –

risposta

22

Di solito, l'inode 0 è riservato perché un valore di ritorno di 0 di solito segnala un errore. Il metodo multiplo nel kernel Linux, specialmente nel livello VFS condiviso da tutti i file system, restituisce un ino_t, ad es. find_inode_number.

Ci sono più numeri di inode riservati. Ad esempio in 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 */ 

e ext3 un'ampia

#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 */ 

e ext4 ha:

#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 */ 

Altre fileystems usa l'ino 1 come radice numero inode. In generale, un file system è libero di scegliere i suoi numeri di inode e i suoi valori ino riservati (ad eccezione di 0).

+0

File di intestazione: fs/ext4/ext4.h –

+0

Vedere anche la macro 'EXT2_FIRST_INO()' - non è in realtà una costante. – MSalters

23

0 viene utilizzato come sentinel value per indicare l'inode nullo o inesistente. in modo simile al modo in cui i puntatori possono essere NULL in C. senza sentinella, è necessario un ulteriore bit per verificare se un inode in una struttura è stato impostato o meno.

maggiori informazioni qui:

Tutti gli indirizzi dei blocchi e inode partono da 1. Il primo blocco del disco è blocco 1. 0 è usato per indicare l'assenza blocco. (File sparse possono avere questi al loro interno)

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

per esempio, nei vecchi filesystem in cui le directory sono stati rappresentati come un array fisso di voci di file, eliminazione di un file si tradurrebbe nella creazione di inode che della voce val a 0. quando si attraversa la directory, qualsiasi voce con un inode di 0 verrebbe ignorata.

+0

Sembra che l'inode 1 sia anche riservato con inode 0 per alcuni scopi speciali. –

+1

Sembra specifico per ext2fs. La tua domanda riguarda i filesystem in generale. –

+1

@Alok: una famiglia di unix fs condivide il concetto di inode. nessuno riconosce 0 per convenzione. – jspcal

0

Quando ho scritto un filesystem anni fa, ho usato l'inode 0 per lo pseudo file .badblocks.

Su alcuni filesystem .badblocks è effettivamente presente nella directory root come un normale file di proprietà di root e mode 0. root può aprirlo ma leggere o scriverlo non è definito.

C'è una tradizione antica che gli inode iniziano da 1, # 1 è .badblocks e # 2 è la directory principale. Anche se .badblocks non è particolarmente ben garantito, molti filesystem fanno di tutto per rendere root # 2.

Problemi correlati