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 用户通过文件名打开文件时,系统的内部过程
- 找到文件名对应的inode号
- 通过inode号,获取inode信息
- 根据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 主要日志文件介绍
日志 | 位置 |
---|---|
内核及公共消息日志 | /var/log/messages |
计划任务日志 | /var/log/cron |
系统引导日志 | /var/log/dmesg |
邮件系统日志 | /var/log/maillog |
用户登录日志 | /var/log/lastlog |
/var/log/secure | |
/var/log/wtmp | |
/var/tun/ulmp |
5.4 日志级别
Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要)
级别 | 说明 |
---|---|
0 | EMERG(紧急):会导致主机系统不可用的情况。如系统崩溃 |
1 | ALERT(警告):必须马上采取措施解决的问题。如数据库被破坏 |
2 | CRIT(严重):比较严重的情况。如硬盘错误,可能会阻碍程序的部分功能 |
3 | ERR(错误):运行出现错误。不是非常紧急,尽快修复的 |
4 | WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件,不是错误;如磁盘用了85%等 |
5 | NOTICE(注意):不会影响正常功能,但是需要注意的事件。无需处理 |
6 | INFO(信息):一般信息。正常的系统信息 |
7 | DEBUG(调试):程序或系统调试信息等。包含详细开发的信息,调试程序时使用 |
none:没有优先级,不记录任何日志消息。 |
这个优先级由开发者自行定义,也就是你想要那部分的信息内容,可以自行添加修改
5.5 分析工具
users 显示当前登录系统的所有用户的用户列表
w 显示目前登入系统的用户信息
last 列出截止目前登录过系统的用户信息
lastb 查询登录失败的用户记录
5.6 日志管理策略
- 及时做好备份和归档
- 延长日志的保存期限
- 控制日志访问权限:日志中可能会包含各类敏感信息,
- 集中管理日志
- 将服务器的日志文件发到统一的日志文件服务器
- 便于日志信息的统一收集、整理和分析
- 杜绝日志信息的意外丢失、恶意篡改或删除
程序的日志一般保留1~2天
数据日志,数据库最少保留半年
用户信息日志永久保存
企业根据业务需要,自定义保留时间
六、ssh服务日志单独存放
[root@localhost /]# vim /etc/rsyslog.conf
[root@localhost /]# vim /etc/ssh/sshd_config
[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
*.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
[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中的所有错误信息,包括启动过程中的错误和系统运行期间的错误