Linux文件系统和日志管理

文件系统的组成

Linux 文件系统会为每个文件分配两个数据结构:索引节点(index node)目录项(directory entry),它们主要用来记录文件的元信息和目录层次结构。

  • 索引节点,也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间。

  • 目录项,也就是 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存。 由于索引节点唯一标识一个文件,而目录项记录着文件的名,所以目录项和索引节点的关系是多对一,也就是说,一个文件可以有多个别字。比如,硬链接的实现就是多个目录项中的索引节点指向同一个文件。

注意,目录也是文件,也是用索引节点唯一标识,和普通文件不同的是,普通文件在磁盘里面保存的是文件数据,而目录文件在磁盘里面保存子目录或文件。

目录项和目录是一个东西吗? 虽然名字很相近,但是它们不是一个东西,目录是个文件,持久化存储在磁盘,而目录项是内核一个数据结构,缓存在内存。 如果查询目录频繁从磁盘读,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读到相同的目录时,只需从内存读就可以,大大提高了文件系统的效率。 注意,目录项这个数据结构不只是表示目录,也是可以表示文件的。 那文件数据是如何存储在磁盘的呢? 磁盘读写的最小单位是扇区,扇区的大小只有 512B 大小,很明显,如果每次读写都以这么小为单位,那这读写的效率会非常低。 所以,文件系统把多个扇区组成了一个逻辑块,每次读写的最小单位就是逻辑块(数据块),Linux 中的逻辑块大小为 4KB,也就是一次性读写 8 个扇区,这将大大提高了磁盘的读写的效率。

img

  • 扇区: 文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。

  • block(块):一般连续八个扇区组成一个"块"(block),一个块是4K大小,是文件存取的最小单位。

  • inode(索引节点): 元信息(包含除了文件名以外的文件属性,比如文件的创建者、创建日期、文件大小、文件权限等)

inode 和block之间的关系

inode 编号

每一个 inode 都有一个编号,系统根据 inode 编号可以快速的计算出 inode 信息在磁盘 inodes 存储区的偏移,然后从中获取 inode 信息,再根据 inode信息中记录的 Block 块位置,从Block存储区读出文件内容

inode 编号在一个文件系统中是唯一的,多个文件系统之间可能会出现相同的编号,前面的磁盘存储结构示意图中 /dev/vda1/dev/vda2 在各自的文件系统中 inode 编号是唯一的

创建一个新文件的时候,文件名和对应的 inode 编号会存储在目录文件的Block块中(关于目录文件后面会讲到)

文件的 inode 信息中记录了文件 Block 块的位置,Block块中存储着文件的内容,可以使用 ls -i 命令查看文件的 inode 编号

从例子中可以看出,每个 inode 节点大小为 256 字节。通过 df -i 命令可以查看每个文件系统中 inode 的使用情况

 df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
devtmpfs        482393    339  482054    1% /dev
tmpfs           484984      1  484983    1% /dev/shm
tmpfs           484984    433  484551    1% /run
tmpfs           484984     16  484968    1% /sys/fs/cgroup
/dev/vda1      2621440 157202 2464238    6% /
tmpfs           484984      1  484983    1% /run/user/0

字段解释:

Filesystem:文件系统

Inodes: 文件系统中 inodes 总数量

IUsed: inodes 已经使用了的数量

IFree: inodes 可供使用的数量

IUse%: 已经使用了的 inodes 百分比

Mounted on: 文件系统的挂载点

文件系统中的 inodes 数量在安装系统或格式化磁盘分区的时候已经分配好了,也就是说 inodes 数量是有限的,所以 inodes 数量有可能耗尽的,耗尽之后就会出现磁盘还有空间,但是无法创建新文件的情况

目录文件

Linux 中所有的一切都是文件,包括进程、线程、目录等。每个文件都有对应的 inode 编号

当打开目录时,实际上是打开一个目录文件,目录的存储结构是目录子项列表,每个目录子项由 文件名、文件名对应的 inode 编号 组成 

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

执行文件命令对inode号的影响具体取决于所执行的命令类型。

对于cp(复制)命令,当复制一个文件时,系统会分配一个新的inode号码,并且在inode表中创建相应的条目,然后才会将文件内容复制到新文件中。这意味着新文件会有一个新的inode号码。

对于mv(移动/重命名)命令,如果源文件和目标文件在同一文件系统内,mv操作实际上不会改变inode号码,它只是创建了一个新的目录项,并更新了文件名到inode号码的映射,同时删除了旧的目录项。如果源文件和目标文件不在同一文件系统内,那么mv操作相当于先复制后删除,这会导致新的inode号码的分配。

