1,文件数据包括元信息与实际数据
2,文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节
3,block (块)
连续的八个扇区组成一个 block
是文件存取的最小单位
4,inode (索引节点)
中文译名为“索引节点”,也叫i节点
用于存储文件元信息
5,注意:一个文件必须占用一个inode,但至少占用一个block
文件的字节数
文件拥有者的UserID
文件的Group ID
文件的读、写、执行权限
文件的时间戳
用stat命令可以查看某个文件的inode信息
示例: stat aa.txt
最后一次改变文件或目录 (属性)的时间
最后一次访问文件或目录的时间
最后一次修改文件或目录 (内容) 的时间
最好用mtime 假如你看了一眼日志,日志的atime 就会变化 所以根据atime去找具体时间段的日志容易混淆,但是日志不会人为更改内容,mtime时间准确
1,目录文件的结构
目录也是一种文件
目录文件的结构
2,每个inode都有一个号码,操作系统用inode号码来识别不同的文件
3,Linux系统内部不使用文件名,而使用inode号码来识
别文件
4,对于用户,文件名只是inode号码便于识别的别称
1,系统找到这个文件名对应的inode号码
2,通过inode号码,获取inode信息,
3,根据inode信息,找到文件数据所在的block,读出数据
ls-i命令:查看文件名对应的inode号码
ls? -i? aa.txt
stat命令:查看文件inode? 信息中的inode号码
stat? ?aa.txt
inode 号在同一块设备(磁盘,逻辑卷等)上是唯一的,不同设备有可能有一样
inode号有限,他的多少和磁盘大小有关
问:我磁盘空间还剩余很多但是无法继续建立文件?
答:因为inode 号用完了,
? ? ? ?解决方法:
? ? ? ?如果是lvm 扩容
? ? ? ? 如果是普通分区,删除没有用的空文件
1,当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
2,移动或重命名文件时,只改变文件名,不影响inode号码
3,打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名
[root@localhost opt]#lsof |grep delete
..............................................
80 /boot/bigfile (deleted)
[root@localhost opt]#echo " " > /boot/bigfile
lsof?打开系统中已经被打开的文件
根据文件夹的文件名和inode 号的关系,找到对应的inode 表(属主 属组)再根据inode表中的指针找到磁盘上的真实数据
在编译安装 extundelete 之前需要先安装两个依赖包 e2fsprogs-libs 和 e2fsprogs-devel,
这两个包在系统安装光盘的/Package 目录下就有,使用 rpm 或 yum 命令将其安装。
e2fsprogs-devel 安装依赖于 libcom_err-devel 包
[root@localhost ~]#yum -y install e2fsprogs-devel e2fsprogs-libs
#安装依赖软件
[root@localhost ~]# tar -jxvf extundelete-0.2.4.tar.bz2 -C /opt
#解压软件
[root@localhost ~]# cd /opt/extundelete-0.2.4
#切换到目录下
[root@localhost extundelete-0.2.4]# ./configure
#编译安装
[root@localhost extundelete-0.2.4]#make
[root@localhost extundelete-0.2.4]#make install
[root@localhost extundelete-0.2.4]#cd /usr/local/bin/
[root@localhost bin]#ls
extundelete you-get
#验证恢复,目前使用版本只对ext3 有效,分区略
[root@localhost ~]# mkfs.ext3 /dev/sdb1
[root@localhost ~]# mkdir /test/
[root@localhost ~]# mount /dev/sdb1 /test/
[root@localhost ~]# cd /test/
[root@localhost test]# echo a>a
[root@localhost test]# echo a>b
[root@localhost test]# echo a>c
[root@localhost test]# echo a>d
可以使用extundelete /dev/sdb1 --inode 2
查看文件系统/dev/sdb1 下存在哪些文件,
具体的使用情况。其中--inode 2 代表从 i 节点为 2 的文件开始查看,一般文件系统格式化挂
载之后,i 节点是从 2 开始的,2 代表该文件系统最开始的目录。
在恢复前需要先解挂载
[root@localhost test]# rm -rf a b
#模拟删除
[root@localhost test]# ls c d lost+foun
[root@localhost test]# cd
[root@localhost ~]# umount /test/
#解挂载
[root@localhost ~]#extundelete /dev/sdb1 --inode 2
# 命令 查看的分区 从2节点开始
#查看该分区下的存在哪些文件
[root@localhost ~]# extundelete /dev/sdb1 --restore-all
# 命令 需要恢复的分区设备 恢复选项,全都要
#使用恢复
执行完恢复的命令后,在当前目录下会出现一个/RECOVERED_FILES/目录,里面保
存了已经恢复的文件
[root@localhost ~]# ls
anaconda-ks.cfg extundelete-0.2.4 extundelete-0.2.4.tar.bz2 RECOVERED_FILES
[root@localhost ~]# cd RECOVERED_FILES/
[root@localhost RECOVERED_FILES]# ls
a b
ext3
CentOS 7 系统默认采用 xfs 类型的文件。针对 xfs 文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数 据备份,以避免数据丢失。
xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。
若系统中未安装 xfsdump与xfsrestore工具,可
以通过yum install -y xfsdump命令安装。
xfsdump 按照inode 顺序备份一个 xfs 文件系统。xfsdump 的备份级别有两种:
0 表示完全备份
1-9 表示增量 备份
xfsdump 的备份级别默认为 0
xfsdump 的命令格式为:
xfsdump -f 备份存放位置 要备份路径或设备文件。
常用的备份参数包括以下几种:
-f:指定备份文件目录
-L:指定标签 session label
-M:指定设备标签 media label
-s:备份单个文件,-s 后面不能直接跟路径
使用 xfsdump 时,需要注意以下的几个限制:
不支持没有挂载的文件系统备份,所以只能备份已挂载的;
必须使用 root 的权限才能操作;
只能备份 XFS 文件系统;
备份下来的数据只能让 xfsrestore 解析;
不能备份两个具有相同 UUID 的文件系统(可使用blkid查看)。
##########前期准备
[root@localhost opt]#mkfs.xfs -f /dev/sdb1
#-f强制格式化
[root@localhost ~]# fdisk /dev/sdb
#分区略
[root@localhost data]#partprobe /dev/sdb
#刷新分区
[root@localhost ~]# mkfs.xfs /dev/sdb1
#格式化
[root@localhost ~]# mkdir /date
[root@localhost ~]# mount /dev/sdb1 /date/
#挂载
[root@localhost ~]# cd /date
[root@localhost date]# cp /etc/passwd ./
#将passwd文件拷入
[root@localhost date]# mkdir test
[root@localhost date]# touch test/a
############备份
[root@localhost data]#rpm -qa |grep xfsdump
#查看是否已安装
xfsdump-3.1.4-1.el7.x86_64
[root@localhost data]#yum install xfsdump -y
#未安装可以使用yum安装
[root@localhost ~]# xfsdump -f /opt/dump_sdb2 /dev/sdb2 [-L dump_sdb1 -M sdb1]
# 命令 指定备份目录路径和文件名 分区 打上标记 现在不打后面也要输入
#使用 xfsdump 命令备份整个分区 并打上标记
[root@localhost ~]#xfsdump -f /opt/dump_sdb2 /dev/sdb2
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)
-> dump_sdb2 (文件标签)
please enter label for media in drive 0 (timeout in 300 sec)
-> sdb2(设备标签)
media label entered: "sdb2"
模拟数据丢失后恢复
[root@localhost data]#cd /data/
[root@localhost data]#rm -rf /*
[root@localhost data]#ls
#恢复
[root@localhost opt]#xfsrestore -f /opt/dump_sdb1 /data/
# 使用 bak文件 将数据恢复到 /data 下
[root@localhost opt]#ls /data/
passwd test
[root@localhost opt]#xfsdump -l 1 -f /backup/dump_sdb1_level_1 /sdb1 -L dump_sdb1_level_1 -M sdb1
#设定级别
/var/log
用于记录系统、程序运行中发生的各种事件
通过阅读日志,有助于诊断和解决系统故障
/var/log/messages :系统中大部分的信息
/var/log/secure:系统安全日志,文本格式,应周期性分析
/var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行查看
/var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看
?/var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看
/var/log/lastlog? ??最近的用户登录事件
/var/log/dmesg:CentOS7 之前版本系统引导过程中的日志信息,文本格式,开机后的硬件变化将不再记录专用命令dmesg查看,可持续记录硬件变化的情况
/var/log/boot.log 系统服务启动的相关信息,文本格式
/var/log/anaconda : anaconda的日志操作系统安装时安装的软件信息
/var/log/cron? ? ? ?计划任务日志
/var/log/maillog? ? ?邮件系统日志
在 Linux 内核中,根据日志消息的重要程度不同,将其分为不同 的优先级别(数字等级越小,优先级越高,消息越重要)
0 EMERG(紧急):会导致主机系统不可用的情况。
1 ALERT(警告):必须马上采取措施解决的问题。
2 CRIT(严重):比较严重的情况。
3 ERR(错误):运行出现错误。
4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。
5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。
6 INFO(信息):一般信息。
7 DEBUG(调试):程序或系统调试信息等
日志文件的格式包含以下 4 列:
事件产生的时间。
产生事件的服务器的主机名。
产生事件的服务名或程序名。
事件的具体信息。
[root@localhost ~]#vim /etc/rsyslog.conf
#查看rsyslog.conf 配置文件
*.info;mail.none;authpriv.none;cron.none /var/log/messages
#表示所有info等级以上的所有等级的信息都写到对应的日志文件里
mail.none
#表示某事件的信息不写到日志文件里(这里比如是邮件)
内核及大多数系统消息被记录到公共日志文件/var/log/messages 中
而其他一些程序消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者直接发送给指定用户。
对于 rsyslog 服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的。
以公共日志/var/log/messages 文件的记录格式为例,其中每一行表示一条日志消息,每一条消息均包括以下四个字段。
时间标签:消息发出的日期和时间。
主机名:生成消息的计算机的名称。
子系统名称:发出消息的应用程序的名称。
消息:消息的具体内容。
users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数
[root@localhost log]#users
root
who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可
以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用
户名、终端类型、登录日期及远程主机
[root@localhost log]#who
root pts/0 2021-09-20 20:12 (192.168.91.1)
root pts/3 2021-09-20 13:09 (192.168.91.1)
zhangsan :0 2021-09-20 20:12 (:0
w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。
[root@localhost log]#w
20:16:08 up 7:16, 3 users, load average: 0.07, 0.06, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.91.1 20:12 4:00 0.06s 0.02s bash
root pts/3 192.168.91.1 13:09 0.00s 0.96s 0.02s w
zhangsan :0 :0 20:12 ?xdm? 1:39 0.17s /usr/libexec/gnome-session-binary -
last 命令用于查询成功登录到系统的用户记录,
最近的登录情况将显示在最前面。通过 last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前 主机可能已被入侵。
[root@localhost log]#last
zhangsan :0 :0 Mon Sep 20 20:12 still logged in
root pts/0 192.168.91.1 Mon Sep 20 20:12 still logged in
root pts/0 192.168.91.1 Mon Sep 20 19:48 - 20:10 (00:22)
root pts/3 192.168.91.1 Mon Sep 20 13:09 still logged in
root pts/2 192.168.91.1 Tue Sep 14 17:42 - 15:09 (5+21:27)
lastb 命令用于查询登录失败的用户记录,
如登录的用户名错误、密码不正确等情况都 将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除 了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。
[root@localhost log]#lastb
btmp begins Mon Sep 20 14:33:01 2021
?
rsyslog 系统日志服务软件? ? ? 帮助管理日志
rsyslog是CentOS 6以后版本的系统管理服务:它提供了高性能,出色的安全性和模块化设计。尽管rsyslog最初是常规的syslogd,但发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。
当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地。即使在远程的目的地和更精细的处理中,性能通常也被认为是惊人的”。
多线程
UDP, TCP, SSL, TLS, RELP
MySQL, PGSQL, Oracle实现日志存储
强大的过滤器,可实现过滤记录日志信息中任意部分
自定义输出格式 可以日志
适用于企业级
ELK:由Elasticsearch, Logstash, Kibana三个软件组成
非关系型分布式数据库基于apache软件基金会jakarta项目组的项目lucene
Elasticsearch是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx、Tomcat、系统日志等功能
Logstash对日志进行收集、分析,过滤,并将其存储供以后使用
Kibana 可以提供的日志分析友好的 Web 界面
kafka消息队列
sshd 软件的 日志 是放在 /var/log/secure 日志中,很多其他软件 放在一起和这个软件比较重要,所以我们要把 sshd 软件的日志单独存放。
2.1??自定义一个日志配置文件
2.2? 看sshd的配置文件
软件名为openssh-server?
rpm -qc openssh-server?
2.3? ? 希望他的日志单独存放?
? ? ? ? ? 改ssh 自己的配置文件
2.4??重启配置文件
2.5 ,开另一台机器,先关防火墙? ? ?
ssh?连接过来
2.6? ?看?我们ssh? ?的日志文件? /data/sshd.log
1,实验目的:把日志汇总到一台总的日志服务器上
2,实验步骤:
开虚拟机2? ?虚拟机3? ?将2,3的防火墙都关闭
3,打开虚拟机2? 日志的配置文件
4,这边用tcp? 或者udp?都可以? ? ?
我们将这两行解除注释?
5,重新启动rsyslog
6,? 查看开启的端口
?7,将虚拟机3重复以上操作
8,dd?复制日志路径,p粘贴? 将日志路径改为要发送的? ?日志服务器
?此处加@@192.168.217.105? ?指tcp
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@192.168.217.105? ?指udp
?9,重新启动rsyslog
?10,测试? ?我们这边手写一个日志? ?logger " this? test from 192.168.217.77"
11,查看最新日志消息
12,我们再去? 日志汇总机? 查看日志消息,可以看到也有该日志
CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。
1,我们这边模拟服务故障,会提醒我们去到? systemctl status httpd.service? 查看
2,?systemctl status httpd.service屏幕不够大,显示不全? ?
标准输出重定向
3,?systemctl status httpd.service
告诉我们?第42行错误? ?应该是? isten?错了
4,?vim +42? 直接进到第42行改
?
journactl? ? -xe? ? ?可以查看实时日志? 以及日志的报错信息
journactl? -u? 程序名? ? ? ? ? ? ??只想看一个程序的内容
journalctl -xe --no-pager? ? ? ? 可以查看日志详细信息
journactl ?-S”开始时间”???-U”结束时间”? ? ? ? ? ??想查看一个时间段的日志输入
#查看指定时间的日志
journalctl --since="2017-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"
?
使用logrotate命令。logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行
首先,我们在/var/log/httpd的目录下看到两个文件,这是httpd服务的日志信息
?
?如果我们现在把access_log文件移动成一个新的文件,加载后又会生成新的文件
?
?这是因为在httpd的配置文件中规定了
?
?我们查看一下logrotate的配置文件
?下面是有关的详细信息
配置参数 | 说明 |
---|---|
compress | 通过gzip压缩转储以后的日志 |
nocompress | 不压缩 |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断 |
nocopytruncate | 备份日志文件但是不截断 |
create mode ownergroup | 转储文件,使用指定的权限,所有者,所属组创建新的日志文件 |
nocreate | 不建立新的日志文件 |
delaycompress | 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩 |
errors address | 专储时的错误信息发送到指定的Email地址 |
ifempty | 即使是空文件也转储,此为默认选项 |
notifempty | 如果是空文件的话,不转储 |
mail address | 把转储的日志文件发送到指定的E-mail 地址 |
nomail | 转储时不发送日志文件 |
olddir directory | 转储后的日志文件放入指定目录,必须和当前日志文件在同一个文件系统 |
noolddir | 转储后的日志文件和当前日志文件放在同一个目录下 |
prerotate/endscript | 在转储以前需要执行的命令,这两个关键字必须单独成行 |
postrotate/endscript | 在转储以后需要执行的命令,这两个关键字必须单独成行 |
daily | 指定转储周期为每天 |
weekly | 指定转储周期为每周 |
monthly | 指定转储周期为每月 |
rotate count | 指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份 |
tabooext [+] list | 让logrotate*不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig,.rpmsave, v, 和~ |
size size | 当日志文件到达指定的大小时才转储bytes(缺省)及KB或MB |
sharedscripts | 默认,对每个转储日志运行prerotate和postrotate脚本,日志文件的绝对路径作为第一个参数传递给脚本。 这意味着单个脚本可以针对与多个文件匹配的日志文件条目多次运行(例如/ var / log / news /.example)。 如果指定此项sharedscripts,则无论有多少个日志*与通配符模式匹配,脚本都只会运行一次 |
nosharedscripts | 针对每一个转储的日志文件,都执行一次prerotate和 postrotate脚本,此为默认值 |
missingok | 如果日志不存在,不提示错误,继续处理下一个 |
nomissingok | 如果日志不存在,提示错误,此为默认值 |