2. 方法
2.1 查看单个 sector 大小?512
2.2 查看单个 block 大小?4096
2.3 查看单个 inode 大小?128
2.4 查看文件 inode 信息 (stat)?
2.5 查看文件 inode 信息 (ls -i)?
2.6 查看磁盘 inode 信息 (df -i)?
2.7 通过inode号反查文件名字 (find ./ -inum 524903)?
2.8 创建soft_link/hard_link(link -s source soft_link/ln sorurce hard_link)?
3. 概念
3.0 hard disk
3.1 sector
3.2 block
3.3 inode
3.3.1 文件系统(Filesystem)将物理硬盘分成俩部分,user data/meta data
3.3.2 inode结构(stat filename)
3.3.3 inode 特性
3.3.4 操作系统访问文件过程
3.4 soft_link/hard_link
3.4.1 soft_link/hard_link对比
3.4.2 soft link
3.4.3 hard link
4. 实践
4.1 通过inode号删除文件
4.2 find查找软链接 (find dir/ -iname filename)?
4.3 find 查找硬链接(find dir/ -samefile /../..filename)?
4.4 find 通过inode号反查文件名(find dir/ -inum 524904)?
4.5 列出指定目录下所有软链接?
5. 总结
1. 概要 &参考
- 简单介绍 inode, soft_link, hard_link
- 在Linux中除了进程,一切皆是文件
- IBM Inode1
- IBM Inode2
- 阮一峰
- 鸟哥私房菜
- other
2. 方法
2.1 查看单个 sector 大小?512
fdisk -l |grep sectors
2.2 查看单个 block 大小?4096
dumpe2fs /dev/sdboot |grep 'Block size'
2.3 查看单个 inode 大小?128
dumpe2fs /dev/sdboot |grep 'Inode size'
2.4 查看文件 inode 信息 (stat)?
stat filename
2.5 查看文件 inode 信息 (ls -i)?
ls -il filename
2.6 查看磁盘 inode 信息 (df -i)?
df -i
2.7 通过inode号反查文件名字 (find ./ -inum 524903)?
find ./ -inum 524903
2.8 创建soft_link/hard_link(link -s source soft_link/ln sorurce hard_link)?
link -s source soft_link
ln -s source soft_link
link source hard_link
ln sorurce hard_link
3. 概念
3.0 hard disk
- 硬盘在linux下的文件名:
/dev/sd[a-p][1-15]:为SCSI, SATA, U盘, Flash闪盘等接口的磁盘文件名;
/dev/hd[a-d][1-63]:为 IDE 接口的磁盘文件名;
3.1 sector
硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)
3.2 block
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block
3.3 inode
3.3.1 文件系统(Filesystem)将物理硬盘分成俩部分,user data/meta data
- 用户数据存放在block里,元信息存放在inode里,一般inode占磁盘空间的1%左右,根据我的计算,我的ubuntu16.04 32bit大概在1.5%
3.3.2 inode结构(stat filename)
inode 数据结构包含了文件所有的元信息,除了文件名和文件的具体数据
- inode 编号//
- 用来识别文件类型,以及用于 stat C 函数的模式信息//
- 文件的链接数目//
- 属主的 UID
- 属主的组 ID (GID)
- 文件的大小//
- 文件所使用的磁盘块的实际数目//
- 最近一次修改的时间
- 最近一次访问的时间
- 最近一次更改的时间
3.3.3 inode 特性
- inode 占用一定的磁盘空间,所以 inode 用完会导致系统提示硬盘空间不足,即使硬盘还有空间
- 移动文件不会导致改变 inode,因为 linux 系统文件的文件和inode是分开存储的
- 重命名文件不会导致改变 inode,因为 linux 系统文件的文件和inode是分开存储的
- 操作系统通过inode号来识别不同的文件,文件名可以说只是inode号的别名或者绰号
3.3.4 操作系统访问文件过程
图Directory
图访问过程
1.根据文件名,通过Directory里的对应关系,找到文件对应的Inode number
2.再根据Inode number读取到文件的Inode table
- 再根据Inode table中的Pointer读取到相应的Blocks。
- 进行修改读取等操作。
- 结束
3.4 soft_link/hard_link
3.4.1 soft_link/hard_link对比
- linux为了解决文件共享使用,引入俩种链接:硬连接(hard link)软连接(soft link)
- (inode角度)一个inode对应多个文件名字为硬链接
- (inode角度)文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接
- 硬链接和源文件为一个inode
- 软链接和源文件为不同的inode,软链接的inode指向的block为源文件名的路径指向
3.4.2 soft link
软链接就是一个普通文件(文件属性l打头),只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制;
- 软链接有自己的文件属性及权限等;
- 可对不存在的文件或目录创建软链接
- 软链接可交叉文件系统(不通的文件系统之间创建软链接?)
- 软链接可对文件或目录创建
- 创建软链接时,链接计数 i_nlink 不会增加
- 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)
- 软链接的用户数据也可以是另一个软链接的路径,其解析过程是递归的
软链接特性展示:
ls -al
# lrwxrwxrwx 1 hzn vboxsf 6 9月 9 14:12 soft -> source #文件属性第一个字符为(l)链接文件,硬连接为(-)普通文件
ln -s inexistence_file soft_link #对不存在的文件创建软连接
cat soft_link #dangling link死连接,读取改文件失败
ln -s test_dir soft_link_dir #对目录创建链接,可以cd
3.4.3 hard link
硬链接是有着相同 inode 号仅文件名不同的文件
- 文件有相同的 inode 及 data block
- 只能对已存在的文件进行创建
- 不能交叉文件系统进行硬链接的创建
- 不能对目录进行创建,只可对文件创建
- 删除一个硬链接文件并不影响其他有相同 inode 号的文件
- 创建硬链接不会多占用inode空间和数据空间,软链接则要同时占用,只是软链接的数据空间占用非常小
- 硬链接文件属性和源文件文件属性一致,因为他们是同一个inode号
硬链接特性展示
ln source hard_link
stat source/hard_link #创建一个hard_link, stat 查link会+1
4. 实践
4.1 通过inode号删除文件
由于各种原因在linux下总是会出现那么一些乱码文件,无法通过正常的rm删除,那么通过删除inode号指定文件删除它
- 通过 ls -l 或者 stat 获取文件的inode号
ls -l #524903 -rwxr-xr-x 1 hzn vboxsf 35 9月 9 15:38 hard_1
- 通过 rm & find 用inode删除文件
rm `find ./ -inum 524903`
4.2 find查找软链接 (find dir/ -iname filename)?
在指定目录下查找特定文件名(不能写绝对路径)的软链接(find dir/ -iname filename)?
find /home/hzn -lname source
# /home/hzn/tmp1/soft1
# /home/hzn/tmp/tt/soft1
# /home/hzn/tmp/tt/soft2
# /home/hzn/tmp/tt/soft3
# find dir/ -iname filename dir/只能是目录,filename只能是文件名,不能是绝对路径的文件
4.3 find 查找硬链接(find dir/ -samefile /../..filename)?
在指定目录下查找特定文件名(最好绝对名)的硬链接(find dir/ -samefile /../..filename)?
find /home -samefile /home/hzn/tmp/tt/source
# /home/hzn/tmp1/hard
# /home/hzn/tmp/tt/hard
# /home/hzn/tmp/tt/hard1
# find dir/ -samefile /../..filename dir/只能是目录,filename可以是文件名(本目录),最好是绝对路径
4.4 find 通过inode号反查文件名(find dir/ -inum 524904)?
在指定目录下查找相同inode的所有文件(find dir/ -inum 524904)?
find /home -inum 524904
# /home/hzn/tmp1/hard
# /home/hzn/tmp/tt/hard
# /home/hzn/tmp/tt/hard1
4.5 列出指定目录下所有软链接?
find方式
find /home -type l -ls
ls+grep方式
ls -al |grep '^l'
5. 总结
- 一个Inode对应一个文件,而一个文件根据其大小,会占用多块blocks。
- 更为准确的来说,一个文件只对应一个Inode。因为硬链接其实不是创建新文件,只是在Directory中写入了新的对应关系而已
- 当我们删除文件的时候,只是把Inode标记为可用,文件在block中的内容是没有被清除的,只有在有新的文件需要占用block的时候,才会被覆盖