Linux 文件系统学习摘要
这是公司内学习 Linux Kernel 的第13章, 关于文件系统的部份.
inode
In Linux and other Unix-like operating systems, an inode (index node) is a data structure that stores information about a file or directory except its name and its actual data. Each file or directory has an inode that contains important metadata about the file or directory.
The information stored in an inode includes:
- File size
- Device ID
- User ID (owner)
- Group ID
- File permissions
- File creation, modification, and access times
- Number of links (how many file names point to this inode)
- Pointers to the disk blocks that store the file's data
The inode number is a unique identifier for the inode within the filesystem. You can view the inode information of a file or directory using the ls -i or stat command in the terminal.
dentry
In the Linux kernel, a dentry (directory entry) is a data structure that represents a specific inode in the cache. It's a key component of the Virtual File System (VFS) layer, which provides a common interface for all file systems.
The dentry object contains information about the inode, the file name, and pointers to the parent and child dentries, forming a dentry tree that represents the directory hierarchy. This structure allows the kernel to quickly look up files and directories, improving the efficiency of file system operations.
Dentries are stored in a dentry cache (dcache), which keeps track of recently accessed dentries to speed up subsequent file and directory lookups. When a file is accessed, the kernel first checks the dcache. If the dentry is found, the kernel can access the file directly without having to traverse the entire file system, which can significantly improve performance.
stat 命令
stat 命令显示文件, 路径, 文件系统信息. 具体看下面例子.
# 显示 /tmp 目录所在的文件系统信息
$ stat -f /tmp/
File: "/tmp/"
ID: 7ae4c0a51947813 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 122221576 Free: 73122076 Available: 66895184
Inodes: Total: 31121408 Free: 28709496
例子
当我们新建一个空文件和一个空目录的时候, 可以看到如下:
supra@suprabox:~/Downloads$ touch x
supra@suprabox:~/Downloads$ stat x
File: x
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 10748017 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ supra) Gid: ( 1000/ supra)
Access: 2023-12-01 21:05:46.177415933 -0800
Modify: 2023-12-01 21:05:46.177415933 -0800
Change: 2023-12-01 21:05:46.177415933 -0800
Birth: 2023-12-01 21:05:46.177415933 -0800
supra@suprabox:~/Downloads$ mkdir y
supra@suprabox:~/Downloads$ stat y
File: y
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd01h/64769d Inode: 11153180 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ supra) Gid: ( 1000/ supra)
Access: 2023-12-01 21:06:28.061716185 -0800
Modify: 2023-12-01 21:06:28.061716185 -0800
Change: 2023-12-01 21:06:28.061716185 -0800
Birth: 2023-12-01 21:06:28.061716185 -0800
下面是对x这个空文件输出的详细解释:
- File: x:文件名是x。
- Size: 0:文件大小是0字节,因为你刚创建了这个文件但还没有写入任何内容。
- Blocks: 0:文件占用的块数是0,这与文件大小为0是一致的。
- IO Block: 4096:文件系统的I/O块大小是4096字节。
- regular empty file:这是一个常规的空文件。
- Device: fd01h/64769d:文件所在的设备的设备号。
- Inode: 10748017:文件的inode号是10748017。
- Links: 1:硬链接数是1,表示只有一个文件名指向这个inode。
- Access: (0664/-rw-rw-r--):文件的权限是0664,也就是用户(owner)和组(group)有读写权限,其他人(other)只有读权限。
- Uid: ( 1000/ supra):文件的所有者的用户ID是1000,用户名是supra。
- Gid: ( 1000/ supra):文件的所有者的组ID是1000,组名是supra。
- Access: 2023-12-01 21:05:46.177415933 -0800:文件最后一次被访问的时间。
- Modify: 2023-12-01 21:05:46.177415933 -0800:文件最后一次被修改的时间。
- Change: 2023-12-01 21:05:46.177415933 -0800:文件状态最后一次被改变的时间。
- Birth: 2023-12-01 21:05:46.177415933 -0800:文件的创建时间。