欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Linux 文件和文件系统压缩

最编程 2024-07-14 13:56:12
...

文章目录

  • Linux文件与文件系统的压缩
    • Linux系统常见的压缩命令
      • gzip,zcat/zmore/zless/zgrep
      • bzip2,bzcat/bzmore/bzless/bzgrepp
      • xz,xzcat/xzmore/xzless/xzgrep
      • gzip,bzip2,xz压缩时间对比
      • 打包命令:tar
      • 打包命令:zip、unzip
    • Linux XFS文件系统的备份与还原
      • XFS文件系统备份xfsdump
      • XFS文件系统还原xfsrestore
    • 光盘写入工具
      • mkisofs:建立镜像文件
    • 其他常见的压缩与备份工具
      • dd
      • cpio

Linux文件与文件系统的压缩

压缩文件是一种将文件或目录通过减少其占用的存储空间来减小文件大小的过程。压缩文件的主要目的之一是节省存储空间。通过压缩文件,可以将文件占用的磁盘空间减少到较小的大小,从而在存储设备上容纳更多的文件

Linux系统常见的压缩命令

在Linux的环境中,压缩文件的扩展名大多是: tar、tar.gz、*tgz、*gz、 *.Z 、 *.bz2、 *.xz。

这是因为Linux支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,彼此之间可能就无法互通压缩/解压缩文件。所以,当你要下载某个压缩文件时,自然就需要知道该文件是由哪中压缩命令所制作出来的,好用来对照着解压缩,下面我们就列出了几个常见的压缩文件扩展名

*.Z         compress程序压缩的文件
*.zip       zip程序压缩的文件
*.gz        gzip程序压缩的文件
*.bz2       bzip2程序压缩的文件
*xz         xz程序压缩的文件
*.tar       tar程序打包的文件,并没有压缩过
*.tar.gz    tar程序打包的文件,并且经过gzip的压缩
*.tar.bz2   tar程序打包的文件,并且经过bzip2的压缩
*.tar.xz    tar程序打包的文件,并且经过xz的压缩

gzip,zcat/zmore/zless/zgrep

gzip可以说是应用最广泛的压缩命令了,gzip所建立的压缩文件为*.gz,命令语法如下

[root@chenshiren ~]# gzip [选项] 文件名
[root@chenshiren ~]# zcat 文件名.gz
选项 作用
-c 把压缩文件的数据输入到屏幕上
-d 解压缩文件
-t 可以校验压缩文件的一致性,看看文件是否有误
-v 可以显示源文件/压缩文件的等比信息
-# # 为数字,代表压缩等级,-1最快,但是压缩比最差
-9最慢,但是压缩比最好
默认是-6
# 示例1 找出/etc/下面(不含子目录)容量最大的文件,并把它复制到/tmp,然后以gzip压缩
[root@chenshiren ~]# ls -ldSrh /etc/*
...
...
-rw-r--r--.  1 root root     29K  810  2021 /etc/brltty.conf
-rw-r--r--.  1 root root     39K  34 22:41 /etc/ld.so.cache
-rw-r--r--.  1 root root     66K  422  2020 /etc/mime.types
-rw-r--r--.  1 root root    677K  623  2020 /etc/services
[root@chenshiren ~]# cd /tmp/
[root@chenshiren tmp]# cp  /etc/services .
[root@chenshiren tmp]# gzip -v services 
services:        79.4% -- replaced with services.gz
[root@chenshiren tmp]# ll -h /etc/services  /tmp/services.gz 
-rw-r--r--. 1 root root 677K  623  2020 /etc/services
-rw-r--r--. 1 root root 140K  36 21:13 /tmp/services.gz
# 当使用gzip压缩时,默认的状态下原本的文件会被压缩成为.gz后缀的文件,源文件就不再存在了

# 示例2 由于services是文本文件,将示例1的压缩文件的内容读出来
[root@chenshiren tmp]# zcat services.gz 
# 由于services.gz原本是文本文件,因此可以尝试使用zcat/zmore/zless去读取
# 此时屏幕会显示services.gz解压缩之后的原始文件内容

