Linux文件系统和日志分析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Linux文件系统和日志分析

Linux文件系统和日志分析

一、inode和block概述

文件数据包括元信息与实际数据。

文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节。

block(块)

  • 连续的八个扇区组成一个block
  • 是文件存取的最小单位

inode(索引节点)

  • 用于存储文件元信息

注意:一个文件必须占用一个inode ,至少占用一个block

二、inode详解

2.1 inode包含的元信息

  • 文件字节数
  • 文件拥有者User ID
  • 文件Group ID
  • 文件读,写,执行的权限
  • 文件的时间戳

……

2.2 查看inode的方法

ls -i 文件名
stat 文件名(详细)

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

atime:最后一次访问的时间,当使用这个文件的时候就会更新这个时间

mtime:最后一次修改的时间,当修改文件的内容数据的时候,就会更新这个时间

ctime:最后一次改变文件或目录属性的时间,当修改文件的权限或者属性的时候,就会更新这个时间

注意:当一个空文件,添加内容并保存退出后,inode号改变,因为数据占用的空间发生了变化,inode变,ctime也变

面试题

找到7天内所有大于10G的文件并删除,使用一条命令

find / -mtime 7 -size +10G -type f -exec rm -rf {} \;

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

  1. 找到文件名对应的inode号
  2. 通过inode号,获取inode信息
  3. 根据inode信息,找到文件数据所在的block,读出数据

三、模拟ext4文件系统inode号用尽的情况

3.1 创建分区,格式化,挂载

[root@localhost ~]# fdisk /dev/sdb        
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x5c900c16 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-62914559,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-62914559,默认为 62914559):+4M
分区 1 已设置为 Linux 类型,大小设为 4 MiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   60G  0 disk 
├─sda1            8:1    0  953M  0 part /boot
└─sda2            8:2    0 51.2G  0 part 
  ├─centos-root 253:0    0 46.6G  0 lvm  /
  └─centos-swap 253:1    0  4.7G  0 lvm  [SWAP]
sdb               8:16   0   30G  0 disk 
└─sdb1            8:17   0    4M  0 part          //分区成功
sdc               8:32   0   20G  0 disk 
sdd               8:48   0   20G  0 disk 
sde               8:64   0   20G  0 disk 
sdf               8:80   0   20G  0 disk 
sdg               8:96   0   20G  0 disk 
sr0              11:0    1 1024M  0 rom  
[root@localhost ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
1024 inodes, 4096 blocks
204 blocks (4.98%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=4194304
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (1024 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@localhost /]# mkdir test
[root@localhost /]# mount /dev/sdb1 /test/
[root@localhost /]# df -i
文件系统                   Inode 已用(I)  可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 24414208  145190 24269018       1% /
devtmpfs                  247834     445   247389       1% /dev
tmpfs                     251813       1   251812       1% /dev/shm
tmpfs                     251813     676   251137       1% /run
tmpfs                     251813      16   251797       1% /sys/fs/cgroup
/dev/sda1                 487936     328   487608       1% /boot
tmpfs                     251813       6   251807       1% /run/user/42
tmpfs                     251813      22   251791       1% /run/user/0
/dev/sdb1                   1024      11     1013       2% /test      //挂载成功,现有1013个可用inode号

3.2 模拟inode用尽

[root@localhost /]# for ((i=1;i<1015;i++));do touch /test/xc$i;done
touch: 无法创建"/test/xc1014": 设备上没有空间          //说明ext4文件系统inode用尽后不能再创建文件
[root@localhost /]# df -i
文件系统                   Inode 已用(I)  可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 24414208  145190 24269018       1% /
devtmpfs                  247834     445   247389       1% /dev
tmpfs                     251813       1   251812       1% /dev/shm
tmpfs                     251813     676   251137       1% /run
tmpfs                     251813      16   251797       1% /sys/fs/cgroup
/dev/sda1                 487936     328   487608       1% /boot
tmpfs                     251813       6   251807       1% /run/user/42
tmpfs                     251813      22   251791       1% /run/user/0
/dev/sdb1                   1024    1024        0     100% /test

四、xfs系统文件备份和恢复

CentOS 7 系统默认采用 xfs类型的文件,xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复

xfsdump 的备份级别有两种:0 表示完全备份;1-9 表示增量备份。xfsdump 的备份级别默认为 0

命令格式为:

xfsdump -f  备份存放位置  要备份的路径或设备文件
    -L:指定标签 
    -M:指定设备标签
    -s:备份单个文件,-s 后面不能直接跟路径

实验:

4.1 分区,格式化,挂载;在test2中添加

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x71350885 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n    
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-62914559,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-62914559,默认为 62914559):+5G         
分区 1 已设置为 Linux 类型,大小设为 5 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]# mkdir /test2
[root@localhost ~]# mount /dev/sdb1 /test2/
[root@localhost ~]# cd /test2/
[root@localhost test2]# echo 1 > aa
[root@localhost test2]# echo 2 > bb
[root@localhost test2]# echo 3 > cc
[root@localhost test2]# cat aa
1
[root@localhost test2]# cat bb
2
[root@localhost test2]# cat cc
3
[root@localhost test2]# ls -i
67 aa  68 bb  69 cc

