文件、文件系统的压缩,打包与备份
1、Linux系统常见的压缩指令
常见压缩文件的扩展名:
常见压缩文件的扩展名 | 说明 |
---|---|
*.Z | copress 程序压缩的文件 |
*.zip | zip 程序压缩的文件 |
*.gz | gzip 程序压缩的文件 |
*.bz2 | bzip 程序压缩的文件 |
*.xz | xz 程序压缩的文件 |
*.tar | tar 程序打包的数据,并没有经过压缩 |
*.tar.gz | tar 程序打包的文件,其中经过 gzip 的压缩 |
*.tar.bz2 | tar 程序打包的文件,其中经过 gzip 的压缩 |
*.tar.bz2 | tar 程序打包的文件,其中经过 bzip2 的压缩 |
*.tar.xz | tar 程序打包的文件,其中经过 xz 的压缩 |
1.1、gzip,zcat/zmore/zless/zgrep
[root@mysql ~]# gzip [-cdtv#] 文件名
[root@mysql ~]# zcat 文件名.gz
选项与参数:
-c:降压所的数据输出到屏幕上,可通过数据流重定向来处理
-d:解压缩
-t:可以用来检验一个压缩文件的一致性
-v:可以显示源文件/压缩文件的压缩比信息
-#:为数字的意思,代表压缩等级,-1 最快,但是压缩比最差;-9 最慢,但是压缩比最好!预设为 -6
#找出 /etc 底下容量最大的文件,并将它复制到 /tmp ,然后以 gzip 压缩
[root@li ~]# ls -ldSr /etc/*
...
-rw-r--r--. 1 root root 12288 7月 31 17:14 /etc/aliases.db
-rw-r--r--. 1 root root 20480 7月 31 17:20 /etc/ld.so.cache
-rw-r--r--. 1 root root 670293 6月 7 2013 /etc/services
[root@li ~]# cd /tmp
[root@li tmp]# cp /etc/services .
[root@li tmp]# gzip -v services
services: 79.7% -- replaced with services.gz
[root@li tmp]# ll /etc/services /tmp/services.gz
-rw-r--r--. 1 root root 670293 6月 7 2013 /etc/services
-rw-r--r--. 1 root root 136088 8月 1 11:19 /tmp/services.gz
当你使用 gzip 压缩时,在预设的情况下原本的文件就会不存在了,会被压缩成 .gz 的文件名。
[root@li tmp]# zcat services.gz
#解压缩
[root@li tmp]# gzip -d services.gz
#将解压缩后的文件采用最佳压缩比,并保留原文本
[root@li tmp]# gzip -9 -c services > services.gz
#在压缩文件中找出 http 这个关键词在哪几行
[root@li tmp]# zgrep -n 'http' services.gz
1.2、bzip2,bzcat/bzmore/bzless/gzgrep
[root@mysql ~]# bzip2 [-cdkzv#] 文件名
[root@mysql ~]# bzcat 文件名.bz2
选项与参数:
-c:降压所的数据输出到屏幕上,可通过数据流重定向来处理
-d:解压缩
-k:保留原文件
-z:压缩的参数
-v:可以显示源文件/压缩文件的压缩比信息
-#:为数字的意思,代表压缩等级,-1 最快,但是压缩比最差;-9 最慢,但是压缩比最好!预设为 -6
1.3、xz,xzmore/xzless/xzgrep
[root@mysql ~]# xz [-dtlkc#] 文件名
[root@mysql ~]# xcat 文件名.xz
选项与参数:
-d:解压缩
-t:可以用来检验一个压缩文件的一致性
-l:列出压缩文件的相关信息
-k:保留原文件
-c:降压所的数据输出到屏幕上,可通过数据流重定向来处理
-#:为数字的意思,代表压缩等级,-1 最快,但是压缩比最差;-9 最慢,但是压缩比最好!预设为 -6
2、打包指令:tar
[root@mysql ~]# tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename #打包与压缩
[root@mysql ~]# tar [-z|-j|-J] [tv] [-f 待建立的新文件名] #查看文件名
[root@mysql ~]# tar [-z|-j|-J] [xv] [-f 待建立的新文件名] [-C 目录] #解压缩
选项与参数:
-z:通过 gzip 程序压缩
-j:通过 bzip2 程序压缩
-J:通过 xz 程序压缩
其他选项:
-p:保留备份数据原本的权限与属性,常用于备份重要文件
-P:保留绝对路径,即允许备份数据中包含根目录
--exclude=FILE:在压缩的过程中,不要将 FILE 打包
简单记忆:
- 压缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录
- 查询:tar -jtv -f filename.tar.bz2
- 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
2.1、使用 tar 加入 -z,-j 或 -J 的参数备份 /etc/ 目录
[root@li ~]# time tar -zpcv -f /root/etc.tar.gz /etc
tar: 从成员名中删除开头的“/” #注意这个警告信息
/etc/
/etc/fstab
/etc/crypttab
/etc/mtab
...
real 0m1.279s
user 0m0.436s
sys 0m0.590s
[root@li ~]# time tar -jpcv -f /root/etc.tar.bz2 /etc
...
real 0m1.832s
user 0m1.720s
sys 0m0.071s
[root@li ~]# time tar -Jpcv -f /root/etc.tar.xz /etc
...
real 0m7.744s
user 0m6.965s
sys 0m0.681s
#时间较长,因为使用了 -J
[root@li ~]# ll /root/etc*
-rw-r--r--. 1 root root 9089190 8月 2 08:57 /root/etc.tar.bz2
-rw-r--r--. 1 root root 10350928 8月 2 08:55 /root/etc.tar.gz
-rw-r--r--. 1 root root 7383160 8月 2 08:53 /root/etc.tar.xz
[root@li ~]# du -sm /etc
32 /etc
可以看到,压缩比越好当然花费的时间越多。
2.2、查阅 tar 文件的数据内容(可查看文件名),与备份文件名有无根目录的意义
[root@li ~]# tar -jtv -f /root/etc.tar.bz2
-rw-r--r-- root/root 5171 2018-10-31 04:26 etc/man_db.conf
-rw-r--r-- root/root 112 2019-11-27 23:45 etc/e2fsck.conf
-rw-r--r-- root/root 936 2020-04-01 10:27 etc/mke2fs.conf
...
可以发现,每个文件名都没了根目录。为什么要拿掉根目录呢?主要是为了安全!使用 tar 备份的数据可能会需要解压缩回来使用,在 tar 所记录的文件名就是解压缩后的实际文件名。如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的文件名就会变成 /tmp/etc/xxx。如果没有拿掉根目录,解压缩后的文件名就是绝对路径,即解压缩后的数据一定会覆盖 /etc 下的数据。
那如果想把根目录也备份下来:
[root@li ~]# time tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
[root@li ~]# tar -jt -f /root/etc.and.root.tar.bz2
/etc/hostname
/etc/.updated
/etc/aliases.db
/etc/vimrc
2.3、将备份的数据解压缩,并考虑特定目录的解压缩动作(-C 选项的应用)
[root@li ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
[root@li ~]# ll /tmp | grep etc
drwxr-xr-x. 75 root root 8192 8月 2 08:46 etc
[root@li ~]# rm -rf /tmp/etc
2.4、仅解开单一文件的方法
[root@li ~]# tar -jtv -f /root/etc.and.root.tar.bz2 | grep shadow
tar: 从成员名中删除开头的“/”
---------- root/root 355 2020-07-31 17:12 etc/gshadow
---------- root/root 692 2020-07-31 17:12 etc/shadow-
---------- root/root 687 2020-07-31 17:12 etc/shadow #解开这个
---------- root/root 353 2020-07-31 17:12 etc/gshadow-
[root@li ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
2.5、打包某目录,但不包含该目录下的某些文件的作法
假如想打包 /etc/root/ 这几个重要目录,但却不想打包 /root/etc* 开头的文件:
[root@li ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
> --exclude=/root/system.tar.bz2 /etc /root
2.6、仅打包比某个时刻还新的文件
[root@li ~]# find /etc -newer /etc/passwd
[root@li ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
> --exclude=/root/system.tar.bz2 /etc /root
2.7、特殊应用:利用管线命令与数据流
[root@li tmp]# cd /tmp
[root@li tmp]# tar -cvf - /etc | tar -xvf -
3、XFS 文件传统的备份与还原
3.1、XFS 文件系统备份 xfsdump
其实 xfsdump 的功能很强!除了可以进行文件系统的完整备份之外,还可以进行累积备份。
[root@li ~]# xfsdump [-L S_label] [-M M_Label] [-l #] [-f 备份文件] 带备份文件
[root@li ~]# xfsdump -I
选项与参数:
-L:针对文件系统进行简易说明
-M:媒体的简易说明
-l:备份等级,0-9
-f:文件名
-I:从 /var/lib/xfsdump/inventory 列出目前备份的信息状态
3.2、用 xfsdump 备份完整的文件系统
[root@li tmp]# yum install xfsdump -y
[root@li tmp]# 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 li.erver:/boot #开始备份本机 /root 系统
xfsdump: dump date: Sun Aug 2 09:45:39 2020 #备份时间
xfsdump: session id: f561afe8-55de-4f18-ae11-95f1f93ed081 #这次 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: Dump Summary:
xfsdump: stream 0 /srv/boot.dump OK (success)
xfsdump: Dump Status: SUCCESS
[root@li tmp]# ll /srv/boot.dump
-rw-r--r--. 1 root root 109145976 8月 2 09:45 /srv/boot.dump
[root@li tmp]# ll /var/lib/xfsdump/inventory/
总用量 16
-rw-r--r--. 1 root root 312 8月 2 09:45 2353541d-eb76-4ff1-9592-ab771e2969af.InvIndex
-rw-r--r--. 1 root root 5080 8月 2 09:45 59496b9a-b0df-482a-8e43-16904b829ce5.StObj
-rw-r--r--. 1 root root 576 8月 2 09:45 fstab
3.3、用 xfsdump 进行累积备份
#0、看一下有没有任何文件系统被 xfsdump 过的资料?
[root@li tmp]# xfsdump -I
file system 0:
fs id: 2353541d-eb76-4ff1-9592-ab771e2969af
session 0:
mount point: li.erver:/boot
device: li.erver:/dev/sda2
time: Sun Aug 2 09:45:39 2020
session label: "boot_All"
session id: f561afe8-55de-4f18-ae11-95f1f93ed081
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: 109145976
mfile start: ino 69 offset 0
mfile end: ino 1572934 offset 0
media label: "boot_all"
media id: 07f08589-8f45-43aa-a903-8375e3487dde
xfsdump: Dump Status: SUCCESS
#1、先创建一个大概 10M 的文件在 /root 内
[root@li tmp]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.0500695 秒,209 MB/秒
#2、开始备份差异文件,此时使用level 1
[root@li tmp]# xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot
...
[root@li tmp]# ll /srv/boot*
-rw-r--r--. 1 root root 109145976 8月 2 09:45 /srv/boot.dump
-rw-r--r--. 1 root root 10510952 8月 2 09:52 /srv/boot.dump1
#看看文件大小,就是刚刚建立的文件的容量
#3、最后看一下是否有 level 1 备份的时间点
[root@li tmp]# xfsdump -I
file system 0:
...
session 1:
mount point: li.erver:/boot
device: li.erver:/dev/sda2
time: Sun Aug 2 09:52:04 2020
session label: "boot_2"
session id: 2fb4ae43-dc12-4dff-b5e4-c15f1fff472e
level: 1
resumed: NO
subtree: NO
streams: 1
stream 0:
pathname: /srv/boot.dump1
start: ino 78 offset 0
end: ino 79 offset 0
interrupted: NO
media files: 1
media file 0:
mfile index: 0
mfile type: data
mfile size: 10510952
mfile start: ino 78 offset 0
mfile end: ino 79 offset 0
media label: "boot_2"
media id: c45589d2-98d9-4a34-901b-0c11dbfbb389
xfsdump: Dump Status: SUCCESS
#这个方式仅能备份差异文件!
3.4、XFS 文件系统还原 xfsrestore
[root@li ~]# xfsrestore -I #查看备份文件资料
[root@li ~]# xfsrestore [-f 备份文件] [-L S_label] [-s] 待还原目录 #单一文件全系统还原
[root@li ~]# xfsrestore [-f 备份文件] -r 待还原目录 #通过累积备份文件还原系统
[root@li ~]# xfsrestore [-f 备份文件] -i 待还原目录 #进入互动模式
3.4.1、用 xfsrestore 观察 xfsdump 后的备份数据内容
[root@li tmp]# xfsrestore -I
3.4.2、简单还原 level 0 的文件系统
#直接覆盖回去,同名的覆盖,新文件保留
[root@li tmp]# 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 323 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@li tmp]# mkdir /tmp/boot
[root@li tmp]# xfsrestore -f /srv/boot.dump -L boot_All /tmp/boot
[root@li tmp]# du -sm /boot /tmp/boot
115 /boot
105 /tmp/boot
#两者大小怎么不一样呢?
[root@li tmp]# diff -r /boot /tmp/boot
只在 /boot 存在:testing.img #之前新建的文件
3.4.3、复原累积备份资料
#继续复原 level 1 到 /tmp/boot 中去
[root@li tmp]# xfsrestore -f /srv/boot.dump1 /tmp/boot
4、其他常见的压缩与备份工具
4.1、dd
[root@li ~]# dd if="input_file" of="output_file" bs="block_size" count="number"
#将 /etc/passwd 备份到 /tmp/passwd.back
[root@li tmp]# dd if=/etc/passwd of=/tmp/passwd.back
记录了1+1 的读入
记录了1+1 的写出
835字节(835 B)已复制,0.000155893 秒,5.4 MB/秒
[root@li tmp]# ll /etc/passwd /tmp/passwd.back
-rw-r--r--. 1 root root 835 7月 31 17:12 /etc/passwd
-rw-r--r--. 1 root root 835 8月 2 10:08 /tmp/passwd.back
#将 /boot 整个文件系统备份通过 dd
[root@li tmp]# df -h /boot
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 1014M 147M 868M 15% /boot
[root@li tmp]# dd if=/dev/sda2 of=/tmp/sda2.img
记录了2097152+0 的读入
记录了2097152+0 的写出
1073741824字节(1.1 GB)已复制,3.90347 秒,275 MB/秒
[root@li tmp]# ll -h /tmp/sda2.img
-rw-r--r--. 1 root root 1.0G 8月 2 10:11 /tmp/sda2.img