至于rm(删除)命令,它会减少文件的链接数,如果链接数变为0,则会释放该inode号码,使得这个inode号码可以被重新使用。同时,数据块会被放到可用空间列表中,并删除目录中的目录项。

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

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

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

  • vim编辑器 :

    vim编辑器改变文件内容,是先创建一个新的swp文件,编辑的内容也是在swp文件中进行,当用户保存时,swp文件就会替换当前文件,因此inode号会发生改变

  • 利用echo命令往文件中加内容 :

    对原文件进行操作,只改变原文件的内容,其他没有任何影响,inode号不发生改变

linux系统下各种日志文件的介绍

日志文件的作用

日志文件用于记录linux系统的各种运行信息的文件,相当于linux主机的日记,不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件、程序错误等。日志文件对于诊断和解决问题很有帮助,因为linux运行的程序通常把系统的消息和错误写入对应的日志文件,这样系统可以有据可查, 此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹。

日志文件的分类

1.内核及系统日志: 内核及系统日志:这种日志数据由系统服务rsyslog同-管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置。系统中大部分的程序会把自己的日志文件交由rsyslog管理,因而这些应用程序使用的日志记录格式都很相似。

2.用户日志: 用于记录Linux系统用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。

3.程序旧志 :有些应用程序会选择独立管理一份日志文件 ,而不是交给rsyslog服务管理,用于记录本程序运行过程中的各种事件信息。于这些程序只负责管理自己的日志文件,因此不同程序所使用的日志记录格式也会存在较大的差异。

/var/log/inessages记录Linux内核消息及各种应用程序的公共日志信息,包括启动、I/O错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息
/var/log/cron记录crondi计划任务产生的事件信息
/var/log/dmesg记录Linux系统在引导过程中的各种事件信息
/var/log/maillog记录进入或发出系统的电子邮件活动
/var/log/lastlog记录每个用户最近的登录事件
/var/log/secure记录用户认证相关的安全事件信息
/var/log/wtmp记录每个用户登录、注销及系统启动和停机事件
/var/log/btmp记录失败的、错误的登录尝试及验证事件

日志消息等级

在Linux内核中,根据日志消息的重要程度不同,将其分为不同的优先级别(数字等级越小,优先级越高,消息越重要)

等级等级信息效果
0EMERG (紧急)会导致主机系统不可用的情况
1ALERT (警告)必须马上采取措施解决的问题
2CRIT (严重)比较严重的情况
3ERR(错误)运行出现错误
4WARNING (提醒)可能影响系统功能 ,需要提醒用户的重要事件
5NOTICE (注意)不会影响正常功能,但是需要注意的事件
6INFO(信息)一般信息
7DEBUG (调试)程序或系统调试信息等

内核及大多数系统消息都被记录到公共日志文件/var/loq/messaqes中,而其他一些程序消息被记 录到各自独立的日志文件中 对于rsyslog服务统管理的大部分日志文件,使用的日志记录格式基本上都是相同的。以公共日志/var/loq/messaqes文件的记录格式为例,其中每一行表示一条日志消息,每一条消息均包括以下

四个字段:
时间标签:消息发出的日期和时间
主机名:生成消息的计算机的名称
子系统名称:发出消息的应用程序的名称
消息:消息的具体内容

日志主要配置文件

内核及系统日志由系统服务 rsyslog 统一管理,主配置文件为/etc/rsyslog.conf

服务名称
  • auth (LOG_AUTH) :安全和认证相关消息,不推荐使用authpriv替代;

  • authpriv (LOG_AUTHPRIV) :安全和认证相关消息,私有;

  • cron (LOG_CRON) :系统定时任务cront与at产生的相关日志;

  • daemon (LOG_DAEMON) :各个守护进程产生的日志;

  • ftp (LOG_FTP) :ftp守护进程产生的日志;

  • kern (LOG_KERN) :内核产生的日志;

  • local0-local7 (LOG_LOCAL0-7) :为本地使用预留的服务;

  • lpr (LOG_LPR) :打印产生的日志;

  • mail (LOG_MAIL) :邮件收发日志;

  • news (LOG_NEWS) :与新闻服务器相关的日志;

  • syslog (LOG_SYSLOG) :有syslog服务产生的日志;

  • user (LOG_USER) :用户等级类别的日志;

  • uucp (LOG_UUCP) :uucp子系统的日志信息; …