4.2 模拟删除,恢复

[root@localhost test2]# xfsdump -f /opt/backup /dev/sdb1 [-L backup -M sdb1]
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control
 ============================= dump label dialog ==============================
please enter label for this dump session (timeout in 300 sec)
 -> 
session label entered: ""
 --------------------------------- end dialog ---------------------------------
xfsdump: WARNING: no session label specified
xfsdump: level 0 dump of localhost.localdomain:/test2
xfsdump: dump date: Thu May 18 02:23:28 2023
xfsdump: session id: dba4aa0a-5cca-44de-b55a-09c416c382ab
xfsdump: session label: ""
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 34048 bytes
xfsdump: /var/lib/xfsdump/inventory created
xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 24592 bytes
xfsdump: dump size (non-dir files) : 1632 bytes
xfsdump: dump complete: 1 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /opt/backup OK (success)
xfsdump: Dump Status: SUCCESS               //备份成功
[root@localhost test2]# ls
aa  bb  cc  
[root@localhost test2]# rm -rf *              //删除test2中的东西
[root@localhost test2]# ls
[root@localhost test2]# xfsrestore -f /opt/backup /test2/ //恢复
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.4 (dump format 3.0) - type ^C for status and control
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description: 
xfsrestore: hostname: localhost.localdomain
xfsrestore: mount point: /test2
xfsrestore: volume: /dev/sdb1
xfsrestore: session time: Thu May 18 02:23:28 2023
xfsrestore: level: 0
xfsrestore: session label: ""
xfsrestore: media label: "sdb1]"
xfsrestore: file system id: 408cb5f0-ca78-4260-9cb9-80113d509e0a
xfsrestore: session id: dba4aa0a-5cca-44de-b55a-09c416c382ab
xfsrestore: media id: 56bffe97-1946-4bda-8025-3421d92a7b0f
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 1 directories and 3 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /opt/backup OK (success)
xfsrestore: Restore Status: SUCCESS
[root@localhost test2]# ls
aa  bb  cc
[root@localhost test2]# cat aa
1
[root@localhost test2]# cat bb
2
[root@localhost test2]# cat cc
3

五、日志文件介绍与分析

5.1 日志功能

  • 用于记录系统、程序运行中发生的各种事件
  • 通过阅读日志,有助于诊断和解决系统故障

5.2 日志分类

内核及服务日志

  • 日志数据由系统服务rsyslog统一管理,日志格式基本相似
  • 配置文件/etc/rsyslog.conf

用户日志

  • 记录用户登录及退出系统的相关信息

程序日志

  • 由各种应用程序独立管理的日志文件,记录格式不统一

**日志保存位置:**默认位于:/var/log 目录下

5.3 主要日志文件介绍

image.png

5.4 日志级别

Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要)

image.png

这个优先级由开发者自行定义,也就是你想要那部分的信息内容,可以自行添加修改

5.5 分析工具

users 显示当前登录系统的所有用户的用户列表
w     显示目前登入系统的用户信息
last    列出截止目前登录过系统的用户信息
lastb 查询登录失败的用户记录

5.6 日志管理策略

  1. 及时做好备份和归档
  2. 延长日志的保存期限
  3. 控制日志访问权限:日志中可能会包含各类敏感信息,
  4. 集中管理日志
  • 将服务器的日志文件发到统一的日志文件服务器
  • 便于日志信息的统一收集、整理和分析
  • 杜绝日志信息的意外丢失、恶意篡改或删除

程序的日志一般保留1~2天

数据日志,数据库最少保留半年

用户信息日志永久保存

企业根据业务需要,自定义保留时间

六、ssh服务日志单独存放

[root@localhost /]# vim /etc/rsyslog.conf 
  • image.png
[root@localhost /]# vim /etc/ssh/sshd_config 

image.png

[root@localhost /]# setenforce 0
[root@localhost /]# systemctl stop firewalld.service 
[root@localhost /]# systemctl restart sshd
[root@localhost /]# systemctl restart rsyslog.service 

验证:

在另一台虚拟机上

[root@localhost ~]# ssh root@192.168.147.100
root@192.168.147.100's password: 
Last login: Thu May 18 02:17:09 2023 from 192.168.147.1

回到原来的虚拟机

[root@localhost /]# tail -f /var/log/ssh.log 
May 18 03:11:34 localhost sshd[59621]: Accepted password for root from 192.168.147.101 port 41258 ssh2
May 18 03:13:53 localhost sshd[59621]: Received disconnect from 192.168.147.101 port 41258:11: disconnected by user
May 18 03:13:53 localhost sshd[59621]: Disconnected from 192.168.147.101 port 41258
May 18 03:13:58 localhost sshd[59697]: Accepted password for root from 192.168.147.101 port 41260 ssh2

七、日志统一收集

发送方:192.168.147.101

接收方:192.168.147.100

