【Linux】文件系统与日志分析


一、文件系统的基本概念

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.硬盘分区后的结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ada0DVuI-1681620845595)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230413160941714.png)]

由上图可知:

  元信息是存储在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。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X4sBgzNG-1681620845596)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230413161823345.png)]

  每个inode都有一个对应的数字,操作系统用inode号来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于用户来说,一般都是通过文件名来查找文件,但文件名只是inode号码便于识别的别称。

5.访问文件的简单流程

  当用户在Linux系统中想要访问一个文件时会查找它的文件名,系统会先根据文件名去查找它对应的inode号码。通过inode号码,获取inode信息。根据inode信息,判断该用户是否具有访问这个文件的权限,如果有,就指向相对应的数据block,并读取数据;如果没有就输出控制台”权限不够“。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lxAvNDNh-1681620845596)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230413161959693.png)]

[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表示某事件的信息不写到日志文件里(这里比如是邮件)

日志消息的级别

级别消息级别说明
0EMERG紧急会导致主机系统不可用的情况。如系统崩溃
1ALERT警告必须马上采取措施解决的问题。如数据库被破坏
2CRIT严重比较严重的情况。如硬盘错误,可能会阻碍程序的部分功能
3ERR错误运行出现错误。不是非常紧急,尽快修复的
4WARNING提醒可能影响系统功能,需要提醒用户的重要事件。不是错误,如磁盘用了85%等
5NOTICE注意不会影响正常功能,但是需要注意的事件。无需处理
6INFO信息一般信息。正常的系统信息
7DEBUG调试程序或系统调试信息等。包含详细开发的信息,调试程序时使用
-none没有优先级不记录任何日志消息。

注意:数字等级越小,优先级越高,消息越重要

设备字段说明

auth用户认证时产生的日志
authprivssh、ftp等登录信息的验证信息
daemon一些守护进程产生的日志
ftpFTP产生的日志
lpr打印相关活动
markrsyslog服务内部的信息,时间标识
news网络新闻传输协议(nntp)产生的消息
syslog系统日志
uucpUnix-to-Unix Copy 两个unix之间的相关通信
console针对系统控制台的消息
cron系统执行定时任务产生的日志
kern系统内核日志
local0~local7自定义程序使用
mail邮件日志
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日志文件可以直接查看,其余的都为二进制文件,不可以直接查看,需要相关工具的转换才能查看

分析工具

  查询用户登录情况的命令分别是:userswhowlastlastb

  其中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系统中可以通过grepawksed文本三剑客来实现过滤
//查询并过滤出用户登录失败的情况,若出现多出相同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.日志管理策略

及时做好备份和归档

  可以用tarxfsdumpcpiocp等相关命令进行备份。

延长日志保存期限

  可以用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 从末尾开始看
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的宝贝大唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值