文章目录
一、文件系统的基本概念
1.文件的概述
文件是存储在硬盘上的,硬盘的最小存储单位叫做"扇区”(sector),每个扇区存储512字节。文件数据包括实际数据与元信息(类似文件属性)。
2.inode概述
存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域叫做inocde。中文译名为“索引节点”,也叫i节点。
由于Linux 系统中一切皆文件,目录也是一种文件。所以inode是不包含文件名,文件名是存放在目录文件当中的。
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux 系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于 识别的别称,文件名和inode号码是一 一对应关系, 每个inode号码对应一个文件名。
3.block概述
一般连续八个扇区组成一个"块”"(block),一个块是4K大小,是文件存取的最小单位,文件数据存储在"块"中。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。
如何查询块的大小
[root@host ~]# blockdev --getbsz /dev/sdb1
4096
4.硬盘分区后的结构
由上图可知:
元信息是存储在inode当中;文件数据存储在block当中,而文件名时存储在目录文件中。所以一个文件必须占用一个inode,并且至少占用一个block。
二、inode内容
1.文件的元信息
inode主要包含以下几项信息:
- 文件的字节数
- 文件拥有者的User ID(UID)
- 文件的Group ID(GID)
- 文件的读、写、执行权限
- 文件的链接数目
- 文件的时间戳
注意:不包含文件名
2.查看inode号的方式
查看文件名对应的inode号
ls -i 文件名
例如
[root@host opt]# ls -i 123.txt
69194517 123.txt
查看文件信息的inode号
stat 文件名
例如
[root@host opt]# stat 123.txt
文件:"123.txt"
大小:4 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:69194517 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2023-04-13 14:37:15.279152905 +0800
最近更改:2023-04-13 14:37:08.971168206 +0800
最近改动:2023-04-13 14:37:08.971168206 +0800
创建时间:-
3.Linux系统文件三个重要时间属性
访问时间——atime
atime(access time),最后一次访问文件或目录的时间。
[root@host opt]# stat abc.txt
文件:"abc.txt"
大小:4 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:69164083 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2023-04-13 15:01:28.355289530 +0800
最近更改:2023-04-13 15:01:28.355289530 +0800
最近改动:2023-04-13 15:01:28.355289530 +0800
创建时间:-
[root@host opt]# vi abc.txt
[root@host opt]# stat abc.txt
文件:"abc.txt"
大小:4 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:69164083 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2023-04-13 15:01:43.038217006 +0800
最近更改:2023-04-13 15:01:28.355289530 +0800
最近改动:2023-04-13 15:01:28.355289530 +0800
创建时间:-
修改时间——mtime
mtime(modify time),最后一次修改文件内容或目录(内容)的时间。
[root@host opt]# stat abc.txt
文件:"abc.txt"
大小:4 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:69164083 硬链接:1
权限:(0755/-rwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2023-04-13 15:01:43.038217006 +0800
最近更改:2023-04-13 15:01:28.355289530 +0800
最近改动:2023-04-13 15:02:45.346909241 +0800
创建时间:-
[root@host opt]# echo 111 >> abc.txt
[root@host opt]# stat abc.txt
文件:"abc.txt"
大小:8 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:69164083 硬链接:1
权限:(0755/-rwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2023-04-13 15:01:43.038217006 +0800
最近更改:2023-04-13 15:04:38.688349407 +0800
最近改动:2023-04-13 15:04:38.688349407 +0800
修改文件内容或者目录(内容),除了mtime会改变之外,ctime也会改变,因为大小会改变。
状态时间——ctime
ctime(change time),最后一次改变文件元信息(文件或目录属性)的时间。
[root@host opt]# stat abc.txt
文件:"abc.txt"
大小:4 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:69164083 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2023-04-13 15:01:43.038217006 +0800
最近更改:2023-04-13 15:01:28.355289530 +0800
最近改动:2023-04-13 15:01:28.355289530 +0800
创建时间:-
[root@host opt]# chmod +x abc.txt
[root@host opt]# stat abc.txt
文件:"abc.txt"
大小:4 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:69164083 硬链接:1
权限:(0755/-rwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2023-04-13 15:01:43.038217006 +0800
最近更改:2023-04-13 15:01:28.355289530 +0800
最近改动:2023-04-13 15:02:45.346909241 +0800
创建时间:-
补充——find命令
//对文件的最近一次访问是在n*24小时之前。
find -atime n
//对文件数据的最近一次修改是在n*24小时之前。
find -mtime n
//对文件状态的最近一次修改是在n*24小时之前。
find -ctime n
4.目录文件的结构
Linux 系统中一切皆文件,因此目录也是一种文件。目录文件的内容包含了此目录中文件的列表及inode number。
每个inode都有一个对应的数字,操作系统用inode号来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于用户来说,一般都是通过文件名来查找文件,但文件名只是inode号码便于识别的别称。
5.访问文件的简单流程
当用户在Linux系统中想要访问一个文件时会查找它的文件名,系统会先根据文件名去查找它对应的inode号码。通过inode号码,获取inode信息。根据inode信息,判断该用户是否具有访问这个文件的权限,如果有,就指向相对应的数据block,并读取数据;如果没有就输出控制台”权限不够“。
[root@host opt]# ll
总用量 4
-rw-rw----. 1 root root 8 4月 13 15:04 abc.txt
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
[root@host opt]# su test
[test@host opt]$ cat abc.txt
cat: abc.txt: 权限不够
6.inode的大小
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i
命令。
[root@host opt]# df -Thi
文件系统 类型 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs devtmpfs 468K 347 468K 1% /dev
tmpfs tmpfs 472K 1 472K 1% /dev/shm
tmpfs tmpfs 472K 1.4K 471K 1% /run
tmpfs tmpfs 472K 16 472K 1% /sys/fs/cgroup
/dev/sda2 xfs 18M 157K 18M 1% /
tmpfs tmpfs 472K 1 472K 1% /run/user/0
/dev/sr0 iso9660 0 0 0 - /mnt
tmpfs tmpfs 472K 9 472K 1% /run/user/42
/dev/sdb1 xfs 10M 3 10M 1% /data
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。还有另一种无法在硬盘上创建新文件的原因就是硬盘损坏了,可以通过factor
命令查看硬盘是否损坏。
7.inode的特殊作用
由于inode号码与文件名分离,导致一些Unix/Linux系统具备以下几种特有的现象:
- 当文件名包含特殊字符,可能无法正常删除文件。这时通过
ls -i
命令直接删除inode,能够起到删除文件的作用; - 移动文件或重命名文件,只是改变文件名,不影响inode号;
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名;
- 用
echo
命令修改文件,不影响文件的inode号;而使用vi编辑器
修改保存文件后,会生成一个新的inode号。
find ./ -inum inode号 -exec rm -i {} \; //通过删除inode号来删除文件
//或者
find ./ -inum inode号 -delete
注:如果你移动到挂载目录下,会发现inode号也会改变。
三、恢复文件
1.EXT类型文件的误删恢复
extundelete
extundelete是一个开源的Linux数据恢复工具,支持ext3、ext4文件系统。(ext4只能在centos6版本恢复)
安装依赖包
- e2fsprogs-libs-1.41.12-18.el6.x86_64.rpm
- e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm
[root@host ~]# yum -y install e2fsprogs-devel e2fsprogs-libs
配置、编译及安装
使用extundelete-0.2.4.tar.bz2软件包编译、安装
使用fdisk创建分区/dev/sdb1,格式化ext3文件系统
[root@host ~]# fdisk /dev/sdb
[root@host ~]# partprobe /dev/sdb
[root@host ~]# mkfs -t ext3 /dev/sdb1
[root@host ~]# mkdir /data
[root@host ~]# mount /dev/sdb1 /data/
[root@host ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 13M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda2 xfs 36G 4.7G 32G 13% /
tmpfs tmpfs 378M 12K 378M 1% /run/user/42
tmpfs tmpfs 378M 0 378M 0% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /mnt
/dev/sdb1 ext3 9.8G 23M 9.2G 1% /data
编译、安装extundelete(本地有此安装包)
[root@host ~]# cd /opt/
[root@host opt]# rz -E
rz waiting to receive.
[root@host opt]# ls
extundelete-0.2.4.tar.bz2 rh
[root@host opt]# tar xf extundelete-0.2.4.tar.bz2
[root@host opt]# ls
extundelete-0.2.4 extundelete-0.2.4.tar.bz2 rh
[root@host opt]# cd extundelete-0.2.4/
[root@host extundelete-0.2.4]# ls
acinclude.m4 autogen.sh configure depcomp LICENSE Makefile.in README
aclocal.m4 config.h.in configure.ac install-sh Makefile.am missing src
//定义需要的命令指定的安装路径一般放在/usr/local目录下,并且make编译模块和安装
[root@host extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete && make && make install
设置extundelete命令为系统可识别的命令
[root@host extundelete-0.2.4]# cd /usr/local/
[root@host local]# ls
bin etc extundelete games include lib lib64 libexec sbin share src
[root@host local]# cd extundelete/
[root@host extundelete]# ls
bin
[root@host extundelete]# cd bin/
[root@host bin]# ls
extundelete
[root@host bin]# ln -s /usr/local/extundelete/bin/extundelete /usr/bin/
模拟删除并执行恢复操作
创建文件和目录,模拟环境
[root@host data]# ls
lost+found
[root@host data]# echo a >a
[root@host data]# echo b > b
[root@host data]# echo c > c
[root@host data]# echo d > d
[root@host data]# mkdir 123
[root@host data]# echo helloworld > 123/abc123.txt
[root@host data]# ll -R
.:
总用量 36
drwxr-xr-x. 2 root root 4096 4月 13 18:39 123
-rw-r--r--. 1 root root 2 4月 13 18:38 a
-rw-r--r--. 1 root root 2 4月 13 18:38 b
-rw-r--r--. 1 root root 2 4月 13 18:38 c
-rw-r--r--. 1 root root 2 4月 13 18:39 d
drwx------. 2 root root 16384 4月 13 18:13 lost+found
./123:
总用量 4
-rw-r--r--. 1 root root 11 4月 13 18:39 abc123.txt
./lost+found:
总用量 0
查看文件系统/dev/sdc1下存在哪些文件以及inode号,i节点是从2开始的,2代表该文件系统最开始的目录
[root@host data]#extundelete /dev/sdb1 --inode 2
...
File name | Inode number | Deleted status
. 2
.. 2
lost+found 11
a 12
b 13
c 14
d 15
123 65537
删除部分文件,然后恢复
//删除文件
[root@host data]# rm -rf c d 123
[root@host data]# ls
a b lost+found
[root@host data]# cd
[root@host ~]# umount /data
[root@host ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 13M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda2 xfs 36G 4.7G 32G 14% /
tmpfs tmpfs 378M 12K 378M 1% /run/user/42
tmpfs tmpfs 378M 0 378M 0% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /mnt
//查看误删目录下的文件状态
[root@host ~]# extundelete /dev/sdb1 --inode 2
...
File name | Inode number | Deleted status
. 2
.. 2
lost+found 11
a 12
b 13
c 14 Deleted
d 15 Deleted
123 65537 Deleted
//恢复/dev/sdb1文件系统下的所有内容
[root@host ~]# extundelete /dev/sdb1 --restore-all
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 80 groups loaded.
Loading journal descriptors ... 54 descriptors loaded.
Searching for recoverable inodes in directory / ...
4 recoverable inodes found.
Looking through the directory structure for deleted files ...
0 recoverable inodes still lost.
//在当前目录下会出现一个RECOVERED_ FILES/目录,里面保存了已经恢复的文件
[root@host ~]# ls
anaconda-ks.cfg RECOVERED_FILES 模板 图片 下载 桌面
initial-setup-ks.cfg 公共 视频 文档 音乐
[root@host ~]# cd RECOVERED_FILES/
[root@host RECOVERED_FILES]# ls
123 c d
[root@host RECOVERED_FILES]#
2.xfs类型文件的备份和恢复
Centos 7系统默认采用xfs类型的文件,xfs类型的文件可使用xfsdump 与 xfsrestore 工具进行备份恢复。
xfsdump
xfsdump 的备份级别有两种:0
表示完全备份;1-9
表示增量备份。xfsdump 的备份级别默认为0。
基本命令格式
xfsdump [-f] 备份存放位置要备份的路径或设备文件
常用选项及含义
选项 | 含义 |
---|---|
-f | 指定备份文件目录 |
-L | 指定标签session label |
-M | 指定设备标签media label |
-s | 备份单个文件,-s 后面不能直接跟路径 |
使用限制:
- 只能备份己挂载的文件系统
- 必须使用root的权限才能操作
- 只能备份XFS文件系统
- 备份后的数据只能让
xfsrestore
解析 - 不能备份两个具有相同UUID的文件系统(可用
blkid
命令查看UUID)
安装xfsdump
查询系统是否安装xfsdump,若没有则yum安装
[root@host ~]# rpm -q xfsdump
xfsdump-3.1.7-1.el7.x86_64
模拟文件备份和恢复
使用fdisk创建分区/dev/sdb1,格式化xfs文件系统
[root@host ~]# fdisk /dev/sdb
[root@host ~]# mkfs -t xfs /dev/sdb1
[root@host ~]# mkdir /data
[root@host ~]# mount /dev/sdb1 /data/
[root@host ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 13M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda2 xfs 36G 4.7G 32G 14% /
tmpfs tmpfs 378M 8.0K 378M 1% /run/user/42
tmpfs tmpfs 378M 0 378M 0% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /mnt
/dev/sdb1 xfs 10G 33M 10G 1% /data
创建文件和目录,模拟环境
[root@host ~]# cp /etc/passwd /etc/shadow /data
[root@host ~]# cd /data/
[root@host data]# ls
passwd shadow
[root@host data]# echo a > a
[root@host data]# echo b > b
[root@host data]# echo c > c
[root@host data]# mkdir 123
[root@host data]# cp /etc/yum.repos.d/* 123/ -r
[root@host data]# ll -R
.:
总用量 20
drwxr-xr-x. 2 root root 220 4月 14 14:09 123
-rw-r--r--. 1 root root 2 4月 14 14:08 a
-rw-r--r--. 1 root root 2 4月 14 14:08 b
-rw-r--r--. 1 root root 2 4月 14 14:08 c
-rw-r--r--. 1 root root 2304 4月 14 14:08 passwd
----------. 1 root root 1263 4月 14 14:08 shadow
./123:
总用量 40
-rw-r--r--. 1 root root 1664 4月 14 14:09 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 4月 14 14:09 CentOS-CR.repo
-rw-r--r--. 1 root root 649 4月 14 14:09 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 314 4月 14 14:09 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 630 4月 14 14:09 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 4月 14 14:09 CentOS-Sources.repo
-rw-r--r--. 1 root root 8515 4月 14 14:09 CentOS-Vault.repo
-rw-r--r--. 1 root root 616 4月 14 14:09 CentOS-x86_64-kernel.repo
使用 xfsdump 命令备份整个分区
[root@host data]# cd /opt/
[root@host opt]# xfsdump -f /opt/dump_sdb1 /dev/sdb1 -L dump_sdb1 -M /dev/sdb1
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.7 (dump format 3.0) - type ^C for status and control
xfsdump: level 0 dump of host:/data
xfsdump: dump date: Fri Apr 14 14:19:04 2023
xfsdump: session id: ba3f1997-d7ab-4738-8655-b6ec91e49077
xfsdump: session label: "dump_sdb1"
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: 86720 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 53688 bytes
xfsdump: dump size (non-dir files) : 23456 bytes
xfsdump: dump complete: 0 seconds elapsed
xfsdump: Dump Summary:
xfsdump: stream 0 /opt/dump_sdb1 OK (success)
xfsdump: Dump Status: SUCCESS
xfsdump -f /opt/dump_sdb1 /dev/sdb1
后面没有-L和-M选项的话需要在命令行中手动输入标签和设备标签。
模拟数据丢失并使用 xfsrestore 命令恢复文件
[root@host opt]# cd /data
[root@host data]# ls
123 a b c passwd shadow
[root@host data]# rm -rf *
[root@host data]# ls
[root@host data]# cd /opt
[root@host opt]# ls
dump_sdb1 rh
//恢复文件
[root@host opt]# xfsrestore -f /opt/dump_sdb1 /data/
[root@host opt]# cd /data/
[root@host data]# ls
123 a b c passwd shadow
3.RPM包文件的备份和恢复
cpio
cpio 命令用于从归档包中存入和读取文件,换句话说,cpio 命令可以从归档包中提取文件(或目录),也可以将文件(或目录)复制到归档包中。
归档包,也可称为文件库,其实就是 cpio 或 tar 格式的文件,该文件中包含其他文件以及一些相关信息(文件名、访问权限等)。归档包既可以是磁盘中的文件,也可以是磁带或管道。
工作原理:
cpio 命令可以看做是备份或还原命令,因为它可以将数据(文件)备份到 cpio 归档库,也可以利用 cpio 文档库对数据进行恢复。
注意事项:
- 使用 cpio 备份数据时如果使用的是绝对路径,那么还原数据时会自动恢复到绝对路径下;同理,如果备份数据使用的是相对路径,那么数据会还原到相对路径下。
- cpio 命令无法自行指定备份(或还原)的文件,需要目标文件(或目录)的完整路径才能成功读取,因此此命令常与 find 命令配合使用。
- cpio 命令恢复数据时不会自动覆盖同名文件,也不会创建目录(直接解压到当前文件夹)。
基本模式:
(1)“-o” 模式:指的是 copy-out 模式,就是把数据备份到文件库中,命令格式如下:
[root@localhost ~]# cpio -o[vcB] > [文件丨设备]
各选项含义如下:
- -o:copy-out模式,备份;
- -v:显示备份过程;
- -c:使用较新的portable format存储方式;
- -B:设定输入/输出块为 5120Bytes,而不是模式的 512Bytes;
比如,使用 cpio 备份数据的命令如下:
[root@host ~]# find /opt -print | cpio -ocvB > /data/opt.cpio
/opt
/opt/rh
/opt/a
/opt/b
/opt/c
/opt/123
/opt/123/abc.txt
1 块
[root@host ~]# ll -h /data/opt.cpio
-rw-r--r--. 1 root root 5.0K 4月 14 14:40 /data/opt.cpio
(2)“-i” 模式:指的是 copy-in 模式,就是把数据从文件库中恢复,命令格式如下:
[root@localhost ~]# cpio -i[vcdu] < [文件|设备]
各选项的含义为:
- -i:copy-in 模式,还原;
- -v:显示还原过程;
- -c:较新的 portable format 存储方式;
- -d:还原时自动新建目录;
- -u:自动使用较新的文件覆盖较旧的文件;
比如,使用 cpio 恢复之前备份的数据,命令如下:
[root@host opt]# rm -rf *
[root@host opt]# ll
总用量 0
[root@host opt]# cd
[root@host ~]# cpio -iddcu < /data/opt.cpio
2 块
[root@host ~]# cd /opt/
[root@host opt]# ll
总用量 12
drwxr-xr-x. 2 root root 21 4月 14 14:43 123
-rw-r--r--. 1 root root 2 4月 14 14:43 a
-rw-r--r--. 1 root root 2 4月 14 14:43 b
-rw-r--r--. 1 root root 2 4月 14 14:43 c
drwxr-xr-x. 2 root root 6 4月 14 14:43 rh
(3)“-p” 模式:指的是复制模式,使用 -p 模式可以从某个目录读取所有文件,但并不将其备份到 cpio 库中,而是直接复制为其他文件。
例如,使用 -p 将 /boot/ 复制到 /test/boot 目录中可以执行如下命令:
[root@localhost ~]# cd /tmp/
//删除/tmp/目录中的所有数据
[root@localhost tmp]#rm -rf*
//建立备份目录
[root@localhost tmp]# mkdir test
//备份/boot/目录到/tmp/test/目录中
[root@localhost tmp]# find /boot/ -print | cpio -p /tmp/test
//在/tmp/test/目录中备份出了/boot/目录
[root@localhost tmp]# ls test/boot
四、日志文件
1.日志文件的概述
日志的功能
- 用于记录系统、程序运行中发生的各种事件
- 通过阅读日志,有助于诊断和解决系统故障。
- 此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹。
日志保存位置
- Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下。
主要日志文件介绍
日志文件名称 | 日志文件存放位置 | 介绍 |
---|---|---|
内核及公共消息日志 | /var/log/messages | 记录Linux内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。 |
计划任务日志 | /var/log/cron | 记录crond计划任务产生的事件信息 |
系统引导日志 | /var/log/dmesg | 记录Linux系统在引导过程中的各种事件信息 |
邮件系统日志 | /var/log/maillog | 记录进入或发出系统的电子邮件活动 |
用户登录日志 | /var/log/secure /var/log/lastlog /var/log/wtmp /var/run/btmp | 记录用户认证相关的安全事件信息。 记录每个用户最近的登录事件。二进制格式 记录每个用户登录、注销及系统启动和停机事件。二进制格式 记录失败的、错误的登录尝试及验证事件。二进制格式 |
2.日志文件的分类
- 内核及系统日志:由系统服务rsyslog统一进行管理,日志格式基本相似,其主配置文件
/etc/rsyslog.conf
[root@host log]# systemctl status rsyslog.service
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2023-04-04 20:58:30 CST; 1 weeks 2 days ago
Docs: man:rsyslogd(8)
http://www.rsyslog.com/doc/
Main PID: 1007 (rsyslogd)
Tasks: 3
CGroup: /system.slice/rsyslog.service
└─1007 /usr/sbin/rsyslogd -n
4月 04 20:58:30 host systemd[1]: Starting System Logging Service...
4月 04 20:58:30 host rsyslogd[1007]: [origin software="rsyslogd" swVersion="8.24.0-55.el7"...art
4月 04 20:58:30 host systemd[1]: Started System Logging Service.
Hint: Some lines were ellipsized, use -l to show in full.
- 用户日志:记录系统用户登录及退出系统的相关信息
- 程序日志:由各种应用程序独立管理的日志文件,记录格式不统一
3.日志文件的管理
内核及系统日志
内核及系统日志由系统服务 rsyslog 统一管理,主配置文件为/etc/rsyslog.conf
,软件包为rsyslog-7.4.7-16.el7.x86_64
,其主要程序为/sbin/rsyslogd
。
日志记录的一般格式
Mar 22 19:53:37 localhost kernel: Initializing cgroup subsys cpuset
第一字段:Mar 22 19:53:37
,时间标签。消息发出的日期和时间。
第二字段:localhost
,主机名。生成消息的计算机的名称。
第三字段: kernel
,子系统名。发出消息的应用程序的名称。
第四字段:Initializing cgroup subsys cpuset
,消息字段。消息的具体内容。
配置文件规则格式
//查看rsyslog.conf配置文件
vim /etc/rsyslog.conf
//规则配置格式:【设备.级别 动作】
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info
示info等级及以上的所有等级的信息都写到对应的日志文件里
mail.none
表示某事件的信息不写到日志文件里(这里比如是邮件)
日志消息的级别
级别 | 消息 | 级别 | 说明 |
---|---|---|---|
0 | EMERG | 紧急 | 会导致主机系统不可用的情况。如系统崩溃 |
1 | ALERT | 警告 | 必须马上采取措施解决的问题。如数据库被破坏 |
2 | CRIT | 严重 | 比较严重的情况。如硬盘错误,可能会阻碍程序的部分功能 |
3 | ERR | 错误 | 运行出现错误。不是非常紧急,尽快修复的 |
4 | WARNING | 提醒 | 可能影响系统功能,需要提醒用户的重要事件。不是错误,如磁盘用了85%等 |
5 | NOTICE | 注意 | 不会影响正常功能,但是需要注意的事件。无需处理 |
6 | INFO | 信息 | 一般信息。正常的系统信息 |
7 | DEBUG | 调试 | 程序或系统调试信息等。包含详细开发的信息,调试程序时使用 |
- | none | 没有优先级 | 不记录任何日志消息。 |
注意:数字等级越小,优先级越高,消息越重要
设备字段说明
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 | 用户进程 |
日志级别的定义方式
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中;“-”代表异步模式
用户日志
用户日志主要是保存用户登录、退出系统等相关信息。 /var/log/secure
日志文件可以直接查看,其余的都为二进制文件,不可以直接查看,需要相关工具的转换才能查看
分析工具
查询用户登录情况的命令分别是:users
、 who
、w
、last
、lastb
。
其中last
命令用于查询成功登录到系统的用户记录,lastb
命令用于查询登录失败的用户记录。
具体可以通过下面举例展示:
[root@host ~]# users
root root
[root@host ~]# who
root pts/0 2023-04-16 10:47 (192.168.223.1)
root :0 2023-04-04 20:59 (:0)
[root@host ~]# w
10:48:02 up 3:12, 2 users, load average: 0.15, 0.06, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.223.1 10:47 2.00s 0.05s 0.02s w
root :0 :0 044月23 ?xdm? 1:24 0.18s /usr/libexec/gnome-sess
[root@host ~]# last
root pts/0 192.168.223.1 Sun Apr 16 10:47 still logged in
root pts/2 192.168.223.1 Fri Apr 14 14:29 - 17:37 (03:07)
root pts/1 192.168.223.1 Fri Apr 7 20:28 - 16:40 (6+20:12)
root :0 :0 Tue Apr 4 20:59 still logged in
root pts/0 192.168.223.1 Tue Apr 4 20:58 - 16:38 (9+19:39)
reboot system boot 3.10.0-1160.el7. Tue Apr 4 20:58 - 10:48 (11+13:49)
root pts/0 192.168.223.1 Tue Apr 4 20:54 - crash (00:03)
root pts/1 192.168.223.1 Thu Mar 30 09:03 - crash (5+11:55)
root pts/0 :0 Thu Mar 30 09:00 - 09:03 (00:02)
root pts/0 :0 Thu Mar 30 09:00 - 09:00 (00:00)
root pts/0 :0 Wed Mar 22 19:57 - 19:58 (00:01)
root :0 :0 Wed Mar 22 19:57 - crash (13+01:01)
reboot system boot 3.10.0-1160.el7. Wed Mar 22 19:56 - 10:48 (24+14:51)
root pts/0 :0 Wed Mar 22 19:54 - 19:56 (00:01)
root pts/0 :0 Wed Mar 22 19:54 - 19:54 (00:00)
root :0 :0 Wed Mar 22 19:54 - crash (00:02)
reboot system boot 3.10.0-1160.el7. Wed Mar 22 19:53 - 10:48 (24+14:54)
wtmp begins Wed Mar 22 19:53:38 2023
[root@host ~]# lastb
root ssh:notty 192.168.223.1 Sun Apr 16 10:52 - 10:52 (00:00)
btmp begins Sun Apr 16 10:52:30 2023
程序日志
有些应用程序会选择由自己独立管理一份日志文件,用于记录本程序运行过程中的各种事件信息,而不是交给rsyslog服务管理。由于这些程序只负责管理自己的日志文件,因此不同程序所使用的日志记录格式可能会存在较大的差异。
日志的配置文件
- Web服务(这里以httpd服务为例)
保存位置:/var/log/httpd
记录客户访问事件:access_log
记录错误事件:error_log
- 代理服务(这里以squid服务为例)
保存位置:/var/log/squid/
记录客户访问事件:access.log
记录错误事件:cache.log
分析工具
查询程序日志的方式有以下几种:
- 在linux系统中可以通过
grep
、awk
和sed
文本三剑客来实现过滤
//查询并过滤出用户登录失败的情况,若出现多出相同ip地址,可认为主机被攻击了
[root@host log]# cat secure | grep 'Failed password'
Apr 16 10:52:30 host sshd[62769]: Failed password for root from 192.168.223.1 port 63727 ssh2
Apr 16 11:13:24 host sshd[63041]: Failed password for root from 192.168.223.1 port 64890 ssh2
- 可以通过专用日志分析工具Webalizer、Awstats查询日志
4.日志管理策略
及时做好备份和归档
可以用tar
、xfsdump
、cpio
、cp
等相关命令进行备份。
延长日志保存期限
可以用find命令定时删除日志
//查询日志文件中距今30天之前的日志并删除
[root@host ~]# find /var/log/ -mtime +30 -delete
控制日志访问权限
日志中可能包含各类敏感信息,如账户、口令等
chmod 400
集中管理日志
- 将服务器的日志文件发到统一的日志文件服务器
- 便于日志信息的统一收集
- 杜绝日志信息的意外丢失、恶意篡改或删除
配置日志服务器收集日志
日志收集的方式根据规模大小可以分为两种:小规模可以使用rsyslog
或者shell/python 脚本
;大规模可以使用ELK日志收集平台,搭建此平台制少需要3台以上的服务器。
这里主要介绍rsyslog
方式,rsyslog是一个C/S架构,可以通过套接字来进行监听记录工作,可以基于TCP和UDP工作,默认的监听端口是514,只需要在MODULES打开即可。
下面来使用一下这个rsyslog
方式:
比如有两个服务器作为发送服务器和收集服务器
发送服务器:客户端 192.168.80.20
收集服务器:服务端 192.168.80.30
关闭服务端和客户端防火墙、selinux
[root@host ~]# setenforce 0
[root@host ~]# systemctl stop firewalld
[root@host ~]# systemctl disable firewalld
修改客户端配置文件,并启动服务
[root@host ~]# vim /etc/rsyslog.conf
#### MODULES ####
//将下面四行前的注释取消掉,,设置支持UDP和TCP的端口号514
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
#### RULES ####
//添加下列内容定义相关规则
//通过变量的方式定义日志格式,myFormat指的是日志格式名称
$template myFormat, "%timestamp% %hostname% %syslogseverity-text% %syslogtag% %msg%\n"
//调用日志格式名称来调用日志格式
$ActionFileDefaultTemplate myFormat
//收集定义级别的日志发送给目标主机
*.info;mail.none;authpriv.none;cron.none @@192.168.80.30:514
//重新加载配置文件并启动服务
[root@host ~]# systemctl restart rsyslog
其中变量字段中各个字段含义
%timestamp%
:时间戳
%fromhost-ip%
:接收的信息来自于哪个节点的 IP
%hostname%
:主机名
%syslogseverity-text%
:日志等级
%syslogtag% :服务进程
%msg%
:日志内容
接收方的IP地址前面一个 @
表示 TCP 传输,两个@
即 @@
表示 UDP 传输。
修改服务端配置文件,并启动服务
[root@host ~]# vim /etc/rsyslog.conf
#### MODULES ####
//将下面四行前的注释取消掉,,设置支持UDP和TCP的端口号514
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
#### RULES ####
//添加下列内容定义相关规则
//定义允许192.168.80.0 网段内的主机以tcp协议来传输
$AllowedSender tcp, 192.168.80.0/24
//指定保存日志文件名的模板,定义发送主机的ip地址和日志发生时间用来区分了不同主机的日志
//通常日志文件路径为发送主机的ip地址/日志发生时间
$template Remote,"/data/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
//过滤掉 server 本机的日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
//重新加载配置文件并启动服务
[root@host ~]# systemctl restart rsyslog
在服务端创建/data/log目录,以接受大量日志信息,配置文件中的路径应当与该路径一致
[root@host ~]# mkdir -p /data/log
验证
#客户端的终端命令行输入或者重启一个服务
[root@host ~]# logger "hello world"
#在服务端查看日志文件
[root@host ~]# tree /data/log/
日志管理工具
centos7之前的操作系统,只能使用/var/log/messages
命令工具查看日志文件,但由于日志文件内容比较多,过滤较难,所以在centos7操作系统就开始使用journalctl 日志管理工具。
journalctl工具是从message
这个文件里读取信息。Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl
一个命令,查看所有日志(内核日志和应用日志)。journalctl日志的配置文件是/etc/systemd/journald.conf
,默认不修改。
journalctl工具常用命令使用方式:
查看所有日志(默认情况下,只保存本次启动的日志)
[root@host ~]# journalctl
[root@host ~]# journalctl -r #-r表示倒序,从尾部看(推荐)
查看内核日志(不显示应用日志)
[root@host ~]# journalctl -k
查看系统本次启动的日志
-b默认为-0,-0为本次启动
journalctl -b [-0]
查看上一次启动的日志(需更改设置,如上次系统崩溃,需要查看日志时,就要看上一次的启动日志)
[root@host ~]# journalctl -b -1
显示尾部指定行数的日志
查看的是/var/log/messages的日志,但是格式上有所调整,如主机名格式不一样而已
其中-f选项表示实时跟踪
[root@host ~]# journalctl -n 20 [-f]
查看某个服务的日志
其中-f选项表示实时跟踪
[root@host ~]# journalctl -u httpd [-f]
查看指定进程的日志
PID为大写字母
[root@host ~]# journalctl _PID=1
查看指定用户的日志
journalctl _UID=0
查看指定今天的日志,其中since后面可以加时间表示某个时间的日志
如–since "2023-04-16 12:00:00"会查询2023/4/16这天12点到1点这个时间段的日志
journalctl --since today
查询启动失败的日志,通常服务器启动失败会提示xe
journalctl -xe
# -x 是目录(catalog)的意思,在报错的信息下会,附加解决问题的网址
#-e pager-end 从末尾开始看