结构
inode与block
硬链接与软连接
恢复误删除的文件
分析日志文件
inode和block概述
文件数据包括元信息与实际数据
文件存储在硬盘上,硬盘最小的存储单位是“扇区”,每个扇区512字节
block(块):1.连续的八个扇区组成一个block(4k);2.是文件存取的最小单位
inode(索引节点):1.索引节点,也叫i节点;2.用于存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)
操作系统读取硬盘是一次性连续读取多个扇区,即一个块一个块的读取的;一个文件必须占用一个inode,且至少占用一个block
inode不包含文件名,文件名是存放在目录当中的,Linux 系统中一切皆文件,因此目录也是一种文件。
Linux系统内部不使用文件名,而使用inode号码来识别文件。文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。
新建文件进行修改后,其inode号会改变,因为块发生改变
inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。
一个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。
每个 inode 的大小,一般是 128 字节或 256 字节。
通常情况下不需要关注单个 inode 的大小,而是需要重点关注 inode 总数。
inode 的总数在格式化时就给定了
查看文件名对应的 inode 号码有两种方式:
ls -i 文件名 【只能看到文件对应的inode号】
stat 文件名 【可以查看到文件inode号以及其它详细信息】
df -i 【可以查看inode号的总量,已使用量和剩余可使用量】
linux系统文件三个主要的时间属性
ctime(change time):最后一次改变文件或目录属性的时间
atime(access time):最后一次访问文件或目录的时间
mtime(modify time):最后一次修改文件或目录内容的时间
由于 inode 号码与文件名分离,导致Linux 系统具备以下几种特有的现象:
*1.文件名包含特殊字符,可能无法正常删除。这时直接删除 inode,能够起到删除文件的作用;【可以删除乱码不能正常删除的文件】
2.移动文件或重命名文件,只是改变文件名,不影响 inode 号码;复制文件改变inode号
3.打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。
4.使用 vi 编辑器修改文件数据保存后,会生成一个新的 inode 号码。
例:模拟inode号满了,硬盘还有空间,但是不能用
[root@localhost ~]# fdisk /dev/sdb 【创建磁盘分区并给sdb1大小4M】
[root@localhost ~]# mkfs.ext4 /dev/sdb1 【sdb1给4M,xfs格式不能格式化太小的硬盘】
[root@localhost ~]# mount /dev/sdb1 /opt/aa 【挂载】
[root@localhost ~]# df -i 【查看inode详细信息:剩余1013个】
[root@localhost ~]# cd /opt/aa 【到挂载目录aa下】
[root@localhost aa]# touch {1..1013}.txt 【在挂载目录下创建1013个文件】
[root@localhost aa]# df -i 【查看inode详细信息 ,inode号已经用完】
[root@localhost aa]# touch a 【创建文件a】
touch: cannot touch ‘a’: No space left on device 【提示失败,没有空间】
*例:删除无法删除的乱码文件
方法一: 1.查看乱码文件的inode号[root@localhost ~]#ls -i
2.在乱码文件的目录opt下输入删除命令:find /opt -inum inode号 -exec rm -f {} \; 【在乱码文件所在opt目录下,找到其inode号,{}表示把前面的内容作为它的参数】
方法二:1.查看乱码文件的inode号[root@localhost ~]#ls -i
2.在乱码文件的目录opt下输入删除命令:find /opt -inum inode号 -delete 【此方法只可以删文件,不可以删目录】
硬链接和软连接
恢复误删除的文件(centos7 中extundelete只能恢复ext3文件)
1.EXT 类型文件恢复(extundelete 是一个开源的 Linux 数据恢复工具,centos7 只能恢复ext3文件)
例:
1.使用fdisk创建分区/dev/sdb2,格式化ext3文件系统,并挂载
[root@localhost opt]# fdisk /dev/sdb
[root@localhost opt]# mkfs.ext3 /dev/sdb2
[root@localhost opt]# mount /dev/sdb2 /opt/aa
2.安装依赖包
[root@localhost ~]# cd /etc/yum.repos.d 【安装本地yum源】
[root@localhost yum.repos.d]# ls
backup
[root@localhost yum.repos.d]# vim test.repo
[root@localhost yum.repos.d]# yum clean all && yum makecache
[root@localhost yum.repos.d]# yum -y install e2fsprogs-devel e2fsprogs-libs【安装依赖环境】
[root@localhost yum.repos.d]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
【在线获取extundelete-0.2.4.tar.bz2安装包】
[root@localhost yum.repos.d]# mv extundelete-0.2.4.tar.bz2 /opt 【移动到opt下】
[root@localhost yum.repos.d]# cd /opt
[root@localhost opt]# ls
aa extundelete-0.2.4.tar.bz2 httpd-2.4.29 httpd-2.4.29.tar.bz2 rh
[root@localhost opt]# tar -jxvf extundelete-0.2.4.tar.bz2 【解压extundelete-0.2.4.tar.bz2安装包】
[root@localhost opt]# ls
aa extundelete-0.2.4.tar.bz2 httpd-2.4.29.tar.bz2
extundelete-0.2.4 httpd-2.4.29 rh
[root@localhost opt]# cd extundelete-0.2.4/
[root@localhost extundelete-0.2.4]# yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl 【安装编译安装的依赖环境】
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete && make && make install 【指定编译安装目录 并且编译安装】
[root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/ 【创立软链接,让系统能识别到extundelete命令】
[root@localhost extundelete-0.2.4]# cd /opt/aa 【在挂载目录下创建文件并写入内容】
[root@localhost aa]# touch 123 456
[root@localhost aa]# echo 123 > 123
[root@localhost aa]# echo 456 > 456
[root@localhost aa]# extundelete /dev/sdb2 --inode 2【查看文件系统/dev/sdb2下存在哪些文件,i 节点是从 2 开始的,2 代表该文件系统最开始的目录】
[root@localhost aa]# rm -rf 123 456 【模拟删除文件123,456】
[root@localhost aa]# extundelete /dev/sdb2 --inode 2
【查看文件系统/dev/sdb2下存在哪些文件,i 节点是从 2 开始的,2 代表该文件系统最开始的目录】
[root@localhost ~]# umount /dev/sdb2 /opt/aa 【解挂载】
umount: /opt/aa: not mounted
[root@localhost ~]# extundelete /dev/sdb2 --restore-all【恢复/dev/sdb2 文件系统下的所有内容】
【在当前目录下会出现一个RECOVERED_FILES/目录,里面保存了已经恢复的文件】
[root@localhost ~]# cd RECOVERED_FILES/ 【进入恢复文件目录】
[root@localhost RECOVERED_FILES]# ls 【查看内容】
123 456
[root@localhost RECOVERED_FILES]# cat 123
123
[root@localhost RECOVERED_FILES]# cat 456
456 【此时文件123,456及文件下的内容都已经恢复】
*恢复XFS类型的文件
CentOS 7 系统默认采用 xfs类型的文件,xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。
xfsdump 的备份级别有两种:0 表示完全备份;1-9 表示增量备份。xfsdump 的备份级别默认为 0
xfsdump 的命令格式为:xfsdump -f 备份存放位置 要备份的路径或设备文件
xfsdump 命令常用的选项:
-f:指定备份文件目录
-L:指定标签 session label
-M:指定设备标签 media label
-s:备份单个文件,-s 后面不能直接跟路径
xfsdump使用限制:
1.只能备份已挂载的文件系统
2.必须使用root的权限才能操作
3.只能备份XFS文件系统
4.备份后的数据只能让xfsrestore解析
5.不能备份两个具有相同UUID的文件系统(可用 blkid命令查看)
例:恢复xfs类型文件
[root@localhost ~]# fdisk /dev/sdb 【创建新的sdb4】
[root@localhost ~]# mkfs.xfs /dev/sdb4 【xfs 格式化】
[root@localhost ~]# mkdir /opt/cc
[root@localhost ~]# mount /dev/sdb4 /opt/cc 【挂载到cc】
[root@localhost cc]# touch 11 22 【在挂载目录下创建文件并写入内容】
[root@localhost cc]# echo 123 > 11
[root@localhost cc]# echo 123 > 22
[root@localhost cc]# rpm -q xfsdump 【检查是否有备份工具】
xfsdump-3.1.4-1.el7.x86_64
[root@localhost cc]# xfsdump -f /opt/dump_sdb4 /dev/sdb4 [-L dump_sdb4 -M sdb4]
【把整个分区的文件备份到指定的目录。-f指定备份文件要到的目录;要备份的设备是sdb4;-L指定标签,与前面指定目录对应;-M指定设备的标签,与前面指定设备对应】
[root@localhost cc]# ls
11 22
[root@localhost cc]# rm -rf * 【删除挂载目录下 11 22】
[root@localhost cc]# xfsrestore -f /opt/dump_sdb4 /opt/cc 【备份的文件 恢复到目录cc】
[root@localhost cc]# ls 【查看文件已经恢复】
11 22
日志文件
Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下
日志功能:1.用于记录系统、程序运行中发生的各种事件;2.有助于诊断和解决系统故障
日志文件分类:
1.内核及系统日志(由系统服务rsyslog统一管理,日志格式基本相似);主配置文件/etc/rsyslog.conf ;软件包rsyslog-7.4.7-16.el7.x86_64 主要程序/sbin/rsyslogd
2.用户日志:记录系统用户登录及退出系统的相关信息
3.程序日志:由各种应用程序独立管理的日志文件,记录格式不统一
常见的一些日志文件:
内核及公共消息日志:/var/log/messages:记录Linux内核消息及各种应用程序的公共日志信息,
包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息
计划任务日志:/var/log/cron:记录crond计划任务产生的事件信息
系统引导日志:/var/log/dmesg:记录Linux系统在引导过程中的各种事件信息
邮件系统日志:/var/log/maillog:记录进入或发出系统的电子邮件活动
vim /etc/rsyslog.conf 【查看rsyslog.conf配置文件,规则配置格式:设备的级别和动作】
*.info;mail.none;authpriv.none;cron.none /var/log/messages
【*表示所有 *.info表示所有级别,分号隔开none表示没有级别,即不记录
本行中表示不记录mail、authpriv、cron。其他所有记录到/var/log/messages文件中】
local7.* /var/log/boot.log
【local7表示自定义服务,范围为0-7都可以使用,在支持的服务配置文件中也要写对应的local等级// /var/log/boot.log表示存到此目录下的文件中,文件可以自定义路径和文件名
//可以使用1个@或者2@加ip的形式将日志传到其他相通的服务器上】
$WorkDirectory /var/lib/rsyslog 【这是服务自身的工作日志】
设备字段说明:
auth 用户认证时产生的日志
authpriv ssh、ftp等登录信息的验证信息
daemon 一些守护进程产生的日志
ftp FTP产生的日志
lpr 打印相关活动
mark rsyslog服务内部的信息,时间标识
news 网络新闻传输协议(nntp)产生的消息。
syslog 系统日志
uucp Unix-to-Unix Copy 两个unix之间的相关通信
console 针对系统控制台的消息。
cron 系统执行定时任务产生的日志。
kern 系统内核日志
local0~local7 自定义程序使用
mail 邮件日志
user 用户进程
Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要):
0 EMERG(紧急):会导致主机系统不可用的情况。如系统崩溃
1 ALERT(警告):必须马上采取措施解决的问题。如数据库被破坏
2 CRIT(严重) :比较严重的情况。如硬盘错误,可能会阻碍程序的部分功能
3 ERR(错误):运行出现错误。不是非常紧急,尽快修复的
4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。不是错误,如磁盘用了85%等
5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。无需处理
6 INFO(信息):一般信息。正常的系统信息
7 DEBUG(调试):程序或系统调试信息等。包含详细开发的信息,调试程序时使用
none:没有优先级,不记录任何日志消息
日志记录的一般格式
Feb 26 13:00:01 localhost systemd: Started Session 12 of user root.
时间标签 主机名 子系统名称 消息的具体内容
时间标签:消息发出的日期和时间
主机名:生成消息的计算机的名称
子系统名称:发出消息的应用程序的名称
日志的分析工具:
users:显示目前登录系统的用户信息
w:显示目前登入系统的用户的详细信息
last:列出截止目前登陆过系统的用户信息
lastb:用于查询登录失败的用户记录
日志管理策略
1.及时做好备份和归档
2.延长日志保存期限
3.控制日志访问权限:日志中可能包含各类敏感信息,如账户、口令等
4.集中管理日志:1.将服务器的日志文件发送到统一的日志文件服务器;便于日志信息的统一收集、整理和分析;3.杜绝日志信息以外丢失、恶意篡改或删除
例:将ssh服务日志单独存放
1.关闭服务端和客户端防火墙、setenforce 0
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
2.[root@localhost ~]# vim /etc/rsyslog.conf 【修改配置文件】
[root@localhost ~]# vim /etc/ssh/sshd_config
【将上一行注释掉;然后下一行插入SyslogFacilty LOCAL6】
[root@localhost log]# systemctl restart rsyslog.service
[root@localhost log]# systemctl restart sshd 【将修改的两个服务重启】
在另一台用户上测试
[root@localhost ~]# ssh root@192.168.126.1
root@192.168.126.1's password:
Last login: Thu Mar 2 20:31:44 2023 from 192.168.126.1
此时生成ssh服务日志,查看日志/var/log/sshd.log
[root@localhost log]# ll ssh*
-rw-------. 1 root root 248 Mar 2 20:34 sshd.log
[root@localhost log]# cat sshd.log
Mar 2 20:34:03 localhost sshd[61271]: Server listening on 0.0.0.0 port 22.
Mar 2 20:34:03 localhost sshd[61271]: Server listening on :: port 22.
Mar 2 20:34:51 localhost sshd[61289]: Accepted password for root from 192.168.126.1 port 48924 ssh2
例:日志服务器来收集日志 【把其他服务器上的日志只想到另一台服务器上】
zy001上的日志,指向收集到zy002上
1.先配置传输方zy001
[root@localhost ~]# systemctl stop firewalld.service 【关闭防火墙】
[root@localhost ~]# setenforce 0 【关闭检验机制】
[root@localhost ~]# vim /etc/rsyslog.conf 【修改配置文件】
最后保存退出wq!
[root@localhost ~]# systemctl restart rsyslog.service 【配置完重启服务】
2.配置接收方zy002
[root@localhost ~]# systemctl stop firewalld.service 【关闭防火墙】
[root@localhost ~]# setenforce 0 【关闭检验机制】
[root@localhost ~]# vim /etc/rsyslog.conf 【进入日志管理系统修改配置文件】
重启服务 systemctl restart rsyslog.service
[root@localhost ~]# tail -f /var/log/messages 【查看实时日志】
3.在传输方zy001输入
[root@localhost ~]# logger "123456"
[root@localhost ~]# logger "123456"
[root@localhost ~]# logger "123456"
4.接收方zy002实时日志就可以显示zy001的日志:
日志管理工具 journalctl
日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从messages这个文件里读取信息。Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。
日志的配置文件是 /etc/systemd/journald.conf
#查看所有日志(默认情况下,只保存本次启动的日志)
journalctl
journalctl -r #-r表示倒序,从尾部看(推荐)
#查看内核日志(不显示应用日志)
journalctl -k
#查看系统本次启动的日志
journalctl -b [-0]
#查看上一次启动的日志(需更改设置,如上次系统崩溃,需要查看日志时,就要看上一次的启动日志)
journalctl -b -1
#显示尾部指定行数的日志
查看的是/var/log/messages的日志,但是格式上有所调整,如主机名格式不一样而已
journalctl -n 20
#查看某个服务的日志
journalctl -u nginx.service
#查看指定进程的日志
journalctl _PID=1
#查看指定用户的日志
journalctl _UID=0 --since today
journalctl _UID=0 --since yesterday 昨天开始的日志,不能看明天的日志
journalctl -xe
# -x 是目录(catalog)的意思,在报错的信息下会,附加解决问题的网址
#-e pager-end 从末尾开始看