Linux文件系统与日志分析(1)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 1 inode和block1.1 inode和block概述文件数据包括元信息与实际数据。文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节。

1 inode和block


1.1 inode和block概述

  • 文件数据包括元信息与实际数据。
  • 文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节。
  • block(块)
  • 连续的八个扇区组成一个block
  • 是文件存取的最小单位
  • inode(索引节点)
  • 中文译名为“索引节点”,也叫 i 节点
  • 用于存储文件元信息
  • 一个文件必须占用一个inode ,至少占用一个block


1.2 inode和block关系

  1. 文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。
  2. 一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。
  3. 文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。 因此,一个文件必须占用一个inode,并且至少占用一个block。
  4. inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
  5. 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名。
  6. 所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找自己文件夹中的目录项,之后找到对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。

网络异常,图片无法展示
|


2 inode 详细介绍


2.1 inode 的内容

2.2.1 inode 表结构

每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data)。

元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。

每一个inode表记录对应保存了文件的元信息:

  • inode number 节点号
  • 文件类型
  • 文件的读、写、执行权限
  • 文件属主的UID
  • 文件属组的GID
  • 链接数(指向这个文件名路径名称个数)
  • 该文件的大小和不同的时间戳
  • 指向磁盘上文件的数据块指针
  • 有关文件的其他数据

2.2.2 Linux系统文件三个主要的时间属性

  • atime(access time):最近访问
    最后一次访问文件的时间
  • mtime(modify):最近更改
    最后一次更改文件内容的时间
  • ctime(change time):最近改动
    最后一次改变文件元信息的时间

注意:

  • 不打开文件的话,atime不变。例如使用echo追加内容,atime不会变,因为文件没有被打开访问。
  • 修改文件内容的话,mtime会变,ctime也会变。
  • 如果只修改文件的权限,ctime变,mtime不变。

2.2.3 目录文件的结构

目录是个特殊文件,目录文件的内容保存了此目录中文件的列表,以及inode number对应关系。

  • 目录文件的结构非常简单,就是一系列目录项(dirent)的列表。
  • 每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
  • 一个目录是目录下的文件名和文件inode号之间的映射。
  • 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
  • Linux系统内部不使用文件名,而使用inode号码来识别文件。
  • 对于用户,文件名只是Inode号码便于识别的别称。

网络异常,图片无法展示
|


小贴士:

目录文件本身的大小,是根据所含目录项统计的,不是目录内所有子文件的大小总和。


2.3 inode的号码

用户通过文件名打开文件时,系统内部的过程:

  1. 用户访问文件时,系统先去查找文件所属目录中的目录项,根据文件名找到对应的inode号码。
  2. 通过inode号码,获取inode信息。
  3. 根据inode信息,判断用户是否具备访问权限。
  • 如果有访问权限,则利用指针去指向实际数据所在的block,读出数据。
  • 如果没有访问权限,则返回Permission denied。根据inode信息,利用指针去指向实际数据所在的block,读出数据。

网络异常,图片无法展示
|


查看inode号码的方法:

  • ls -i 命令:查看文件名对应的inode号码
  • stat 命令:查看文件inode信息中的inode号码
[root@localhost data]# ls -i
 64 aa  64 bb  64 mail
 [root@localhost data]# stat /data/aa
   文件:"/data/aa"
   大小:37              块:0          IO 块:4096   目录
 设备:811h/2065d        Inode:64          硬链接:2
 权限:(0755/drwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
 最近访问:2022-03-08 08:48:00.762262741 +0800
 最近更改:2022-03-08 08:47:58.462261957 +0800
 最近改动:2022-03-08 08:47:58.462261957 +0800
 创建时间:-
复制代码


网络异常,图片无法展示
|


2.4 inode 与文件存储


2.4.1 硬盘分区后的结构

网络异常,图片无法展示
|


2.4.2 访问文件的简单流程

网络异常,图片无法展示
|


2.5 inode 的大小

  • inode也会消耗硬盘空间
  • 每个inode的大小一般是128字节或256字节
  • 格式化文件系统时确定inode的总数
  • 如果磁盘还有空间,但inode号被全部占用,也无法创建新文件。
  • inode号在同一个文件系统内唯一,在不同的文件系统中可以重复。
  • 使用 "df -i" 命令可以查看每个硬盘分区的inode总数和已经使用的数量
[root@localhost ~]# df -i
 文件系统                  Inode 已用(I) 可用(I) 已用(I)% 挂载点
 /dev/mapper/centos-root 5242880  147510 5095370       3% /
 devtmpfs                 229398     441  228957       1% /dev
 tmpfs                    233378       1  233377       1% /dev/shm
 tmpfs                    233378     655  232723       1% /run
 tmpfs                    233378      16  233362       1% /sys/fs/cgroup
 /dev/sda1                524288     330  523958       1% /boot
 /dev/sdb5               1048576       3 1048573       1% /data/bb
 /dev/mapper/vg01-lvmail 6815744       3 6815741       1% /data/mail
 /dev/sdb1               5242880       7 5242873       1% /data/aa
 tmpfs                    233378       9  233369       1% /run/user/42
 tmpfs                    233378       1  233377       1% /run/user/0
复制代码


网络异常,图片无法展示
|


2.6 inode的特殊作用

由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象:

1)当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件。

