常用命令
[root@localhost ~]# stat log-consumer.tgz
文件:"log-consumer.tgz"
大小:8167640 块:15960 IO 块:4096 普通文件
设备:fd02h/64770d Inode:203135374 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2019-11-28 21:09:59.788123948 +0800
最近更改:2019-11-28 21:09:47.708063560 +0800
最近改动:2019-11-28 21:09:47.708063560 +0800
创建时间:-
[root@localhost ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/vda2 51200000 92450 51107550 1% /
devtmpfs 482424 345 482079 1% /dev
tmpfs 485132 1 485131 1% /dev/shm
tmpfs 485132 439 484693 1% /run
tmpfs 485132 16 485116 1% /sys/fs/cgroup
/dev/vda5 52990976 3 52990973 1% /data
/dev/vda1 153600 327 153273 1% /boot
tmpfs 485132 1 485131 1% /run/user/0
[root@localhost ~]# ls -i log-consumer.tgz
203135374 log-consumer.tgz
[root@localhost ~]#
硬链接
ln 源文件 目标文件
这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。
inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。
1、文件描述符和inode号码是不同的两个东西。
2、对于每个进程,系统会建立一个进程控制块(PCB)来保存相关的信息,而这个PCB在内核中的表现其实就是一个称为task_struct的结构体,这个结构体的成员用来保存与此进程有关的相关信息,其中有个成员是struct file_struct *files,它是用来找到此进程所有打开的文件列表的,files变量指向的是struct file_struct类型的结构体,这个结构体中有一个成员是一个指针数组struct file *fd_array[],这个数组中的每个元素会指向一个struct file的结构体,这个结构体是用来描述一个打开的文件的,有很多的成员,其中有个成员是指向struct file_operation的指针变量,而struct file_operation结构体中包括了很多的函数指针,也就是open,write,realease,read等等对文件进行操作的函数,具体这些函数的实现就是驱动开发需要做的事情。如下图所示。