Linux学习笔记(七):文件压缩、打包与备份
- 常见的压缩指令
-
- gzip, zcat/zmore/zless/zgrep
- bzip2, bzcat/bzmore/bzless/bzgrep
- xz, xzcat/xzmore/xzless/xzgrep
- 打包指令:tar
- XFS文件系统备份与还原
-
- XFS备份:xfsdump
- XFS还原:xfsrestore
- 光盘写入工具
-
- 创建镜像文件:mkisofs
- 刻录光盘:cdrecord
- 其他压缩与备份工具
-
- dd指令
- cpio指令
常见的压缩指令
gzip, zcat/zmore/zless/zgrep
gzip指令创建的压缩文件后缀为 .gz。gzip同时也可以解压缩由 compress, zip, gzip 等软件压缩的文件。压缩的命令格式为 gzip [-cdtv#] filename
。其选项与参数包括:
- -c:将压缩后的数据输出到标准输出,并保留原有文件;
- -d:用于解压文件(相当于gunzip);
- -t:检验压缩文件的一致性(看看文件有无错误);
- -v:显示源文件与压缩文件的压缩比等信息;
- -#:#为数字,代表压缩等级,-1最快但是压缩比最差,-9最慢但是压缩比最快。默认为 -6。
默认情况下,gzip将源文件压缩后,源文件就不存在了。如果被压缩的源文件是文本文件,则可以使用 zcat/zmore/zless 指令读取压缩文件。还可以使用 zgrep 指令从压缩文件中查找数据。
[fang@study ~]$ cd /tmp
[fang@study tmp]$ cp /etc/services .
# 压缩文件
[fang@study tmp]$ gzip -v services
services: 79.7% -- replaced with services.gz
# 查看压缩文件
[fang@study tmp]$ zcat services.gz
# 解压文件
[fang@study tmp]$ gzip -d services.gz
# 以最佳压缩比压缩,并保留原文件
[fang@study tmp]$ gzip -9 -c services > services.gz
# 在压缩文件中查找关键词
[fang@study tmp]$ zgrep -n 'http' services.gz
bzip2, bzcat/bzmore/bzless/bzgrep
bzip2的目的在于取代gzip并提供更好的压缩比。bzip2指令创建的压缩文件后缀为 .bz2。压缩的命令格式为 bzip2 [-cdkzv#] filename
。其选项与参数包括:
- -c:将压缩后的数据输出到标准输出;
- -d:解压缩;
- -k:保留原文件;
- -z:压缩(默认值);
- -v:同gzip;
- -#:同gzip。
bzcat/bzmore/bzless/bzgrep与gzip的情况类似。
xz, xzcat/xzmore/xzless/xzgrep
xz的压缩比相对gzip和bzip2更高,用法也相似。其缺点是压缩时间更长。xz指令创建的压缩文件后缀为 .xz。压缩的命令格式为 xz [-dtlkc#] filename
。其选项与参数包括:
- -d:解压缩;
- -t:测试压缩文件的完整性(是否有错误);
- -l:列出压缩文件的相关信息;
- -k:保留原文件;
- -c:将压缩后的数据输出到标准输出;
- -#:同gzip和bzip2。
打包指令:tar
前面提到的gzip/bzip2/xz只能针对单一文件进行压缩,如果需要将多个文件或目录整合成一个大文件,就需要用到打包指令tar。其指令格式包括:
tar [-z|-j|-J] [cv] [-f 待创建的文件名] filename... # 打包与压缩
tar [-z|-j|-J] [tv] [-f 已有的tar文件名] # 查看文件名
tar [-z|-j|-J] [xv] [-f 已有的tar文件名] [-C 目录] # 解压缩
其选项与参数包括:
- -c:创建打包文件(compress);
- -t:查看打包文件的内容;
- -x:解压缩。注意c, t, x不能同时出现;
- -z:利用gzip压缩或解压缩,建议文件名后缀为 .tar.gz;
- -j:利用bzip2压缩或解压缩,建议文件名后缀为 .tar.bz2;
- -J:利用xz压缩或解压缩,建议文件名后缀为 .tar.xz;
- -v:显示压缩或解压过程中正在处理的文件名;
- -f:后面直接放要处理的文件名;
- -C:后面接解压缩的文件放置的目录;
- -p:保留备份数据的原本权限与属性;
- -P:保留绝对路径(谨慎!还原时会覆盖现有文件);
- –exclude=FILE:不要将FILE文件打包。
使用tar打包备份文件时,会移除绝对路径中的根目录标志 “/”,这样做是出于安全考虑。如果没有移除根目录标志,解压缩后得到的文件名是绝对路径,就会覆盖原有路径下已经存在的文件,从而导致错误和安全问题。
[fang@study ~]$ su -
[root@study ~]$ time tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading '/' from member names
real 0m0.799s # time指令显示其后程序的运行时长
[root@study ~]$ time tar -jpcv -f /root/etc.tar.bz2 /etc
real 0m1.913s
[root@study ~]$ time tar -Jpcv -f /root/etc.tar.xz /etc
real 0m9.023s
解压缩
tar解压缩时默认在当前工作目录放置解压后的文件。使用参数 -C 可以指定解压缩后文件的位置。如果知道压缩包里的文件名,也可以单独解压缩其中的单一文件。指令格式为 tar -jxv -f 打包文件名 待解压文件名
。
[root@study ~]$ tar -jxv -f /root/etc.tar.bz2 -C /tmp # /tmp目录下会出现子目录/etc
[root@study ~]$ tar -jtv -f /root/etc.tar.bz2 | grep 'shadow' # 利用grep指令查找文件名
---------- root/root 721 2015-06-17 00:20 etc/shadow
[root@study ~]$ tar -jxv -f /root/etc.tar.bz2 etc/shadow # 注意不是 /etc/shadow
部分打包
假设我们想打包 /etc和 /root两个目录,但是不想打包 /root/etc*开头的目录,打包后的文件要放在 /root下,路径为 /root/system.tar.bz2,可以使用 –exclude 选项来实现。
[root@study ~]$ tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \ # 符号\用于bash换行
> --exclude=/root/system.tar.bz2 /etc /root
部分备份
使用 –newer 或 –newer-mtime 可以备份比某个时刻更新的文件。
[root@study ~]$ find /etc -newer /etc/passwd
[root@study ~]$ ls -l /etc/passwd # 查看/etc/passwd的mtime
-rw-r--r--. root root 2092 Jun 17 00:20 /etc/passwd
[root@study ~]$ tar -jcv -f /root/etc.newer.than.passwd.tar.bz2 --newer-mtime="2015/06/17" /etc/*
# 列出压缩包内不以/结尾的文件
[root@study ~]$ tar -jtv -f /root/etc.newer.than.passwd.tar.bz2 | grep -v '/$'
XFS文件系统备份与还原
XFS是CentOS 7的默认文件系统。
XFS备份:xfsdump
xfsdump既可以对xfs文件系统进行完整备份,也可以用于在初次备份后进行增量备份。备份的记录文件存放在 /var/lib/xfsdump/inventory 中。需要注意的是:
- xfsdump只能备份已挂载的文件系统;
- 使用xfsdump必须具备root权限;
- 只能备份xfs文件系统;
- 备份后的数据只能用xfsrestore还原;
- xfsdump通过UUID来识别备份文档,因此不能备份两个具有相同UUID的文件系统。
备份命令格式为 xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文档] 待备份资料
。其选项与参数包括:
- -L:S_label用于记录每次备份时对文件系统的简易说明;
- -M:M_label用于纪录每次备份时对存储介质的简易说明;
- -l:L的小写(level),#为0~9的数字,默认为0,表示完整备份,1~9表示不同level的增量备份;
- -f:后面接存储备份的文件名或者设备名;
- -I:大写的 i inventory),从 /var/lib/xfsdump/inventory 列出目前的备份信息(指令格式为xfsdump -I)。
XFS还原:xfsrestore
xfsdump的恢复使用的是xfsrestore指令。
xfsrestore -I # 查看备份文件
xfsrestore [-f 备份文件] [-L S_label] [-s] 待恢复目录 # 单一文件全系统恢复
xfsrestore [-f 备份文件] -r 待恢复目录 # 通过增量备份文件恢复系统
xfsrestore [-f 备份文件] -i 待恢复目录 # 进入交互模式
其选项与参数包括:
- -I:大写的 i inventory),与xfsdump相同,用于查询备份数据;
- -f:后面接存储备份的文件名或者设备名;
- -L:后面接用-I查询到的session label;
- -s:后面接目录名,用于恢复某个文件或目录;
- -r:如果是一个磁带内有多个文件,需要此选项来完成增量恢复;
- -i:进入交互模式,适用于高级管理员,一般不会用到。
[root@study ~]$ df -h /boot
Filesystem ... Mounted on
/dev/vda2 ... /boot # 独立的文件系统,挂载于/boot
# 完整备份
[root@study ~]$ xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot
...
[root@study ~]$ ls -l /srv/boot.dump # 查看备份文件属性
[root@study ~]$ ls /var/lib/xfsdump/inventory
...
[root@study ~]$ xfsdump -I # 查看备份信息
file system 0:fs id: ..........session 0:mount point: study.centos.fang:/bootdevice: study.centos.fang:/dev/vda2session label: "boot_all"level: 0......
xfsdump: Dump status: SUCCESS
# 增量备份
[root@study ~]$ dd if=/dev/zero of=/boot/testing.img bs=1M count=10 # 使用dd制作一个10M大小的文件
[root@study ~]$ xfsdump -l 1 -L boot_l1 -M boot_l1 -f /srv/boot.dump1 /boot
...
[root@study ~]$ ls -l /srv/boot*
-rw-r--r--. 1 root root 102872168 Jul 18:43 /srv/boot.dump
-rw-r--r--. 1 root root 10510952 Jul 18:45 /srv/boot.dump1
[root@study ~]$ xfsdump -I
filesystem 0:fs id: ..........session 0:..........session 1:mount point: study.centos.fang:/bootdevice: study.centos.fang:/dev/vda2session label: "boot_l1"level: 1......# 还原备份
[root@study ~]$ xfsrestore -I # 查看备份信息,找出备份文件对应的挂载点和session label
...
# 还原level 0备份
# 方法一:直接覆盖已有文件(谨慎!)
[root@study ~]$ xfsrestore -f /srv/boot.dump -L boot_all /boot
# 方法二:还原到特定目录下
[root@study ~]$ mkdir /tmp/boot
[root@study ~]$ xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot
# 仅还原备份中的单个文件grub2
[root@study ~]$ xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot# 还原level 1备份(需要先还原level 0备份)
[root@study ~]$ xfsrestore -f /srv/boot.dump1 /tmp/boot
光盘写入工具
创建镜像文件:mkisofs
制作一般数据光盘镜像文件的指令为mkisofs。命令格式为 mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份文件
。选项与参数包括:
- -o:备份要生成的镜像文件;
- -J:产生较兼容Windows的文件名结构;
- -r:产生支持UNIX/Linux的文件数据,可记录较多信息;
- -v:显示创建iso文件的过程信息;
- -V vol:建立volume,类似Windows资源管理器中的CD卷标;
- -m file:排除文件file,不备份到镜像中,可用通配符*;
- -graft-point:定义镜像文件中的目录。
刻录光盘:cdrecord
CentOS 7使用wodim指令刻录光盘,兼容旧版的cdrecord指令。
wodim --devices dev=/dev/sr0 ... # 查询刻录机的bus位置
wodim -v dev=/dev/sr0 blank=[fast|all] # 抹除重复读写盘
wodim -v dev=/dev/sr0 -format # 格式化DVD+RW
wodim -v dev=/dev/sr0 [可选选项功能] file.iso
其选项与参数包括:
- –devices:扫描磁盘总线并找出可用的刻录机;
- -v:显示运行过程信息;
- dev=/dev/sr0:可以找出此光驱的bus地址;
- blank=[fast|all]:blank为抹除可重复写入的CD/DVD-RW,使用fast较快,all较完整;
- -format:对光盘进行格式化,仅支持DVD+RW;
- 可选 -data:指定后面的文件以数据格式写入;
- 可选 speed=X:指定刻录速度;
- 可选 -eject:刻录完毕后自动推出光盘;
- 可选 fs=Ym:指定缓冲内存大小,默认为4m。
其他压缩与备份工具
dd指令
dd指令可以读取磁盘设备内容(几乎是直接读取扇区),然后将整个设备备份成一个文件(包括没有用到的扇区,不论是否能识别文件系统)。
dd if="input_file" of="output_file" bs="block_size" count="number"
其选项与参数包括:
- if:输入文件或设备名;
- of:输出文件或设备名;
- bs:读取block的大小,默认为一个扇区,即512bytes;
- count:读取bs的数量。
dd可以在旧硬盘分区上将扇区的数据全部复制过来,包括superblock、启动扇区、元数据等等。指令 dd if=/dev/sda of=/dev/sdb 可以创建两块一模一样的磁盘。/dev/sdb 甚至不需要分区和格式化。
cpio指令
cpio可以备份包括设备文件在内的任何东西,但是需要先配合find等查找文件的指令。
cpio -ovcB > [file|device] # 备份
cpio -ivcdu < [file|device] # 还原
cpio -ivct > [file|device] # 查看
其选项与参数包括:
- -o:备份的输出文件或设备;
- -B:备份默认的block可以增加到5120bytes,默认为512bytes;
- -i:从文件或设备中还原数据到系统;
- -d:还原时自动建立目录;
- -u:还原时用较新的文件覆盖旧的版本(update);
- -t:配合-i选项,可以查看使用cpio指令建立的文件或设备的内容;
- -v:显示备份或还原的过程信息;
- -c:以较新的portable format方式存储。
# 将/boot下的所有文件备份到/tmp/boot.cpio
[root@study ~]$ cd /
[root@study /]$ find boot -print # 使用 find /boot 会导致cpio备份绝对路径,还原时会覆盖已有文件(危险!)
...
[root@study /]$ find boot | cpio -ocvB > /tmp/boot.cpio
[root@study /]$ ls -lh /tmp/boot.cpio