# 示例3 将示例1的文件解压缩
[root@chenshiren tmp]# gzip -d services.gz 
# 与gzip相反,gzip -d会将原本的.gz删除,恢复原本的services文件

# 示例4 将示例3解开的services用最佳的压缩比压缩,并保留原本的文件
[root@chenshiren tmp]# gzip -9 -c services > services.gz
[root@chenshiren tmp]# ll services services.gz 
-rw-r--r--. 1 root root 692252  36 21:13 services
-rw-r--r--. 1 root root 141945  36 21:28 services.gz

# 示例5 由示例4建立的services.gz 中,找出http这个关键字在哪几行
[root@chenshiren tmp]# zgrep -n 'http' services.gz 
....
87:http            80/tcp          www www-http    # WorldWideWeb HTTP
88:http            80/udp          www www-http    # HyperText Transfer Protocol
....

gzip这个压缩命令主要想要用来替换compress,所以不但compress的压缩文件可以使用gzip来解开,同时zcat这个命令可以读取compress与gzip的压缩文件

bzip2,bzcat/bzmore/bzless/bzgrepp

bzip2则是为了替换gzip并提供更佳的压缩比而来,bzip2甚至要比gzip还要好,bzip2的用法和gzip几乎相同

[root@chenshiren ~]# bzip2 [选项] 文件名
[root@chenshiren ~]# bzcat 文件名.bz2
选项 作用
-c 把压缩文件的数据输入到屏幕上
-d 解压缩文件
-k 保留原始文件,而不会删除原始的文件
-z 压缩的参数(默认值,可以不加)
-v 可以显示源文件/压缩文件的等比信息
-# 与gzip同样,都是计算压缩比的参数,-9最佳,-1最快
# 示例1 将刚刚gzip示例留下来的/tmp/services以bzip2压缩
[root@chenshiren tmp]# bzip2 -v services
  services:  5.353:1,  1.495 bits/byte, 81.32% saved, 692252 in, 129328 out.
[root@chenshiren tmp]# ll -h services.gz  services.bz2 
-rw-r--r--. 1 root root 127K  36 21:13 services.bz2
-rw-r--r--. 1 root root 139K  36 21:29 services.gz
# 可以发现bzip的压缩比 要比gzip好
# 压缩率从之前的79%提升到了81%

# 示例2 将示例1的文件内容读出来
[root@chenshiren tmp]# bzcat services.bz2 

# 示例3 将示例1的文件解压缩
[root@chenshiren tmp]# bzip2 -d services.bz2 

# 将示例3解开的services用最佳的压缩比压缩,并保留原本的文件
[root@chenshiren tmp]# bzip2 -9 -c services > services.bz2

对于大容量文件来说,bzip2压缩时间会更久一点,至少比gzip要久的多

xz,xzcat/xzmore/xzless/xzgrep

虽然说bzip2已经具有很棒的压缩比,不过显然某些*软件开发者还不满足,因此后来还推出了xz这个压缩比更高的软件,这个软件的用法也跟gzip/bzip2几乎一模一样

[root@chenshiren ~]# xz [选项] 文件名
选项 作用
-d 解压缩文件
-t 测试文件的完整性
-l 列出压缩文件的相关信息
-k 保留原本的文件不删除
-v 显示压缩或解压缩的信息
-c 和之前两个解压缩命令一样,就是将数据在屏幕上输出
-# 指定压缩级别,-1 到 -9 指定压缩级别,数字越大,压缩比越高
# 示例1 将刚刚bzip所留下来的/tmp/services 通过xz来压缩
[root@chenshiren tmp]# xz -v services
services (1/1)
  100 %       103.4 KiB / 676.0 KiB = 0.153 
[root@chenshiren tmp]# ll -h services.gz services.bz2 services.xz 
-rw-r--r--. 1 root root 127K  36 22:35 services.bz2
-rw-r--r--. 1 root root 139K  36 21:29 services.gz
-rw-r--r--. 1 root root 104K  36 21:13 services.xz
# 可以看到容量进一步的下降,压缩比很高