连接符号
  • " . " :只要比后面的等级高的(包含该等级)日志都记录下来;

  • " .= " :只记录所需等级的日志,其他等级不记录;

  • " .! " :除了该等级的日志外其他等级全部记录;

“*”代表所有日志等级,比如:“authpriv.*”代表authpriv认证信息服务产生的日志,所有的日志等级
都记录
“.”代表只要比后面的等级高的(包含该等级)日志都记录下来。比如:“cron.info”代表cron服务产生的
日志,只要日 志等级大于等于info级别,就记录
“.=”代表只记录所需等级的日志,其他等级的都不记录。比如:“*.=emerg”代表人和日志服务产生的日志,只要等级是 emerg等级就记录。这种用法及少见,了解就好
“.!”代表不等于,也就是除了该等级的日志外,其他等级的 日志都记录。

日志轮替


日志轮替的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超过保存的范围之后,就会进行删除,若配置文件中有 dateext 参数,则日志文件名称不会重叠,此参数不需要日志文件改名,只需要保存指定的日志个数,删除多余的日志文件即可;

若没有 dateext ,那么日志文件就需要进行改名了,第一次进行日志轮替时,当前的 secure 日志会自动改名为 secure.1 ,然后新建 secure 日志用来保存新的日志,当第二次进行轮替时, secure.1 会自动改名为 secure.2 ,当前的 secure 日志会自动改名为 secure.1 然后也会新建 secure 日志,用来保存新日志,以此类推;

logrotate配置文件的主要参数
  • daily :日志的轮替周期是每天;

  • weekly :日志的轮替周期是每周;

  • monthly :日志的轮替周期是每月;

  • rotate number :保留日志文件的个数,0代表无备份;

  • compress :日志轮替时旧日志文件是否进行压缩;

  • create mode owner group :创建新日志文件时是否指定日志的权限、所属者、所属组;

  • mail address :当日志轮替时,输出内容通过邮件外发到指定地址;

  • missingok :如果日志不存在,则忽略该日志的告警信息;

  • notifempty :如果日志文件为空,则不进行日志轮替;

  • minsize number :日志轮替最小值,达到该值才会进行轮替;

  • size number :设置轮替为指定大小,超过此大小则进行轮替,取消时间轮替;

  • dateext :以日期作为日志轮替的文件后缀;

  • sharedscripts :在此关键字之后的脚本只执行一次;

  • prerotate/endscript :在日志轮替之前执行脚本命令,endscript表示脚本结束;

  • posttrotate/endscript :在日志轮替之后执行脚本命令,endscript表示脚本结束;

logger的使用

logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以 从命令行直接向系统日志文件写入一行信息。

  • -i 在每行都记录进程ID

  • -t 日志中的每一行都加一个error标签

  • -p 指定自定义的日志设备,和配置文件的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rustdesk客户端编译后固定密码不稳定时好时坏

环境: rustdesk1.19 问题描述: Rustdesk客户端编译后固定密码不稳定时好时坏 解决方案: 出现固定密码不稳定的问题可能有多种原因,下面是一些可能的解决方法: 密码强度:确保所设置的固定密码足够强大…

智能写作利器ChatGPT:提升论文写作效率

ChatGPT无限次数:点击直达 智能写作利器ChatGPT:提升论文写作效率 在当今信息爆炸的时代,快速高效地撰写论文对于科研工作者来说至关重要。智能写作工具ChatGPT的出现为我们提供了强大的支持,它不仅能够提升论文写作的效率,还能够…

Doris删除数据工具

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 对于Doris的 Unique 模型,在删除数据的时候只能根据key删除,如果使用其他条件就会报错 整体架构流程 先获得表的key,然后在通过输入的条件获得key的所有值,最后通过key的…

王道c语言-二叉树前序、中序、后序、层次遍历

main.cpp #include "function.h"//abdhiejcfg 前序遍历深度优先遍历 abdhiejcfg void PreOrder(BiTree p) {if (p ! NULL) {printf("%c ", p->c);//等价于putchar(p->c);等价于visit函数伪代码PreOrder(p->lchild);PreOrder(p->rchild);} }//…

【数据结构】顺序表的实现——静态分配

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

【微服务篇】深入理解微服务可观测性原理(Log,Metric,Trace)

