Linux内核中根据inode获取文件属性
在Linux内核中,inode
是描述文件系统对象(如文件、目录等)元数据的核心数据结构。通过 inode
可以获取以下关键属性:
1. 关键属性字段(定义在 include/linux/fs.h
) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 struct inode { umode_t i_mode; kuid_t i_uid; kgid_t i_gid; loff_t i_size; struct timespec64 i_atime ; struct timespec64 i_mtime ; struct timespec64 i_ctime ; unsigned long i_ino; dev_t i_rdev; unsigned int i_blkbits; blkcnt_t i_blocks; };
2. 获取属性的常用方法 (1) 文件类型与权限 (i_mode
) 1 2 3 4 5 6 7 8 9 10 11 12 13 umode_t mode = inode->i_mode;if (S_ISREG(mode)) printk("常规文件" );if (S_ISDIR(mode)) printk("目录" );if (S_ISCHR(mode)) printk("字符设备" );if (S_ISBLK(mode)) printk("块设备" );if (S_ISFIFO(mode)) printk("FIFO/管道" );if (S_ISSOCK(mode)) printk("套接字" );if (S_ISLNK(mode)) printk("符号链接" );unsigned short perm = mode & 0777 ;
(2) 所有权信息 1 2 3 4 5 6 kuid_t uid = inode->i_uid; kgid_t gid = inode->i_gid; char *user = from_kuid(&init_user_ns, uid);char *group = from_kgid(&init_user_ns, gid);
(3) 时间戳 1 2 3 4 5 6 7 struct timespec64 atime = inode->i_atime; struct timespec64 mtime = inode->i_mtime; struct timespec64 ctime = inode->i_ctime; time_t atime_sec = atime.tv_sec;long atime_nsec = atime.tv_nsec;
(4) 大小与磁盘使用 1 2 3 loff_t size = inode->i_size; blkcnt_t blocks = inode->i_blocks; unsigned int blksize = 1 << inode->i_blkbits;
(5) 特殊文件信息 1 2 3 4 5 if (S_ISCHR(mode) || S_ISBLK(mode)) { dev_t dev = inode->i_rdev; unsigned major = MAJOR(dev); unsigned minor = MINOR(dev); }
3. 示例:内核函数中的使用 以下函数展示了如何通过 inode
获取属性并打印:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <linux/fs.h> #include <linux/printk.h> void print_inode_info (struct inode *inode) { if (S_ISREG(inode->i_mode)) printk("Type: Regular File\n" ); else if (S_ISDIR(inode->i_mode)) printk("Type: Directory\n" ); printk("Permissions: %o\n" , inode->i_mode & 0777 ); printk("Size: %lld bytes\n" , inode->i_size); printk("Blocks: %lu (512B sectors)\n" , inode->i_blocks); printk("Last Access: %lld seconds\n" , inode->i_atime.tv_sec); }
4. 注意事项
上下文要求 :操作 inode
通常需在内核上下文中(如系统调用处理、VFS 函数)。
锁机制 :访问 inode
前通常需加锁(如 inode_lock()
或 i_rwsem
读写信号量)。
文件系统差异 :实际数据可能由底层文件系统通过 inode->i_op->getattr
方法动态填充。
内存inode vs 磁盘inode :内核中的 inode
是内存缓存,可能与磁盘上的inode不同步(需同步机制)。
通过操作 inode
结构体,内核可以高效管理文件元数据,为文件操作提供基础支持。