# 示例2 列出这个压缩文件的信息,然后读出这个压缩文件的内容
[root@chenshiren tmp]# xz -l services.xz 
   流      块     压缩大小     解压大小   比例  校验    文件名
    1       1    103.4 KiB    676.0 KiB  0.153  CRC64   services.xz 
    # 可以看到压缩前后的容量
[root@chenshiren tmp]# xzcat services.xz 

# 示例3 解压缩
[root@chenshiren tmp]# xz -d services.xz 

# 示例4 保留原文件的文件名,并建立压缩文件
[root@chenshiren tmp]# xz -k services
[root@chenshiren tmp]# ll -hS services services.gz services.bz2 services.xz  
-rw-r--r--. 1 root root 677K  36 21:13 services
-rw-r--r--. 1 root root 139K  36 21:29 services.gz
-rw-r--r--. 1 root root 127K  36 22:35 services.bz2
-rw-r--r--. 1 root root 104K  36 21:13 services.xz

xz虽然压缩比优化了很多,但是运算时间比gzip,bzip2久

gzip,bzip2,xz压缩时间对比

[root@chenshiren tmp]# time gzip -c services > services.gz
real    0m0.014s
user    0m0.005s
sys     0m0.008s

[root@chenshiren tmp]# time bzip2 -c services > services.bz
real    0m0.023s
user    0m0.019s
sys     0m0.004s

[root@chenshiren tmp]# time xz -c services > services.xz
real    0m0.133s
user    0m0.117s
sys     0m0.015s

# real:表示从命令开始执行到执行结束的实际时间,单位是分钟(m)和秒(s)
# user:命令的用户运行时间(user)
# sys:系统运行时间(sys)

可以看到gzip压缩时间 要比 xz快10倍

在选择上如果你并不觉得时间是你的成本考虑,那么使用xz会比较好

如果时间是你的重要成本,那么gzip比较适合

打包命令:tar

tar是一个常用的Linux打包命令,可以将多个文件或目录打包成一个文件。tar本身不进行压缩,但可以配合gzip、bzip2等工具进行压缩,接下来我们来看看他的语法

[root@chenshiren ~]# tar  [选项] 文件名
选项 作用
-c 新建打包文件
-t 查看打包文件的内容含有哪些文件名
-x 解包或解压缩的功能,可以搭配-C(大写)在特定目录解压
-z 使用gzip进行压缩/解压缩,时文件名最好为:*.tar.gz
-j 使用bzip2进行压缩/解压缩,此时文件名最好为:*.tar.bz2
-J 使用xz进行压缩/解压缩,此时文件名最好为:*.tar.xz
-v 显示打包过程
-C 这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项
-f 指定打包后的文件名
-p(小写) 保留备份数据的原本权限与属性,常用于备份重要的配置文件
-p(大写) 保留绝对路径,就是允许备份数据中含有根目录存在的意思
–exclude=File 要排除打包的文件名或目录名

其实最简单的使用tar就只用记住下面的命令即可:

压缩:  tar -jcv  file.tar.bz2  [要被压缩的文件名字或者目录名称]
查询:  tar -jtv  file.tar.bz2
解压缩:tar -jxv  file.tar.bz2 -C [指定解压到的哪个目录]

file.tar.bz2 是自己取的文件名,tar并不会主动创建文件名,需要我们自定义,
所以扩展名就显得很重要了,如果不加[-z][-j][-J]的话,文件名最好取为 *.tar即可。
如果是 -j选项,代表bzip2的支持,因此文件名最好取为*.tar.bz2,
因为bzip2会产生.bz2的扩展名,至于如果是加上了-z的gzip的支持,那文件名最好为*.tar.gz

然后使用time查看-z ,-j,-J,哪个打包时间最长,哪个时间最短

