Introduction to Inode
File descriptors, file table and inode table in Linux. Image Source: Wikipedia
Inode is created during creation of file along with file name, inode is an integer value which is always be unique for different files in Linux filesystem. File name and corresponding inodes are stored as entry in directory.
When any program or user call the file for performing operation the Linux operating system lookup the inodes with corresponding to that file name in filesystem as for Linux Operating System files are only identified by inode number which are stored in inode table. These inode tables stores as systematically in filesystem mostly in beginning of it.
These inode tables are very important as it not only stores inodes number it store inodes itself as well. Loosing of inodes mean you can loose you files even it can make whole filesystem unrecoverable from damage thus avoiding such situation Linux store the lost inodes in lost+found directory of same filesystem (example in case of ext3/ext4 filesystem) where the damage files inode resides:
You might have seen whenever you run e2fsck command it first of all try to recover inodes when it get inodes information it start repairing files and filesystem further.
What information inode contains?
Inode contain below information:
- File type (executable, block special etc)
- Permissions (read, write etc)
- File Size
- File access, change and modification time
- File deletion time
- Number of links (soft/hard)
- Access Control List (ACLs)
Hard Link concept
A hard link is an entry in a directory that contains a pointer directly to the inode bearing the file’s metadata. When a new hard link to a file is created, both links share the same inode number because the link is only a pointer, not a copy of the file.
Example of hard link file inode, you can see in below screenshot both files test1.txt and test2.txt (hardlink file) have same inode number:
How to check inodes of files and mounted filesystem?
Below command can show you inode number of files in filsystem:
# ls -i <filename>
# stat <filename>
You can get mounted filesystem inodes usage from below command:
# df -i
also you can use below more extended df command for getting human readable format of inode usage.
# df -ih
Example in below screenshot I have captured mounted /boot mount point inode usage:
How to troubleshoot full inode issue?
Sometime you have deleted files but it is still holded by running process example a Linux server running Oracle DB process. Below is the solution to get rid of holded deleted files for freeing inodes.
Find out the process and file descriptor(fd) id of deleted files from below command:
# /usr/sbin/lsof | grep deleted
ora 25575 data 33u REG 65,65 4294983680 31014933 /oradata/DATAPRE/file.dbf (deleted)
Now use file command to check type of files holded by process
# file /proc/25575/fd/33
/proc/25575/fd/33: broken symbolic link to `/oradata/DATAPRE/file.dbf (deleted)'
Trunk the deleted file fd with echo command for releasing it from hold of process.
# echo > /proc/25575/fd/33
Deleting special character filename with help of inode number
Special character filenames are difficult to delete from normal remove command: rm .
Below is the solution for removing special character files with the help of their inode number:
- Identify the inode number of file.
- Now use below find command for removing file with identified inode number.