目录
一、inode于block
1)inode于block概述
在Linux 系统中一切皆文件,因此目录也是一种文件。一个文件的文件名是放在目录中的,文件数据存储在block(块)中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。因此,一个文件必须占用一个 inode,并且至少占用一个 block
- 文件数据包元信息与实际数据
- 文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节
- block(块)
- 连续的八个扇区组成一个block(4K)
- 是文件存取的最小单位
- inode(索引节点)
- 中文译名为“索引节点”,也叫i节点
- 用于存储文件元信息
用户访问一个文件的简单流程:
- 用户访问文件时
- 通过文件名找到对应的inode号
- 通过Inode号获取inode信息,
- 根据inode信息判断用户是否有权限访问文件
- 有则指向对于的数据block并读取数据,无则拒绝访问
用户在创建一个文件后,这个文件就会生成一个相对应的inode号,文件中的文件名和文件数据是分开存放的,系统根据inode号来寻找真实数据
2)inode的内容
inode包含文件的元信息
- inode number 节点号
- 文件类型
- 文件的读、写、执行权限
- 文件属主的UID
- 文件属组的GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
用stat命令可以查看某个文件的inode信息
ls -i
stat 文件路径
Linux系统文件三个主要的时间属性
-
atime(access time):最近访问
最后一次访问文件的时间
-
mtime(modify):最近更改
最后一次更改文件内容的时间
-
ctime(change time):最近改动
最后一次改变文件元信息的时间
ps:
- 不打开文件的话,atime不变。例如使用echo追加内容,atime不会变,因为文件没有被打开访问
- 修改文件内容的话,mtime会变,ctime也会变
- 如果只修改文件的权限,ctime变,mtime不变
目录文件的结构
- 目录也是一种文件
- 目录文件的结构
文件名1 | inode号码1 |
文件名2 | inode号码2 |
…… | …… |
ps:每一行称为一个目录项
- 每个inode都有一个号码,操作系统用inode号码来识别不同的文件
- Linux系统内部不使用文件名,而使用inode号码来识别文件
- 对于用户,文件名只是inode号码便于识别的别称
用户通过文件名打开文件时,系统内部的过程
- 系统找到这个文件名对应的inode号码
- 通过inode号码,获取inode信息
- 根据inode信息,找到文件数据所在的block,读出数据
查看inode号码的方法
ls -i命令:查看文件名对应的inode号码
ls -i aa.txt
stat命令:查看文件inode信息中的inode号码
stat aa.txt
硬盘分区后的结构
3)inode的大小
inode也会消耗硬盘空间
- 每个inode的大小
- 一般时128字节或256字节
格式化文件系统时确认inode的总数
使用df -i命令可以查看每个硬盘分区的inode总数和已使用的数量
indoe号的数量是文件数量的限制
mount /dev/sdb1 /shiyan //创建一个分区,文件系统类型为ext4 ,挂载到新创文件夹
cd /shiyan //切换到挂载的文件夹
df -i //查看空余的indoe号
for ((i=1;i<=1270;i++))
do
touch file$i
done
//脚本创建1270个文件,占满所有的indoe号
df -i //再次查看可用indoe号
touch a //尝试创建一个新文件
df -h //查看可用空间
结论:一个分区能够创建多少个空文件,除了取决于它的容量之外,还和它所拥有的indoe号息息相关,indoe号的数量决定文件的最大数量上限
4)inode的特殊作用
由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象
- 当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
- 移动或重命名文件时,只改变文件名,不影响inode号码
- 打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名
5)执行文件命令对indoe号的影响
cp命令
分配一个空闲的inode号,在inode表中生成新条目在目录中创建一个目录项,将名称与inode编号关联拷贝数据生成新的文件
rm命令
硬链接数递减,从而释放的inode号可以被重用,块放在空闲列表中,删除目录项
数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖。
mv命令
如果mv命令的目标和源在同一设备,不影响inode表(除时间戳)或磁盘上的数据位置;系统会删除旧的目录对应关系,新建目录对应关系。
vim编辑器
vim编辑器改变文件内容,是先创建一个新的swp文件,编辑的内容也是在swp文件中进行,当用户保存时,swp文件就会替换当前文件,因此indoe号会发生改变
利用echo命令往文件中加内容
对原文件进行操作,只改变原文件的内容,其他没有任何影响,indoe号不发生改变
6)通过indoe号删除rm常规方法删除不掉的文件
find /opt -inum 67320322 -delete
find /opt -inum 67320322 -exec rm -rf {} \;
find /opt -inum 67320322| xargs rm -rf
总结
扇区:硬盘的最小存储单位 512B
块block 文件存取的最小单位 通常由连续8个扇区组成 4069B
文件 —>文件名 —> 目录 —>文件名 与 inode号的对应关系
元信息 —> inode —>除了文件名以外的属性
实际数据 —> 块block —>文件内容
访问文件 —>通过文件名找到inode号 —>通过inode号获取inode信息 —>根据inode信息判断用户是否具有访问权限 —>获取文件数据所在的block,读取数据(如果没有权限,则拒绝访问)
文件的时间
atime mtime ctime
查看inode号
stat 文件
ls -i 文件
二、硬链接和软连接
1)链接文件
为文件或目录建立链接文件
链接文件分类
软连接(符号链接) | 硬链接 | |
删除原文件后 | 失效 | 仍旧可用 |
使用范围 | 适用于文件或目录 | 只可用于文件 |
保存位置 | 与原始文件可以位于不同的文件系统中 | 必须与原始文件在同一个文件系统(如一个Linux分区)内 |
硬链接
ln 源文件 目标位置
软链接
ln [-s] 源文件或目录…… 链接文件或目标文件位置
三、恢复误删除的文件
1)恢复EXT类型的文件
编译安装extundelete软件包
- 安装依赖包
- 配置、编译及安装
模拟删除并执行恢复操作
2)xfs类型文件备份和恢复
xfsdump命令格式
xfsdump -f 备份存放位置 要备份的路径或设备文件
xfsdump备份级别(默认为0)
0:完全备份
1-9:增量备份
xfsdump常用选项
-f:指定备份文件目录
-L:指定标签 session label
-M:指定设备标签 media label
-s:备份单个文件,-s后面不能直接跟路径
xfsdump使用限制
- 只能备份已挂载的文件系统
- 必须使用root的权限才能操作
- 只能备份XFS文件系统
- 备份后的数据只能让xfsrestore解析
- 不能备份两个具有相同UUID的文件系统(可用blkid命令查看)
xfsrestore命令格式
xfsrestore -f 恢复文件的位置 存放恢复后文件的位置
模拟删除并执行恢复操作
3)示例extundelete
extundelete 是一个开源的 Linux 数据恢复工具,支持 ext3、ext4文件系统。(ext4只能在centos6版本恢复),本示例模拟ext3文件系统损坏,借助extundelete,修复文件数据
环境列举
wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
所需依赖包: yum -y install e2fsprogs-devel e2fsprogs-libs
该软件涉及到c++,所以安装一个c++编译工具: yum install -y gcc gcc-c++ make
准备一台centos 的虚拟机,新添加一块硬盘,开辟出一块主分区,建立ext3文件系统。(本次实验是要centos7运行)
fdisk /dev/sdb
mkfs.ext3 /dev/sdb1
mkdir /test
mount /dev/sdb1 /test
lsblk
①安装extundelete 以及涉及到的工具
yum -y install e2fsprogs-devel e2fsprogs-libs
cd /test
wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
tar xf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4/
yum install -y gcc gcc-c++ make
./configure --prefix=/usr/local/extundelete && make && make install
ln -s /usr/local/extundelete/bin/* /usr/bin/
②删除ext3文件系统中的文件
echo 123>a.txt
echo 123>b.txt //创建两个文件 ab ,写入数据
extundelete /dev/sdb1 --inode 2
//查看文件系统/dev/sdb1下存在哪些文件,i 节点是从 2 开始的,2 代表该文件系统最开始的目录。
rm -rf a.txt
rm -rf b.txt //将两个ext3文件删除
③恢复删除ext3文件系统中的文件
umount /test
extundelete /dev/sdb1 --restore-all
④查看结果
ls
ls RECOVERED_FILES/
实验结论: 以上实验来看,文件最后并没有恢复成功,这个工具也连续用了几次,都是概率性的恢复文件,无法确保文件的百分百恢复。所以对文件做备份,一定是最优的选择
4)xfs 类型文件备份和恢复
CentOS 7 系统默认采用 xfs类型的文件,xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复,目前市面上并没有开源的xfs文件恢复工具,但是利用备份恢复依旧是最优的选择方案。本次实验就是模拟对重要的xfs文件进行备份,在误删后,进行恢复
①创建xfs系统文件环境
#使用fdisk创建分区/dev/sdb1,格式化xfs文件系统
fdisk /dev/sdb
partprobe /dev/sdb
mkfs.xfs [-f] /dev/sdb1
mkdir /date
mount /dev/sdb1 /date/
cd /data
cp /etc/passwd ./
mkdir test
touch test/a
②备份整个分区
#使用 xfsdump 命令备份整个分区
xfsdump -f /opt/dump_sdb1 /dev/sdb1 [-L dump_sdb1 -M sdb1]
#如果没有xfsdump
rpm -qa | grep xfsdump
yum install -y xfsdump
③模拟数据丢失
#模拟数据丢失并使用 xfsrestore 命令恢复文件
cd /data/
rm -rf ./*
ls
④恢复操作
xfsrestore -f /opt/dump_sdb1 /date/
实验总结
对创建好的文件系统进行一整个分区的备份,存放在足够的空间中。当该分区中的重要文件被误删后,可以利用备份分区,进行数据还原。
总结
两个实验都展示了重要数据丢失后的恢复手段,但是第二个实验比第一个完成的更加顺利,数据保存的更加完整。在运维环境中,一定要本着数据无价的态度来进行工作,对重要的数据文件进行好备份处理
误删恢复
extundelete
lsof
备份恢复
tar
xfsdump xfsrestore
cpio find ……|cpio -ocvB>……
cpio -idvcu <
四、分析日志文件
1)日志的功能
- 用于记录系统、程序运行中发生的各种事件
- 通过阅读日志,有助于诊断和解决系统故障
2)日志文件的分类及其说明
Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下
内核及系统日志
- 由系统服务rsyslog统一进行管理,日志格式基本相似
- 主配置文件/etc/rsyslog.conf
用户日志
- 记录系统用户登录及退出系统的相关信息
程序日志
- 由各种应用程序独立管理的日志文件,记录格式不统一
日志分类表
日志种类 | 位置 | 功能描述 |
内核及公共消息日志 | /var/log/messages | 记录Linux内核消息及各种应用程序的公共日志信息,包括启动、Io错误、网络错误、程序故障等 对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息 |
计划任务日志 | /var/log/cron | 记录与系统定时任务相关的曰志 |
系统引导日志 | /var/log/dmesg | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 |
邮件系统日志 | /var/log/maillog | 记录邮件信息的曰志 |
用户登录日志 | /var/log/lastlog | 记录系统中所有用户最后一次的登录时间的曰志。这个文件是二进制文件.不能直接用 vi 查看,而要使用 lastlog 命令查看 |
用户验证授权日志 | /var/log/secure | 记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录。比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
用户登录注销和系统开机相关日志 | /var/log/wtmp | 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件,不能直接用 vi 查看,而要使用 last 命令查看 |
当前登录用户信息日志 | /var/run/utmp | 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用 vi 查看,而要使用w、who、users等命令查看 |
more /var/log/messages //以查看message目录为例子
内核及系统日志文件中的每一行表示一条信息,每个信息由4个字段的固定格式组成:
时间标签:消息发出的日期和时间
主机名:生成消息的计算机的名称
子系统名称:发出消息的应用程序的名称
消息:消息的具体内容
3)日志主要配置文件
内核及系统日志由系统服务 rsyslog 统一管理,主配置文件为/etc/rsyslog.conf
vim /etc/rsyslog.conf #查看rsyslog.conf配置文件
规则配置格式:【设备.级别 动作】
设备字段说明
auth | 用户认证时产生的日志 |
authpriv | ssh、ftp等登录信息的验证信息 |
daemon | 一些守护进程产生的日志 |
ftp | FTP产生的日志 |
lpr | 打印相关活动 |
mark | rsyslog服务内部的信息,时间标识 |
news | 网络新闻传输协议(nntp)产生的消息 |
syslog | 系统日志 |
uucp | Unix-to-Unix Copy 两个unix之间的相关通信 |
console | 针对系统控制台的消息 |
cron | 系统执行定时任务产生的日志 |
kern | 系统内核日志 |
local0~local7 | 自定义程序使用 |
邮件日志 | |
user | 用户进程 |
Linux系统内核日志消息
优先级 | 信息名称 | 解释 |
0 | EMERG(紧急) | 会导致主机系统不可用的情况。如系统崩溃 |
1 | ALERT(警告) | 必须马上采取措施解决的问题。如数据库被破坏 |
2 | CRIT(严重) | 比较严重的情况。如硬盘错误,可能会阻碍程序的部分功能 |
3 | ERR(错误) | 运行出现错误。不是非常紧急,尽快修复的 |
4 | WARNING(提醒) | 可能影响系统功能,需要提醒用户的重要事件。不是错误,如磁盘用了85%等 |
5 | NOTICE(注意) | 不会影响正常功能,但是需要注意的事件。无需处理 |
6 | INFO(信息) | 一般信息。正常的系统信息 |
7 | DEBUG(调试) | 程序或系统调试信息等。包含详细开发的信息,调试程序时使用 |
none | 空 | 没有优先级,不记录任何日志消息 |
注意:数字等级越小,优先级越高,消息越重要
举例
mail.info /var/log/maillog
//比指定级别更高的日志级别,包括指定级别自身,保存到/var/log/maillog中
mail.=info /var/log/maillog
//明确指定日志级别为info,保存至/var/log/maillog
mail.!info /var/log/maillog
//除了指定的日志级别(info)所有日志级别信息,保存至/var/log/maillog
.info /var/log/maillog
//所有facility的info级别,保存至/var/log/maillog mail. /var/log/maillog :mail的所有日志级别信息,都保存至/var/log/maillog
mail.notice;news.info /var/log/maillog
//mail的notice以上记得日志级别和news的info以上的级别保存至/var/log/maillog
mail,news.crit -/var/log/maillog
//mail和news的crit以上的日志级别保存/var/log/maillog中;“-”代表异步模式
4)日志分析工具的引入
- users 查看当前用户名称
- who 查看当前登录的用户、终端、登录时间、IP地址。
- W 查看当前登录的用户、终端、IP地址、登录时间、占用CPU的情况、进程等。
- last 命令用于查询成功登录到系统的用户记录
- lastb 命令用于查询登录失败的用户记录
5)程序日志分析:由相应的应用程序独立进行管理
Web服务:/var/log/httpd/
- access_log ——记录客户访问事件
- error_log ——记录错误事件
代理服务:/var/log/squid/
- access.log、cache.log
6)journalctl日志管理工具
journalctl 日志管理工具的简介
日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从messages这个文件里读取信息。 Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。 日志的配置文件是/etc/systemd/journald.conf
①查看所有日志
#查看所有日志(默认情况下,只保存本次启动的日志)
journalctl
journalctl -r #-r表示倒序,从尾部看(推荐),可以看最新的
②查看某个服务的日志
#查看某个服务的日志
journalctl -u firewalld.service
③查看指定进程的日志
#查看指定进程的日志
journalctl _PID=1
④查看指定用户的日志
#查看指定用户的日志
journalctl _UID=0 --since today
journalctl -xe // -x 是目录(catalog)的意思,在报错的信息下会,附加解决问题的网址
-e pager-end 从末尾开始看
⑤journalctl其他选项的作用
#查看系统本次启动的日志
journalctl -b [-0]
#查看上一次启动的日志(需更改设置,如上次系统崩溃,需要查看日志时,就要看上一次的启动日志)
journalctl -b -1
#显示尾部指定行数的日志 查看的是/var/log/messages的日志,但是格式上有所调整,如主机名格式不一样而已
journalctl -n 20 [-f] // -f 实时动态追踪
#日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager
#以 JSON 格式(单行)输出
journalctl -b -u nginx.service -o json
#以 JSON 格式(多行)输出,可读性更好
journalctl -b -u nginx.serviceqq -o json-pretty
#显示日志占据的硬盘空间
journalctl --disk-usage
#指定日志文件占据的最大空间
journalctl --vacuum-size=1G
#指定日志文件保存多久
journalctl --vacuum-time=1years
总结
1. 能够区分处block和indoe的区别,准确说出它们在文件系统中的身份作用
2. 掌握日志分析中内核日志信息中优先级的意思,以及对应名称(遵循数字越小优先级越大的规则)
3.系统日志 /var/log/messages ,由rsyslog服务来管理,主配置文件 /etc/rsyslog.conf 用户登录日志 /var/log/secure
4.journalctl 可以直接查看 /var/log/messages 日志内容,掌握常用选项 -r -u -f
5.日志收集的方案服务器数量较少的: rsyslog shell/python脚本 服务器数量众多: ELK