[root@chenshiren ~]# time tar -jpcv -f etc.tar.bz2 /etc
tar: 从成员名中删除开头的“/”
...
...
real    0m1.325s
user    0m1.081s
sys     0m0.283s

[root@chenshiren ~]# time tar -zpcv -f etc1.tar.gz /etc
tar: 从成员名中删除开头的“/”
...
...
real    0m0.602s
user    0m0.112s
sys     0m0.557s

[root@chenshiren ~]#  time tar -Jpcv -f etc2.tar.xz /etc
tar: 从成员名中删除开头的“/”
...
...
real    0m6.819s
user    0m2.719s
sys     0m4.179s

我们使用du -h 目录来查看他们创建的压缩文件所占用大小
[root@chenshiren ~]# du -h etc*
9.2M    etc1.tar.gz
7.4M    etc2.tar.xz
8.4M    etc.tar.bz2

# 可以看出压缩比越好当然花费的时间越长,虽然gzip速度块,总时间不到1秒,但是压缩率糟糕
# 使用xz的话,虽然压缩比最佳,不过要花6秒,还是仅仅备份7MB的文件
# 如果要备份很大的话要考虑一下时间成本
# tar: 从成员名中删除开头的“/” 
# 如果没有去掉根目录,解压缩后的文件名就会是绝对路径
# 即解压缩后的数据一定会被放置到/etc/xxx去,你原本的/etc/下面的数据就会被覆盖

查看tar文件的数据内容(可查看文件名)

[root@localhost ~]# tar -jvt -f etc.tar.bz2 
....
....
drwxr-xr-x root/root         0 2023-04-06 15:25 etc/libreport/
drwxr-xr-x root/root         0 2020-04-02 21:38 etc/libreport/events/
drwxr-xr-x root/root         0 2023-04-06 15:25 etc/libreport/events.d/
-rw-r--r-- root/root       157 2022-02-24 01:09 etc/libreport/events.d/mdadm_
# 加上-v的选项,详细的文件权限/属性都会被列出来。如果只想知道文件名可以把-v去掉

如果需要备份根目录到tar的文件中,可以使用-P(大写)这个选项

[root@chenshiren ~]# tar -jcvpP -f etc.and.root.tar.bz2 /etc
[root@chenshiren ~]# tar -jtf /root/etc.and.root.tar.bz2 
# 加上-P参数文件名内的根目录就会存在

将备份数据解压缩,并考虑特定目录的解压缩操作(-C选项的应用)

[root@chenshiren ~]# tar -jxv -f etc.tar.bz2 
[root@chenshiren ~]# ll -d /etc/
drwxr-xr-x. 133 root root 8192  36 18:04 /etc/
# 如果不加-C 会在当前目录解压缩
[root@chenshiren ~]# tar -jxv -f etc.tar.bz2 -C /tmp/
[root@chenshiren ~]# ll -d  etc /tmp/etc/
drwxr-xr-x. 133 root root 8192  36 18:04 etc
drwxr-xr-x. 133 root root 8192  36 18:04 /tmp/etc/
# 加上-C会在你指定的目录解压缩

仅解开单一文件的方法

如果只想要解开文件内其中一个文件,只要使用【-jtv】找到你要的文件名,然后将该文件名解开即可

[root@chenshiren ~]# tar -jtv -f etc.tar.bz2 |grep 'passwd'
-rw-r--r-- root/root      2187 2024-02-27 23:28 etc/passwd  # 这个就是我要找的文件
-rw-r--r-- root/root       168 2021-08-10 23:53 etc/pam.d/passwd
-rw-r--r-- root/root      2150 2024-02-26 00:07 etc/passwd-
-rw------- root/root         0 2022-11-29 20:35 etc/security/opasswd
[root@chenshiren ~]# tar -jxv -f etc.tar.bz2  etc/passwd
etc/passwd
[root@chenshiren ~]# ll etc
-rw-r--r--. 1 root root 2187  227 23:28 passwd
# 此时只会解开一个文件

打包某目录,但不含该目录下的某些文件