可观测性 微服务的可观测性是指通过收集、分析和监控微服务架构中各个组件的数据来理解其行为和性能的能力。这对于确保系统的健康、响应性和安全至关重要。可观测性主要从日志(Log)、指标(Metric)和追踪(Trace&#…

指针数组的有趣程序【C语言】

文章目录 指针数组的有趣程序指针数组是什么?指针数组的魅力指针数组的应用示例:命令行计算器有趣的颜色打印 结语 指针数组的有趣程序 在C语言的世界里,指针是一种强大的工具,它不仅能够指向变量,还能指向数组&#…

【Java程序设计】【C00344】基于Springboot的船舶维保管理系统(有论文)

基于Springboot的船舶维保管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 🍅文末点击卡片获取源码🍅 开发环境 运行环境:推荐jdk1.8; 开发工具:eclipse以及i…

OpenCV图像二值化

1.二值图像 灰度图像 0 - 255二值图像 0(黑) / 255(白) 2.二值分割 五种阈值分割方法(阈值T): 大于T为255,小于T为0 大于T为0,小于T为255 小于T为原值 else T 小于…

直面位运算

在这篇文章之前,笔者只是简单了解过位运算相关概念,但是每次刷LeetCode碰到位运算相关题目,都会敬而远之。一方面是觉得看起来晦涩难懂,另一方面觉得日常开发用处不大。 近期本着学习的目的,静下心来研究了一下&#x…

自己如何利用简单的代码,生成一个小游戏

原文:dlshuhua.com/post/79125.html 要生成一个小游戏,我们可以使用许多不同的编程语言和框架。这里,我将给出一个使用Python和其内置库tkinter创建简单猜数字游戏的例子。这个游戏的工作原理是:程序随机生成一个1到100之间的数字…

单链表的插入和删除

一、插入操作 按位序插入(带头结点): ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 typedef struct LNode{ElemType data;struct LNode *next; }LNode,*LinkList;//在第i 个位置插插入元素e (带头结点) bool Li…

国内IP切换软件:解锁网络世界的新钥匙

在数字化快速发展的今天,互联网已成为我们生活中不可或缺的一部分。然而,伴随着网络使用的深入,许多用户逐渐意识到,不同的IP地址可能会带来截然不同的网络体验。为了应对这一问题,国内IP切换软件应运而生,…

Rust引用借用 vs 原始指针

let v: i32 10; let v1 &v; let a: *const i32 &v; println!("a{:p}", a); let b a as *mut i32; //无法从&v直接转换成*mut i32,需要从*const i32过度 println!("b{:p}", b); unsafe {*b1; } println!("v{} v1{}"…

c++部分题

const关键字与宏定义的区别是什么? const关键字和宏定义在功能上有相似之处,但在实现和使用上有很大的区别。 作用域和类型安全性: const关键字定义的常量具有作用域和类型安全性。它们的作用域仅限于声明它们的块,并且在编译时会…

iOS客户端自动化UI自动化airtest+appium从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图

Android客户端自动化UI自动化airtest从0到1搭建macos脚本设计demo演示全网最全最详细保姆级有步骤有图-CSDN博客 避坑系列-必读: 不要安装iOS-Tagent ,安装appium -这2个性质其实是差不多的都是为了安装wda。注意安装appium最新版本,安装完…

结构体,联合体,枚举( 1 )

目录 前言 1.结构体 1.1结构体的声明 1.2结构体变量的创建和初始化 1.3结构体成员的访问字符 1.4结构体的内存大小 1.4.1对齐规则 1.5结构体传参 前言 在编程的世界里,数据结构的选择对于程序的效率和可读性有着至关重要的影响。不同的数据结构适用于不同的…

19. 变量

文章目录 一、变量二、变量的定义格式 一、变量 变量:程序中临时存储数据的容器,在程序执行过程中,其值有可能发生改变的量(数据)。但是这个容器中只能存一个值。 应用场景:在我们登录页面的时候&#xf…

2024最新华为OD机试试题库全 -【符号运算】- C卷

1. 🌈题目详情 1.1 ⚠️题目 给定一个表达式,求其分数计算结果。 表达式的限制如下: 所有的输入数字皆为正整数(包括0)仅支持四则运算(*/)和括号结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)除数可能为0,如果遇到这种情况,直接输出"ERR…

C++多重继承与虚继承

多重继承的原理 多重继承(multiple inheritance)是指从多个直接基类中产生派生类的能力。 多重继承的派生类继承了所有父类的属性。 在面向对象的编程中,多重继承意味着一个类可以从多个父类继承属性和方法。 就像你有一杯混合果汁,它是由多种水果榨取…