2010-01-20 11 views
16

Die C-Sprachkonvention zählt Array-Indizes von 0. Warum beginnen Inode-Nummern von 1 und nicht 0?Warum beginnen Inode-Nummern von 1 und nicht 0?

Wenn Inode 0 reserviert ist für einige spezielle Verwendung, was ist dann die Bedeutung von Inode 0?

+0

Haben Sie eine Referenz haben den Anspruch zu untermauern, dass eine Inode-Nummer nicht 0 in jedem Dateisystem sein kann?Ich konnte keine finden. –

+0

Also Ihr Zitat genau beantwortet Ihre Frage, nicht wahr? –

+1

Ja, aber ich bin nicht in Produktion, und bin auf der Suche nach Antworten für rein akademische Zwecke nur;) –

Antwort

22

Normalerweise ist der Inode 0 reserviert, da ein Rückgabewert von 0 normalerweise einen Fehler signalisiert. Mehrere Methoden im Linux-Kernel - insbesondere in der VFS-Ebene, die von allen Dateisystemen gemeinsam genutzt wird - geben ein ino_t zurück, z. find_inode_number.

Es gibt mehr reservierte Inode-Nummern. Zum Beispiel 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 */ 

und ext3 hat:

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

und ext4 hat:

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

Andere fileystems verwenden ino 1 als Root-Inode-Nummer. Im Allgemeinen kann ein Dateisystem seine Inode-Nummern und seine reservierten Ino-Werte frei wählen (mit Ausnahme von 0).

+0

Header-Datei: fs/ext4/ext4.h –

+0

Siehe auch Makro 'EXT2_FIRST_INO()' - es ist eigentlich keine Konstante. – MSalters

23

0 wird als sentinel value verwendet, um null oder keine Inode anzuzeigen. Ähnlich wie Zeiger in C ohne Sentinel NULL sein können, benötigen Sie ein zusätzliches Bit, um zu testen, ob ein Inode in einer Struktur gesetzt wurde oder nicht.

weitere Informationen hier:

Alle Block und Inode-Adressen bei 1. Der erste Block auf der Platte starten Block 1 0 verwendet wird, keine Block anzuzeigen. (Sparse-Dateien können diese in ihnen haben)

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

zum Beispiel in alten Dateisystemen, wo Verzeichnisse als feste Anordnung von Dateieinträge dargestellt wurden, bei der Festlegung inode val betreffenden Eintrags würde das Löschen einer Datei auf 0. Beim Durchlaufen des Verzeichnisses würde jeder Eintrag mit einem Inode von 0 ignoriert werden.

+0

Es scheint inode 1 ist auch zusammen mit Inode 0 für einige spezielle Zwecke vorbehalten. –

+1

Das scheint ext2fs spezifisch zu sein. Ihre Frage bezieht sich auf Dateisysteme im Allgemeinen. –

+1

@Alok: eine Familie von Unix-FS teilen das Inode-Konzept. Keine erkennen 0 durch Konvention. – jspcal

0

Als ich vor langer Zeit ein Dateisystem schrieb, benutzte ich Inode 0 für die Pseudo-Datei .badblocks.

Auf einigen Dateisystemen .badblocks ist tatsächlich im Stammverzeichnis als eine normale Datei im Besitz von Stamm-und Modus 0. root kann es öffnen, aber Lesen oder Schreiben ist nicht definiert.

Es gibt einige alte Tradition, dass Inodes von 1 beginnen, # 1 ist .badblocks, und # 2 ist das Stammverzeichnis. Auch wenn .badblocks nicht besonders gut garantiert ist, gehen viele Dateisysteme aus dem Weg, um Root # 2 zu erstellen.