the inode at a glance
/ inode -> EYE-node /
Imagine a library where the catalog card for a book records everything about it - who owns it, when it was last touched, how big it is, where its pages physically sit on the shelves - everything except the book's title. The title lives on a separate label stuck to the shelf. The inode is that catalog card: the file's real record, holding all its details but not its name.
Concretely, an inode (index node) is the on-disk structure the filesystem keeps for each file. It stores the file's metadata: its type (regular file, directory, symlink, device), its size in bytes, its permission bits and owner/group, timestamps (last modified, last accessed, last status change), a link count (how many directory entries point at it), and pointers to the actual data blocks on disk where the file's bytes live. Each inode has a number, unique within its filesystem. The crucial twist: the inode does NOT contain the filename. Names live in directories, which map a name to an inode number. So a directory entry is just (name, inode number), and the inode is the rest of the truth about the file.
Why it matters: this name-versus-inode split is the key to understanding the whole filesystem. It is why one file can have several names (multiple directory entries pointing at the same inode - hard links), why a file is not truly deleted until its link count drops to zero, and why moving a file within a filesystem just rewrites a directory entry without touching the inode or the data. When you run a command and see fields like size, owner, and modification time, those come straight from the inode.
$ stat -c '%i %s %U %y' notes.txt # inode number, size, owner, modify time 1318042 482 ana 2026-06-23 10:14:02 # the name 'notes.txt' is NOT in here
Everything stat shows lives in the inode; the filename lives in the directory that points at it.
The inode holds metadata and pointers to data, but NOT the filename - that is the single fact that explains hard links, fast renames, and the link count. Deleting a name (unlink) only frees the file when no name and no open descriptor still references its inode.