Linux基础学习笔记之——文件、文件系统的压缩,打包与备份

文件、文件系统的压缩,打包与备份

1、Linux系统常见的压缩指令

常见压缩文件的扩展名:

常见压缩文件的扩展名说明
*.Zcopress 程序压缩的文件
*.zipzip 程序压缩的文件
*.gzgzip 程序压缩的文件
*.bz2bzip 程序压缩的文件
*.xzxz 程序压缩的文件
*.tartar 程序打包的数据,并没有经过压缩
*.tar.gztar 程序打包的文件,其中经过 gzip 的压缩
*.tar.bz2tar 程序打包的文件,其中经过 gzip 的压缩
*.tar.bz2tar 程序打包的文件,其中经过 bzip2 的压缩
*.tar.xztar 程序打包的文件,其中经过 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值