7.1 关闭安全机制和防火墙

[root@localhost /]# setenforce 0
[root@localhost /]# systemctl stop firewalld.service 

7.2 发送方

[root@localhost ~]# vim /etc/rsyslog.conf 

image.png

image.png

*.info 表示所有等级为 info 及以上的日志都会被发送,其中 * 代表所有设施 (facility),如 auth、daemon、syslog、kern 等。


mail.none 表示邮件相关的日志不会被发送,其中 none 代表不包含指定的设施。


authpriv.none 表示安全和权限相关的日志不会被发送,其中 authpriv 代表包括 auth 和 priv 两个设施。


cron.none 表示计划任务相关的日志不会被发送,其中 cron 代表计划任务的设施。


@@192.168.147.101 表示将符合条件的日志通过TCP协议发送到远程主机 192.168.147.101 上的 rsyslog 服务。

其中,@@ 表示强制使用tcp协议,单个 @ 表示使用udp协议。

[root@localhost ~]# systemctl restart rsyslog.service 
[root@localhost ~]# netstat -natp | grep 514
tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      12927/rsyslogd      
tcp        0      0 192.168.147.101:52942   192.168.147.101:514     ESTABLISHED 12927/rsyslogd      
tcp      514      0 192.168.147.101:514     192.168.147.101:52942   ESTABLISHED 12927/rsyslogd      
tcp6       0      0 :::514                  :::*                    LISTEN      12927/rsyslogd      

7.3 接受方

[root@localhost /]# vim /etc/rsyslog.conf 

image.png

[root@localhost /]# systemctl restart rsyslog.service 
[root@localhost /]# netstat -natp | grep 514
tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      59961/rsyslogd      
tcp6       0      0 :::514                  :::*                    LISTEN      59961/rsyslogd      

八、日志管理工具 journalctl

是centos7上专有的日志管理工具,该工具专门针对messages

日志的配置文件是/etc/systemd/journald.conf

journalctl        查看所有日志
      -r      倒序查看所有日志
      -k      查看内核日志
      -b  [-0]  #默认就是0     查看本次系统的日志
          [-1]          查看上一次启动的日志,如上次系统崩溃,需要查看日志时
      -n  数字    显示尾部指定行数的日志
      -u  服务名   查看某个服务的日志
      _PID=         查看指定进程的日志 
      _UID= --since today     查看指定用户今天的日志
      _UID= --since yesterday   查看指定用户昨天的日志
      -xe       查看systemd journal中的所有错误信息,包括启动过程中的错误和系统运行期间的错误
           LISTEN      59961/rsyslogd      
# 八、日志管理工具 journalctl
是centos7上专有的日志管理工具,该工具专门针对messages
日志的配置文件是/etc/systemd/journald.conf
```bash
journalctl        查看所有日志
      -r      倒序查看所有日志
      -k      查看内核日志
      -b  [-0]  #默认就是0     查看本次系统的日志
          [-1]          查看上一次启动的日志,如上次系统崩溃,需要查看日志时
      -n  数字    显示尾部指定行数的日志
      -u  服务名   查看某个服务的日志
      _PID=         查看指定进程的日志 
      _UID= --since today     查看指定用户今天的日志
      _UID= --since yesterday   查看指定用户昨天的日志
      -xe       查看systemd journal中的所有错误信息,包括启动过程中的错误和系统运行期间的错误


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1天前
|
存储 Linux 文件存储
Linux文件系统
Linux文件系统 一切皆文件 在Linux中,“一切皆文件”的概念意味着系统中的所有资源,包括硬件设备、目录及进程等,均被视为文件。这种设计简化了操作和管理,具体包括: 普通文件:存储数据的常规文件。 目录文件:包含其他文件和子目录的文件。 进程文件:在/proc目录下代表系统中运行的进程。 设备文件:位于/dev目录,代表硬件设备。 网络字节流套接字文件:用于网络通信的数据流。 链接文件:指向另一个文件的符号链接或硬链接。 管道文件:用于进程间通信的文件。
24 7
|
23天前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
37 3
|
1月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控总结
Linux系统命令与网络,磁盘和日志监控总结
52 0
|
1月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控三
Linux系统命令与网络,磁盘和日志监控三
36 0
|
2月前
|
存储 Linux 索引
Linux 下最主流的文件系统格式——ext
【9月更文挑战第8天】硬盘被划分为若干相同大小的块(Block),默认大小为4K,便于灵活管理文件数据。文件数据分散存放于这些块中,提高了数据添加、删除和插入的便利性。
|
3月前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
44 12
|
3月前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
51 6
|
3月前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
2月前
|
存储 缓存 Linux
Linux文件系统的功能规划
【9月更文挑战第12天】本文通过类比图书馆,形象地解释了文件系统的组织形式和管理方法。首先,文件系统需按块存储文件,并设有索引区方便查找。其次,热点文件应有缓存层提高效率,文件需分类存储以便管理。最后,Linux内核需记录文件使用情况,通过文件描述符区分不同文件,确保文件操作准确无误。
|
3天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
77 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板