假设我们要打包 /etc/yum 这几个目录,但却不想要打包 /etc/yum/vars 和 /etc/yum/version-groups.conf文件,而且假设这个新的打包文件为 yum.tar.bz2 ,此时我们可以通过 --exclude的帮忙。这个exclude就是不包含的意思

[root@localhost ~]# tar -jcv  -f yum.tar.bz2 --exclude=/etc/yum/vars  --exclude=/etc/yum/version-groups.conf   /etc/yum/
tar: 从成员名中删除开头的“/”
/etc/yum/
/etc/yum/protected.d/
/etc/yum/protected.d/systemd.conf
/etc/yum/pluginconf.d/
/etc/yum/pluginconf.d/fastestmirror.conf
/etc/yum/pluginconf.d/langpacks.conf
/etc/yum/fssnap.d/

仅备份比某个时刻还要新的内容

可以使用【–newer】【–never-mtime】

【–newer】表示后续的日期包含mtime与ctime

【–newer-mtime】表示仅有mtime

# 1.先用find找到比/etc/passwd还要新的文件
[root@chenshiren ~]# find /etc  -newer /etc/passwd  
....
...
[root@chenshiren ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2187  227 23:28 /etc/passwd
# 2.使用tar打包
[root@chenshiren ~]# tar -jcvp -f etc.newer.passwd.tar.bz2 --newer-mtime="2024/02/27" /etc/*
# 3.显示文件
[root@chenshiren ~]# tar -jt -f etc.newer.passwd.tar.bz2 |grep -v '/$'

特殊应用:利用管道命令与数据流

通过标准输入输出的数据流重定向,以及管道命令的方式,将待处理的文件一边打包一边解压缩到目标目录

# 将 /etc 整个目录一边打包一边在/tmp 解开
[root@chenshiren tmp]# cd /tmp/
[root@chenshiren tmp]# tar -cvf - /etc | tar xvf -
# - 表示被打包的文件

打包命令:zip、unzip

zip可以将多个文件或目录打包成一个zip文件

zip [选项] [压缩文件名] [文件或目录名]

选项:
-r:递归压缩子目录中的文件。
-q:安静模式,不输出任何消息。
-m:压缩后删除原文件。
-j:仅压缩文件,不包括目录。
-u:更新压缩文件,仅添加新文件和已修改的

zip命令的使用实例

将文件或目录压缩成zip文件:

zip -r compressed.zip directory/  csq/

# 这个命令将目录"directory/" 和 “csq”及其所有子目录和文件压缩成一个名为"compressed.zip"的zip文件。

添加文件到已有的zip文件:

zip -u compressed.zip file.txt

# 这个命令将文件"file.txt"添加到名为"compressed.zip"的zip文件中。

unzip

unzip命令可以将zip格式的文件解压缩到指定的目录中,或者将其解压缩到当前目录下。下面详细介绍一下unzip命令的使用方法。

unzip命令的基本语法如下:

unzip [选项] 文件名.zip [-d 目标目录]

选项:

-q:安静模式,不输出任何信息。
-o:覆盖已有的文件。
-j:只解压缩文件,不创建目录。
-d 目标目录:指定解压缩后的文件存放的目录,默认为当前目录。

unzip命令的使用示例

  1. 将文件file.zip解压缩到当前目录:
unzip file.zip
  1. 将文件file.zip解压缩到目录/home/user/下:
unzip file.zip -d /home/user/
  1. 只解压缩文件file.zip中的所有txt文件,并将其解压缩到当前目录:
unzip file.zip '*.txt'
  1. 将文件file.zip解压缩到目录/home/user/下,并覆盖已有的文件:
unzip -o file.zip -d /home/user/

Linux XFS文件系统的备份与还原

tar通常用于针对目录树系统来进行备份工作,如果要针对整个文件系统来进行备份,可以使用xfsdump和xfsrestore

XFS文件系统备份xfsdump

其实xfsdump的功能强大,他除了可以进行文件系统完整备份之外,还可以进行增量备份。增量备份可以这样理解:假设你的/home是独立的一个文件系统,那你在第一次使用xfsdump进行完整备份后,等过一段时间的文件系统自然运行后,你再进行第二次xfsdump时,就可以选择增量备份了。此时新备份的数据只会记录与第一次完整备份所有差异的文件而已,如下图

image-20240308134809632

上方的文件系统是一直随着时间变化的数据,例如在/home里面的文件数据会一直变化一样。而下面的方块则是xfsdump备份起来的数据,

第一次备份一定是完整备份,完整备份在xfsdump当中帝国以为level 0

第二次备份时,/home文件系统内的数据已经与level 0 不一样了,而level 1 仅只是比较目前的文件系统与level 0之间的差异后,备份有变化的文件。至于各个level的记录文件则放置于/var/lib/xfsdump/inventory中

使用xfsdump,注意以下的限制:

  • xfsdump 不支持没有挂载的文件系统备份,所以只能备份已挂载的文件系统
  • xfsdump 必须使用root的权限才能操作(涉及文件系统的关系)
  • xfsdump 只能备份xfs文件系统
  • xfsdump 备份下来的数据(文件或储存媒介)只能让xfsrestore解析
  • xfsdump 是通过文件系统的UUID来辨别各备份文件,因此不能备份两个具有相同UUID的文件系统
[root@chenshiren ~]# xfsdump [-L label] [-M M_label] [-l #] [-E 备份文件] 待备份数据
[root@chenshiren ~]# xfsdump -I

选项:
-L :xfsdump会记录每次备份的session标头,这里可以填写针对此文件系统的简易说明
-M :xfsdump可以记录存储媒介的标头,这里可以填写此媒介的简易说明
-l :是L的小写,是指定等级,总共有0~9共10个等级(默认为0,即完整备份)
-f :指定备份输出文件的名称
-I 从/var/lib/xfsdump/inventory列出目前备份的信息状态

# xfsdump默认仅支持文件系统的备份,并不支持特定目录的备份
# 所以你不能用xfsdump去备份/etc/,因此/etc从来就不是一个独立的文件系统

xfsdump备份完整的文件系统

假设你在/boot划分出自己的文件系统,要整个文件系统备份可以这样:

  1. 先确定/boot是独立的文件系统
[root@chenshiren ~]#  df -h /boot/
文件系统        容量  已用  可用 已用% 挂载点
/dev/nvme0n1p3 1014M  257M  758M   26% /boot
#独立的文件系统,/boot是挂载点
  1. 将完整备份的文件名记录成为/srv/boot.dump
[root@chenshiren ~]# xfsdump -l 0 -L boot_level_0 -M boot_level_0 -f /srv/boot.dump /boot                  
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsdump: level 0 dump of chenshiren:/boot       # 开始备份/boot
xfsdump: dump date: Fri Mar  8 14:05:24 2024    # 备份时间
xfsdump: session id: 1dcbb5da-16b7-46cd-9382-f091319e39b7  # dump ID
xfsdump: session label: "boot_level_0"        # 这是我们指定的备份名称
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: 227974080 bytes   # 估计的备份大小
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 227666808 bytes
xfsdump: dump size (non-dir files) : 227412568 bytes
xfsdump: dump complete: 1 seconds elapsed
xfsdump: Dump Summary:    # 备份概况
xfsdump:   stream 0 /srv/boot.dump OK (success) # 完整备份到/srv/boot.dump文件
xfsdump: Dump Status: SUCCESS  # 备份成功
# 在命令的执行方面,你也可以不加-L和-M,只是那就会进入交互模式,要求你回车

[root@chenshiren ~]# du -hs /boot /srv/boot.dump   # 完整备份
218M    /boot
218M    /srv/boot.dump

[root@chenshiren ~]# ll /var/lib/xfsdump/inventory/
总用量 16
-rw-r--r--. 1 root root 5080  38 14:05 53a83d30-6422-4f3e-ada8-af21893df883.StObj
-rw-r--r--. 1 root root  312  38 14:05 a0af4b7c-a869-4878-af70-40226ede5b91.InvIndex
-rw-r--r--. 1 root root  576  38 14:05 fstab
# 使用了xfsdump之后才会有上述/var/lib/xfsdump/inventory内的文件产生

[root@chenshiren ~]# xfsdump -I  # 列出目前备份的信息
file system 0:
        fs id:          a0af4b7c-a869-4878-af70-40226ede5b91 # 文件系统ID
        session 0:
                mount point:    chenshiren:/boot    # 文件系统挂载点
                device:         chenshiren:/dev/nvme0n1p3 # 文件系统所在设备
                time:           Fri Mar  8 14:05:24 2024 # 备份操作时间
                session label:  "boot_level_0"  # 使用-L指定的标签 用于辨别等级
                session id:     1dcbb5da-16b7-46cd-9382-f091319e39b7 # dump ID
                level:          0  # 备份级别0:完整备份
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot.dump # 备份文件的路径
                        start:          ino 133 offset 0
                        end:            ino 1573039 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     227666808
                                mfile start:    ino 133 offset 0
                                mfile end:      ino 1573039 offset 0
                                media label:    "boot_level_0"
                                media id:       2ac93526-f9d7-4a93-9325-ef1bb5d94f36
xfsdump: Dump Status: SUCCESS  # 备份状态成功

xfsdump进行增量备份

一定要记住进行过完整备份后【-l 0】才能够继续由其他增量备份【-l 1~9】的能力,所以得确定上面的实践已经完成才行,接下里进行增量备份功能

  1. 我们可以先建立一个大小约为10M的文件在/boot内
[root@chenshiren ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB,10 MiB)已复制,0.00204876 s,5.1 GB/s
[root@chenshiren ~]# ll /boot/testing.img 
-rw-r--r--. 1 root root 10485760  38 14:24 /boot/testing.img
  1. 开始建立差异备份文件,此时我们使用level 1
[root@chenshiren ~]# xfsdump -l 1 -L boot_level_1 -M boot_level_1 -f /srv/boot_level_1.dump /boot
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsdump: level 1 incremental dump of chenshiren:/boot based on level 0 dump begun Fri Mar  8 14:05:24 2024
xfsdump: dump date: Fri Mar  8 14:27:01 2024
xfsdump: session id: e257e756-0414-4cc7-a7ff-026476f08a50
xfsdump: session label: "boot_level_1"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: pruning unneeded subtrees
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 10506880 bytes
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 10510952 bytes
xfsdump: dump size (non-dir files) : 10488360 bytes
xfsdump: dump complete: 1 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /srv/boot_level_1.dump OK (success)
xfsdump: Dump Status: SUCCESS
[root@chenshiren ~]# ll /boot/testing.img  /srv/boot_level_1.dump 
-rw-r--r--. 1 root root 10485760  38 14:24 /boot/testing.img
-rw-r--r--. 1 root root 10510952  38 14:27 /srv/boot_level_1.dump
# 看文件大小就是备份的刚刚创建的文件
  1. 最后再看看是否记录了 level 1备份的时间点
[root@chenshiren ~]# xfsdump -I
file system 0:
        fs id:          a0af4b7c-a869-4878-af70-40226ede5b91
        session 0:
                mount point:    chenshiren:/boot
                device:         chenshiren:/dev/nvme0n1p3
                time:           Fri Mar  8 14:05:24 2024
                session label:  "boot_level_0"
                session id:     1dcbb5da-16b7-46cd-9382-f091319e39b7
                level:          0
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot.dump
                        start:          ino 133 offset 0
                        end:            ino 1573039 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     227666808
                                mfile start:    ino 133 offset 0
                                mfile end:      ino 1573039 offset 0
                                media label:    "boot_level_0"
                                media id:       2ac93526-f9d7-4a93-9325-ef1bb5d94f36
        session 1:
                mount point:    chenshiren:/boot
                device:         chenshiren:/dev/nvme0n1p3
                time:           Fri Mar  8 14:27:01 2024
                session label:  "boot_level_1"
                session id:     e257e756-0414-4cc7-a7ff-026476f08a50
                level:          1
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot_level_1.dump
                        start:          ino 143 offset 0
                        end:            ino 144 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     10510952
                                mfile start:    ino 143 offset 0
                                mfile end:      ino 144 offset 0
                                media label:    "boot_level_1"
                                media id:       3ae514c9-395a-46ae-ab11-94cd0460e0ca
xfsdump: Dump Status: SUCCESS

XFS文件系统还原xfsrestore

xfsdump的恢复使用的是xfsrestore这个命令,这个命令的选项也非常多,可以自行查看,在这里简单的介绍一下

[root@localhost ~]# xfsrestore -I        # 查看备份文件
xfsrestore [ -f 备份文件]  [ -L label ] [ -s ] 待恢复目录    <==单一文件全系统恢复
xfsrestore [ -f 备份文件]  -r 待恢复目录      # 通过增量备份文件来恢复系统
xfsrestore [ -f 备份文件]  -i 待恢复目录      # 进入交互模式

选项:
-I  :跟xfsdump相同的输出,可查询备份数据,包括Label名称与备份时间等
-f  :指定备份数据的存储位置
-L  :就是session的Label name,可以用 -I查询到
-s  :需要接某特定目录,就是仅恢复某一个文件或目录的意思
-r  :如果用文件来存储备份数据,则不需要使用,如果是一个磁带内有多个文件,
      需要此选项来完成累计恢复
-i  :进入交互模式,高级管理员使用的,一般不需要操作他

用xfsrestore观察和xfsdump后的备份数据内容

要找出xfsdump内容就使用xfsrestore -I 来查看即可,不需要加任何参数,因为xfsdump与xfsrestore 都会到 /var/lib/xfsdumop/inventory/ 里面去取数据来显示,因此两者输出是相同的

[root@chenshiren ~]# xfsrestore -I
file system 0:
        fs id:          a0af4b7c-a869-4878-af70-40226ede5b91
        session 0:
                mount point:    chenshiren:/boot
                device:         chenshiren:/dev/nvme0n1p3
                time:           Fri Mar  8 14:05:24 2024
                session label:  "boot_level_0"
                session id:     1dcbb5da-16b7-46cd-9382-f091319e39b7
                level:          0
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot.dump
                        start:          ino 133 offset 0
                        end:            ino 1573039 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     227666808
                                mfile start:    ino 133 offset 0
                                mfile end:      ino 1573039 offset 0
                                media label:    "boot_level_0"
                                media id:       2ac93526-f9d7-4a93-9325-ef1bb5d94f36
        session 1:
                mount point:    chenshiren:/boot
                device:         chenshiren:/dev/nvme0n1p3
                time:           Fri Mar  8 14:27:01 2024
                session label:  "boot_level_1"
                session id:     e257e756-0414-4cc7-a7ff-026476f08a50
                level:          1
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot_level_1.dump
                        start:          ino 143 offset 0
                        end:            ino 144 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     10510952
                                mfile start:    ino 143 offset 0
                                mfile end:      ino 144 offset 0
                                media label:    "boot_level_1"
                                media id:       3ae514c9-395a-46ae-ab11-94cd0460e0ca
xfsrestore: Restore Status: SUCCESS
# 重要的就是那个session label

恢复level 0 的文件系统

先来处理一个简单的任务,就是让/boot整个恢复到最原本的状态,你该如何处理呢?其实很简单,我们只要知道想要被恢复的那个文件,以及该文件的session label name 就可以恢复,我们从上面观察已经知道了 level 0 的 session label 是【boot_level_0】 那整个流程是这样的

  1. 将完整备份覆盖回去
[root@chenshiren ~]# xfsrestore -f /srv/boot.dump -L boot_level_0  /boot   
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: examining media file 0
xfsrestore: reading directories
xfsrestore: 10 directories and 354 entries processed
xfsrestore: directory post-processing
xfsrestore: resto