示例:

[root@localhost aaa]# ls -i        //查看文件的inode号
 8922118 -f1.txt  8922126 -f2.txt
 [root@localhost aaa]# find -inum 8922118 -delete   //通过inode号删除文件
 [root@localhost aaa]# find -inum 8922126 -exec rm -rf {} ;    //通过inode号删除文件
 [root@localhost aaa]# ls         //查看目录内容,文件已被删除
 [root@localhost aaa]# 
复制代码


网络异常,图片无法展示
|


注: 包含特殊字符的文件,也可以 "rm -rf ./-f1.txt" 或 "rm -- -f.txt" 进行删除。

2)在同一个文件系统中移动或重命名文件时,只改变文件名,不影响inode号码。

[root@localhost aaa]# ls -i ff.txt
 8922129 ff.txt
 [root@localhost aaa]# mv ff.txt ../dir01/kk.txt
 [root@localhost aaa]# ls -i ../dir01/kk.txt
 8922129 ../dir01/kk.txt
复制代码


网络异常,图片无法展示
|


3)打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名。

2.7 命令和inode号之间的关系


cp 命令:

  • 分配一个空闲的inode号,在inode表中生成新条目
  • 在目录中创建一个目录项,将名称与inode编号关联
  • 拷贝数据生成新的文件

rm 命令:

  • 硬链接数递减,从而释放的inode号可以被重用
  • 把数据块放在空闲列表中
  • 删除目录项
  • 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖

mv命令:

  • 如果mv命令的目标和源在同一设备,
    不影响inode表(除时间戳)或磁盘上的数据位置;
    系统会删除旧的目录对应关系,新建目录对应关系。


2.8 硬链接和软链接

对比项 硬链接 软链接(符号链接)
本质 本质是同一个文件 本质不是同一个文件
inode 和源文件相同 和源文件不同
链接数 创建新的硬链接,链接数会增加;删除硬链接,链接数减少 删除新建不会改变
目录 不支持给目录创建 支持
删除源文件 只是链接数减一,但链接文件的访问不受影响 无法访问链接文件
文件类型 和源文件相同 链接文件,和源文件无关
文件大小 和源文件相同 源文件的路径的长度
能否交叉文件系统 不支持 支持
对不存在的文件 不支持创建硬链接 支持创建软链接


创建链接文件:

ln 源文件 目标文件               //创建硬链接文件
 ln -s 源文件或目录 目标文件       //创建软连接文件
复制代码


注意:

创建软链接时,源文件必须使用绝对路径。


2.9 删除文件后空间不释放的处理方法

删除文件后,如果磁盘空间没有释放,是因为文件正在被其他人打开。 其他人退出使用该文件后空间会被释放。

可以使用 w 命令或 lsof 命令查看是否有人在使用该文件。

[root@localhost ~]# w
  22:23:08 up  1:14,  4 users,  load average: 0.17, 0.14, 0.08
 USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
 root     pts/0    192.168.72.1     21:17    4.00s  0.12s  0.03s vim 1.txt
 root     pts/1    192.168.72.1     21:17    1:05m  4.45s  4.43s top
 root     pts/2    192.168.72.1     22:22    4.00s  0.02s  0.00s w
 root     pts/3    192.168.72.1     22:22   11.00s  0.04s  0.01s top
复制代码


网络异常,图片无法展示
|


如果确定有人打开了该文件,可以使用三种方法释放空间:

1.echo " "  > f1.txt        //将被打开的文件变成空文件,依赖shell环境
 2.cat /dev/null > f1.txt    //导入空文件
 3.lsof | grep f1.txt        //查看被删除的文件和对应PID,之后杀死该进程
    kill -9 PID
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


注意:

删除文件前,一定要确认清除该文件是否为有效文件。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
8天前
|
存储 Linux 索引
Linux 下最主流的文件系统格式——ext
【9月更文挑战第8天】硬盘被划分为若干相同大小的块(Block),默认大小为4K,便于灵活管理文件数据。文件数据分散存放于这些块中,提高了数据添加、删除和插入的便利性。
|
20天前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
33 12
|
20天前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
30 6
|
17天前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
21天前
|
存储 监控 Linux
|
21天前
|
存储 监控 Linux
|
4天前
|
存储 缓存 Linux
Linux文件系统的功能规划
【9月更文挑战第12天】本文通过类比图书馆,形象地解释了文件系统的组织形式和管理方法。首先,文件系统需按块存储文件,并设有索引区方便查找。其次,热点文件应有缓存层提高效率,文件需分类存储以便管理。最后,Linux内核需记录文件使用情况,通过文件描述符区分不同文件,确保文件操作准确无误。
|
21天前
|
算法 Linux 索引
Linux0.11 根文件系统挂载(四)
Linux0.11 根文件系统挂载(四)
13 0
|
23天前
|
存储 Linux 网络安全
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
|
23天前
|
Java Linux C++
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