文章目录
- Linux XFS文件系统的备份与还原
- XFS文件系统备份xfsdump
- 语法
- xfsdump备份完整的文件系统
- 用xfsdump进行增量备份
- XFS文件系统还原xfsrestore
- 语法
- 用xfsrestore观察和xfsdump后的备份数据内容
- 简单恢复level 0 的文件系统
- 恢复增量备份数据
- 仅还原部分文件到xfsrestore交互模式
Linux XFS文件系统的备份与还原
备份与还原是系统管理中非常重要的一部分,保证数据的安全性与可靠性。对于xfs文件系统来说,备份与还原也是必不可少的操作。下面就详细介绍xfs文件系统的备份与还原
XFS文件系统备份xfsdump
其实xfsdump的功能颇为强大,他除了可以进行文件系统完整备份之外,还可以进行增量备份。那么什么是增量备份呢?这么说假设你的/home是独立的一个文件系统,那你在第一次使用xfsdump进行完整备份后,等过一段时间的文件系统自然运行后,你再进行第二次xfsdump时,就可以选择增量备份了。此时新备份的数据只会记录与第一次完整备份所有差异的文件而已,如下图
上方的文件系统是一直随着时间变化的数据,例如在/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的文件系统
语法
xfsdump [- options] [-f filename] <待备份的数据>
其中,选项包括:
-f filename:指定备份文件的名称和路径;
-L filename:指定日志文件的名称和路径;
-l level:指定备份的级别,包括0、1、2、3、4、5、6、9;
-s 备份时不备份空间;
-M xfsdump可以记录存储媒介的标头,这里可以填写此媒介的简易说明
-I 从/var/lib/xfsdump/inventory列出目前备份的信息状态
特别注意,xfsdump默认仅支持文件系统的备份,并不支持特定目录的备份,所以你不能用xfsdump去备份/etc/,因此/etc从来就不是一个独立的文件系统,注意。
xfsdump备份完整的文件系统
假设你在/boot划分出自己的文件系统,要整个文件系统备份可以这样:
先确定/boot是独立的文件系统
[root@localhost ~]# df -h /boot/
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 1014M 151M 864M 15% /boot # 挂载/boot的是/dev/sda1设备
# 看到了吗确实是独立的文件系统,/boot是挂载点
将完整备份的文件名记录成为/srv/boot.dump。
[root@localhost ~]# xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot
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 localhost.localdomain:/boot # 开始备份本机/boot
xfsdump: dump date: Sun Apr 16 20:02:42 2023 # 备份的时间
xfsdump: session id: c4840861-e488-4250-b0ba-615900bbc97a # 这次dump的ID
xfsdump: session label: "boot_all" # 简单的给予一个名称
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: 123639360 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 123318136 bytes
xfsdump: dump size (non-dir files) : 123085224 bytes
xfsdump: dump complete: 2 seconds elapsed
xfsdump: Dump Summary:
xfsdump: stream 0 /srv/boot.dump OK (success)
xfsdump: Dump Status: SUCCESS
# 在命令的执行方面,你也可以不加 -L 和 -M ,只是那就会进入交互模式,要求你回车
# 而执行xfsdump的过程中会出现如上的一些信息,可以仔细的观察以下
[root@localhost ~]# ll -h /srv/boot.dump
-rw-r--r-- 1 root root 118M 4月 16 20:02 /srv/boot.dump
[root@localhost ~]# ll /var/lib/xfsdump/inventory/
总用量 16
-rw-r--r-- 1 root root 5080 4月 16 20:02 0159f731-2131-473a-8143-34853cd42816.StObj
-rw-r--r-- 1 root root 312 4月 16 20:02 12fbc8e4-fc2b-458d-87ad-15193057ca19.InvIndex
-rw-r--r-- 1 root root 576 4月 16 20:02 fstab
# 使用了xfsdump之后才会有上述/var/lib/xfsdump/inventory内的文件产生
就这样就很简单的建立起来/srv/boot.dump文件,该文件将整个/boot 文件系统都备份下来了。并且将备份的相关信息(文件系统/时间/session ID等)写入/var/lib/xfsdump/inventory中了
准备下次备份时可以作为一个参考依据,然后再来做个测试,检查看看能否真的建立level 1的备份?
用xfsdump进行增量备份
一定要记住进行过完整备份后【-l 0】才能够继续由其他增量备份【-l 1~9】的能力,所以得确定上面的实践已经完成才行,接下里进行增量备份功能
从/var/lib/xfsdump/inventory列出目前备份的信息状态
[root@localhost ~]# xfsdump -I
file system 0:
fs id: 12fbc8e4-fc2b-458d-87ad-15193057ca19
session 0:
mount point: localhost.localdomain:/boot
device: localhost.localdomain:/dev/sda1
time: Sun Apr 16 20:02:42 2023
session label: "boot_all"
session id: c4840861-e488-4250-b0ba-615900bbc97a
level: 0
resumed: NO
subtree: NO
streams: 1
stream 0:
pathname: /srv/boot.dump
start: ino 69 offset 0
end: ino 1572934 offset 0
interrupted: NO
media files: 1
media file 0:
mfile index: 0
mfile type: data
mfile size: 123318136
mfile start: ino 69 offset 0
mfile end: ino 1572934 offset 0
media label: "boot_all"
media id: 8f1e4115-90f8-40ff-a620-540b5421ae2a
xfsdump: Dump Status: SUCCESS
# 可以看到目前仅有一个session 0的备份数据而已,而且是level 0
我们可以先建立一个大小约为10M的文件在/boot内
[root@localhost ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.102866 秒,102 MB/秒
[root@localhost ~]# ll -h /boot/testing.img
-rw-r--r-- 1 root root 10M 4月 16 20:21 /boot/testing.img
开始建立差异备份文件,此时我们使用level 1
[root@localhost ~]# xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot
.....
....
[root@localhost ~]# ll -h /srv/boot*
-rw-r--r-- 1 root root 118M 4月 16 20:02 /srv/boot.dump
-rw-r--r-- 1 root root 11M 4月 16 20:24 /srv/boot.dump1
# 看看文件大小,岂不是我们刚刚所建立的大文件容量吗?
最后再看看是否记录了 level 1备份的时间点
[root@localhost ~]# xfsdump -I
file system 0:
fs id: 12fbc8e4-fc2b-458d-87ad-15193057ca19
session 0:
mount point: localhost.localdomain:/boot
device: localhost.localdomain:/dev/sda1
time: Sun Apr 16 20:02:42 2023
session label: "boot_all"
session id: c4840861-e488-4250-b0ba-615900bbc97a
...................
..........
...
session 1:
mount point: localhost.localdomain:/boot
device: localhost.localdomain:/dev/sda1
time: Sun Apr 16 20:24:00 2023
session label: "boot_2"
session id: ca7224bf-e1e0-488e-bdd6-91486bb0a6d3
...........................
.......
...
通过这个简单的方式,我们就能够仅备份差异文件的部分
XFS文件系统还原xfsrestore
备份文件在急用时可以恢复系统的重要数据,所以有备份当然就要学学如何恢复了,xfsdump的恢复使用的是xfsrestore这个命令,这个命令的选项也非常多,可以自行查看,在这里简单的介绍一下
语法
[root@localhost ~]# xfsrestore -I # 查看备份文件
xfsrestore [ -f 备份文件] [ -L label ] [ -s ] 待恢复目录 <==单一文件全系统恢复
xfsrestore [ -f 备份文件] -r 待恢复目录 # 通过增量备份文件来恢复系统
xfsrestore [ -f 备份文件] -i 待恢复目录 # 进入交互模式
选项于参数:
-I 跟xfsdump相同的输出,可查询备份数据,包括Label名称与备份时间等。
-f 指定备份数据的存储位置;
-p 在还原过程中保留权限、所有权和时间戳信息;
-v 显示还原过程中的详细信息;
-r 恢复备份数据;
-t 列出备份数据中的文件和目录。
-L 就是session的Label name,可以用 -I查询到
-s 需要接某特定目录,就是仅恢复某一个文件或目录的意思
-i 进入交互模式,高级管理员使用的,一般我们不需要操作他
用xfsrestore观察和xfsdump后的备份数据内容
要找出xfsdump内容就使用xfsrestore -I 来查看即可,不需要加任何参数,因为xfsdump与xfsrestore 都会到 /var/lib/xfsdumop/inventory/ 里面去取数据来显示,因此两者输出是相同的
[root@localhost ~]# xfsrestore -I
file system 0:
fs id: 12fbc8e4-fc2b-458d-87ad-15193057ca19
session 0:
mount point: localhost.localdomain:/boot
device: localhost.localdomain:/dev/sda1
time: Sun Apr 16 20:02:42 2023
session label: "boot_all"
session id: c4840861-e488-4250-b0ba-615900bbc97a
level: 0
pathname: /srv/boot.dump
start: ino 69 offset 0
end: ino 1572934 offset 0
interrupted: NO
media files: 1
media file 0:
mfile index: 0
mfile type: data
mfile size: 123318136
mfile start: ino 69 offset 0
mfile end: ino 1572934 offset 0
session 1:
mount point: localhost.localdomain:/boot
device: localhost.localdomain:/dev/sda1
time: Sun Apr 16 20:24:00 2023
session label: "boot_2"
session id: ca7224bf-e1e0-488e-bdd6-91486bb0a6d3
level: 1
mfile type: data
mfile size: 10510624
mfile start: ino 79 offset 0
# 以上内容是简化的结果
# 我们可以看到整个文件系统是/boot的挂载点,然后又两个备份,一个 level 0 一个level 1
# 我们也可以看到备份文件的数据他的大小内容,更重要的就是那个session label
查询的重点就是要找出到底是哪个文件是哪个挂载点,而备份文件又是上面level 等,接下来让我们从备份还原系统
简单恢复level 0 的文件系统
先来处理一个简单的任务,就是让/boot整个恢复到最原本的状态,你该如何处理呢?其实很简单,我们只要知道想要被恢复的那个文件,以及该文件的session label name 就可以恢复,我们从上面观察已经知道了 level 0 的 session label 是【boot_all】 那整个流程是这样的
直接将数据给他覆盖回去即可
[root@localhost ~]# xfsrestore -f /srv/boot.dump -L boot_all /boot
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (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: 9 directories and 324 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore: stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
将备份数据在/tmp/boot 下面解开
[root@localhost ~]# mkdir /tmp/boot
[root@localhost ~]# xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot/
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (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: 9 directories and 324 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 1 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore: stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
[root@localhost ~]# du -sh /boot/ /tmp/boot/
128M /boot/
118M /tmp/boot/
# 可以看到两个文件大小不一致,没关系我们来检查一下
[root@localhost ~]# diff -r /boot/ /tmp/boot/
只在 /boot/ 存在:testing.img
# 原来是们在/boot 增加过一个文件
因为原本/boot 里面的东西我们没有删除,直接恢复的结果就是:同名的文件会被覆盖,其他系统内新的文件会被保留。所以,那个/boot/testing.img 就会一直在里面,如果备份的目的就是新的位置,当然就只有原本备份的数据而已,而diff -r 可以比较两个目录内的文件差异,通过该命令我们可以找到两个目录之间的差异
仅恢复备份文件内的grub2到/tmp/boot2里面去
[root@localhost ~]# xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2
[root@localhost ~]# ll /tmp/boot2/
总用量 0
drwx------. 5 root root 97 4月 5 20:12 grub2
恢复增量备份数据
其实恢复增量备份与恢复单一文件系统相似。如果备份数据是有level 0 ==> level 1 ==> level 2 去进行的,当然恢复就得要相同的流程来恢复了。因此当我们恢复了level 0 之后,接下来当然就要恢复 level 1 到系统内,我们可以从前一个案例恢复 /tmp/boot 的情况来继续往下处理
继续恢复level 1到 /tmp/boot当中
[root@localhost ~]# xfsrestore -f /srv/boot.dump1 /tmp/boot
仅还原部分文件到xfsrestore交互模式
刚刚的 -s可以接部分数据来还原,但是,如果我就根本不知道备份文件里面有啥文件,那该如何选择呢?我猜吗?又如果要恢复的文件数量太多,用 -s 似乎太笨,那怎么办呢?有没有比较好的方式?有的,我们可以用-i这个交互式界面。举例来说,我们想要知道 level 0的备份数据里面有哪些东西,如何再少了的还原回来的话。
先进入备份文件内,准备找出需要备份的文件,同时预计还原到/tmp/boot3中
[root@localhost ~]# xfsrestore -f /srv/boot.dump -i /tmp/boot3/
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (dump format 3.0) - type ^C for status and control
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description:
xfsrestore: hostname: localhost.localdomain
xfsrestore: mount point: /boot
xfsrestore: volume: /dev/sda1
xfsrestore: session time: Sun Apr 16 20:02:42 2023
xfsrestore: level: 0
xfsrestore: session label: "boot_all"
xfsrestore: media label: "boot_all"
xfsrestore: file system id: 12fbc8e4-fc2b-458d-87ad-15193057ca19
xfsrestore: session id: c4840861-e488-4250-b0ba-615900bbc97a
xfsrestore: media id: 8f1e4115-90f8-40ff-a620-540b5421ae2a
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 9 directories and 324 entries processed
xfsrestore: directory post-processing
========================== subtree selection dialog ==========================
the following commands are available:
pwd
ls [ <path> ]
cd [ <path> ]
add [ <path> ]
delete [ <path> ]
extract
quit
help
-> ls
78 initramfs-3.10.0-1160.el7.x86_64kdump.img
75 initramfs-3.10.0-1160.el7.x86_64.img
77 vmlinuz-0-rescue-567928b865d945a8a3c7211006b3ba40
76 initramfs-0-rescue-567928b865d945a8a3c7211006b3ba40.img
74 vmlinuz-3.10.0-1160.el7.x86_64
73 symvers-3.10.0-1160.el7.x86_64.gz
72 config-3.10.0-1160.el7.x86_64
71 System.map-3.10.0-1160.el7.x86_64
70 .vmlinuz-3.10.0-1160.el7.x86_64.hmac
68 grub/
1572928 grub2/
67 efi/
-> add config-3.10.0-1160.el7.x86_64
-> add grub/
-> add grub2/
-> extract
--------------------------------- end dialog ---------------------------------
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 80 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore: stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
[root@localhost ~]# ll -h /tmp/boot3/
总用量 152K
-rw-r--r--. 1 root root 150K 10月 20 2020 config-3.10.0-1160.el7.x86_64
drwxr-xr-x. 2 root root 27 4月 5 20:08 grub
drwx------. 5 root root 97 4月 5 20:12 grub2
这个-i是很有帮助的一个选项。可以从备份文件里面找出你所需要的数据来恢复,当然,如果你已经知道了文件名,使用 -s 不需要进入备份文件就能处理掉这部分了
此文章内容参考《鸟哥Linux私房菜》