压缩文件的用途与技术
压缩文件使文件大小减低,降低磁盘使用量。还可以分成数个小型文件,方便携带。常用于网络数据传输,copy分享文件。
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的压缩
Linux上常见的压缩指令就是gzip, bzip2以及最新的xz,compress 已经退流行了。
tar是将很多文件“打包”成一个文件,而压缩是只对一个文件的压缩,一般两种技术同时使用。
gzip, zcat/zmore/zless/zgrep
gzip指令
目前 gzip 可以解开 compress, zip与gzip等软件所压缩的文件,后缀名是*.gz 。
语法:
gzip [-cdtv#] 文件名
zcat 文件名.gz
选项与参数:
-c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
使用gzip压缩的文件默认成为.gz的文件名,原始文件就不再存在了。
范例:
$ gzip -v services ---压缩文件
$ zcat services.gz ---将文件读出来
$ gzip -d services.gz ---解压缩
$ gzip -9 -c services>services.gz ---用最佳的压缩比压缩,并保留原本的文件
$ zgrep -n 'http' services.gz --- 在services.gz 中,找出 http 这个关键字在哪几行
上面中:-c 将压缩后文件内容输入屏幕,> 将字符输入成文件
zcat, zmore, zless,指令相当于先解压后再执行cat,more,less. 使用不同的方式读取纯文件文件,
使用zgrep从压缩文件当中来使用grep。
bzip2,bzcat/bzmore/bzless/bzgrep
bzip 比gzip压缩比更佳,用法几乎相同。
语法:
$ bzip2 [-cdkzv#] 文件名
$ bzcat 文件名.bz2
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留原始文件,而不会删除原始的文件喔!
-z :压缩的参数 (默认值,可以不加)
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
范例:
$ bzip2 -v services ---使用bzip2压缩
$ bzcat services.bz2 ---读出原内容
$ bzip2 -d services.bz2 ---解压缩
$ bzip2 -c services>services.bz2 --压缩并保留原本的文件
可以看到,连选择与参数是跟gzip一模一样bzcat/bzmore/bzless/bzgrep和zcat/zmore/zless/zgrep使用是一样的。
xz, xzcat/xzmore/xzless/xzgrep
语法:
$ xz [-dtlkc#] 文件名
$ xcat 文件名.xz
选项与参数:
-d :就是解压缩啊!
-t :测试压缩文件的完整性,看有没有错误
-l :列出压缩文件的相关信息
-k :保留原本的文件不删除~
-c :同样的,就是将数据由屏幕上输出的意思!
-# :同样的,也有较佳的压缩比的意思!
范例
$ xz -v services
$ ls -l services*
$ xz -l services.xz
$ xzcat services.xz
$ xz -d services.xz
$ xz -k services
xz这个压缩比比gzip bzip2 更高,时间也花的更久。
打包指令:tar
将多个文件或目录包成一个大文件
tar
语法:
$ tar [-z|-j|-J] [cv] [-f 待创建的新文件名] filename... <==打包与压缩
$ tar [-z|-j|-J] [tv] [-f 既有的 tar文件名] <==察看文件名
$ tar [-z|-j|-J] [xv] [-f 既有的 tar文件名] [-C 目录] <==解压缩
选项与参数:
-c :创建打包文件,可搭配 -v 来察看过程中被打包的文件名(filename)
-t :察看打包文件的内容含有哪些文件名,重点在察看“文件名”就是了;
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
特别留意的是, -c, -t, -x 不可同时出现在一串命令行中。
-z :通过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz
-j :通过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2
-J :通过 xz 的支持进行压缩/解压缩:此时文件名最好为 *.tar.xz
特别留意, -z, -j, -J 不可以同时出现在一串命令行中
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
-f filename:-f 后面要立刻接要被处理的文件名!建议 -f 单独写一个选项啰!(比较不会忘记)
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
其实最简单的使用tar就只要记忆下面的方式即可:
- 压 缩:tar -jcv -f filename.tar .bz2 要被压缩的文件或目录名称
- 查 询:tar -jtv -f filename.tar .bz2
- 解压缩:tar -jxv -f filename.tar .bz2 -C 欲解压缩的目录
指令不会自己产生压缩的文件名,在自己取文件名时,要写对扩展名。
范例:
# tar -jcv -f etc.tar.bz2 /etc --- 打包
# tar -jtv -f etc.tar.bz2 ---查看
# tar -jxv -f etc.tar.bz2 -C /tmp ---解压缩
# time tar -jpcv -f /root/etc.tar.bz2 /etc ---j使用bzip2压缩打包,time 显示打包时间,p
# time tar -Jpcv -f /root/etc.tar.bz2 /etc --- J使用xz压缩打包
仅解开单一文件的方法
# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
打包某目录,但不含该目录下的某些文件之作法:
# tar -jcv -f /root/system.tar.bz2 /root --exclude=/root/etc*
XFS 文件系统的备份与还原
XFS 文件系统备份 xfsdump
使用 xfsdump 时,请注意下面的限制喔:
- xfsdump 不支持没有挂载的文件系统备份!所以只能备份已挂载的!
- xfsdump 必须使用 root 的权限才能操作 (涉及文件系统的关系)
- xfsdump 只能备份 XFS 文件系统啊!
- xfsdump 备份下来的数据 (文件或储存媒体) 只能让 xfsrestore 解析
- xfsdump 是通过文件系统的 UUID 来分辨各个备份文件的,因此不能备份两个具有相同UUID 的文件系统喔!
简单操作
语法:
$ xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据
$ xfsdump -I
选项与参数:
-L :xfsdump 会纪录每次备份的 session 标头,这里可以填写针对此文件系统的简易说明
-M :xfsdump 可以纪录储存媒体的标头,这里可以填写此媒体的简易说明
-l :是 L 的小写,就是指定等级~有 0~9 共 10 个等级喔! (默认为 0,即完整备份)
-f :有点类似 tar 啦!后面接产生的文件,亦可接例如 /dev/st0 设备文件名或其他一般文件文件名等
-I :从 /var/lib/xfsdump/inventory 列出目前备份的信息状态
xfsdump 默认仅支持文件系统的备份,并不支持特定目录的备份~所以你不能用
xfsdump 去备份 /etc ! 因为 /etc 从来就不是一个独立的文件系统!注意!注意!
范例:
[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.4 (dump format 3.0) - type ^C for status and control
xfsdump: level 0 dump of localhost.localdomain:/boot
xfsdump: dump date: Mon Feb 20 12:13:32 2017
xfsdump: session id: 86c1217d-e6ff-4ee3-b35b-ec7153fc67f4
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: 148324608 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 147932264 bytes
xfsdump: dump size (non-dir files) : 147668600 bytes
xfsdump: dump complete: 8 seconds elapsed
xfsdump: Dump Summary:
xfsdump: stream 0 /srv/boot.dump OK (success)
xfsdump: Dump Status: SUCCESS
[root@localhost ~]# ll /srv
总用量 144468
-rw-r--r--. 1 root root 147932264 2月 20 12:13 boot.dump
[root@localhost ~]# ll /var/lib/xfsdump/inventory
总用量 16
-rw-r--r--. 1 root root 5080 2月 20 12:13 0684a77e-9b76-48b1-9217-553a92f1c6bd.StObj
-rw-r--r--. 1 root root 312 2月 20 12:13 362a2f76-b699-4dba-a6c6-6cc28d04347e.InvIndex
-rw-r--r--. 1 root root 576 2月 20 12:13 fstab
#使用了 xfsdump 之后才会有上述 /var/lib/xfsdump/inventory 内的文件产生喔!
用 xfsdump 进行累积备份 (Incremental backups)
# 看一下有没有任何文件系统被 xfsdump 过的数据?
[root@localhost ~]# xfsdump -I
#创建一个大约 10 MB 的文件在 /boot 内:
[root@localhost ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
#开始创建差异备份文件,此时我们使用 level 1 吧:
[root@localhost ~]# xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot
#最后再看一下是否有记录 level 1 备份的时间点呢?
[root@localhost ~]# xfsdump -I
XFS 文件系统还原 xfsrestore
xfsdump 的复原使用的是 xfsrestore 这个指令
语法
[root@study ~]# xfsrestore -I ==用来察看备份文件数据
[root@study ~]# xfsrestore [-f 备份文件] [-L S_label] [-s] 待复原目录 <==单一文件全系统复原
[root@study ~]# xfsrestore [-f 备份文件] -r 待复原目录 <==通过累积备份文件来复原系统
[root@study ~]# xfsrestore [-f 备份文件] -i 待复原目录 <==进入互动模式
选项与参数:
-I :跟 xfsdump 相同的输出!可查询备份数据,包括 Label 名称与备份时间等
-f :后面接的就是备份文件!企业界很有可能会接 /dev/st0 等磁带机!我们这里接文件名!
-L :就是 Session 的 Label name 喔!可用 -I 查询到的数据,在这个选项后输入!
-s :需要接某特定目录,亦即仅复原某一个文件或目录之意!
-r :如果是用文件来储存备份数据,那这个就不需要使用。如果是一个磁带内有多个文件,
需要这东西来达成累积复原
-i :进入互动模式,进阶管理员使用的!一般我们不太需要操作它!
用 xfsrestore 观察 xfsdump 后的备份数据内容
$ xfsrestore -I
简单复原 level 0 的文件系统
[root@localhost ~]# xfsrestore -f /srv/boot.dump -L boot_all /boot
复原累积备份数据
xfsrestore -f /srv/boot.dump1 /tmp/boot
仅还原部分文件的 xfsrestore 互动模式
xfsrestore -f /srv/boot.dump -i /tmp/boot3
其他,后续
dd 可备份完整的 partition 或 disk ,因为 dd 可读取磁盘的 sector 表面数据
cpio 为相当优秀的备份指令,不过必须要搭配类似 find 指令来读入欲备份的文件名数
据,方可进行备份动作。