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 主要日志文件介绍
5.4 日志级别
Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要)
这个优先级由开发者自行定义,也就是你想要那部分的信息内容,可以自行添加修改
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中的所有错误信息,包括启动过程中的错误和系统运行期间的错误