《鸟哥的Linux私房菜》chapter9 20180818~20180826

  • 1 文件与文件系统的压缩与打包
    • 1.1 文件压缩的原理
    • 1.2 Linux常见的压缩命令
      • 1.2.1 常见的压缩文件案扩展名
      • 1.2.2 Compress
      • 1.2.3 gzip,zcat
      • 1.2.4 bzip2,bzcat
    • 1.3 打包指令tar
      • 1.3.1 tar的语法和参数
      • 1.3.2 tar的基本用法示例
      • 1.3.3 tar:移除根目录和未移除根目录的解打包路径
      • 1.3.4 tar:对指定单一档案解打包
      • 1.3.5 tar:对指定档案不打包
      • 1.3.6 tar:备份比某个时间点更新的档案
      • 1.3.7 基本名称:tarfile和tarball
      • 1.3.8 特殊应用:利用管线命令和数据流
    • 1.4 完整备份工具
      • 1.4.1 完整备份工具dump
        • 1.4.1.1 dump的语法和参数
        • 1.4.1.2 dump的限制
        • 1.4.1.3 用dump备份完整的文件系统
        • 1.4.1.4 用dump备份单一目录
      • 1.4.2 XFS文件系统的备份指令xfsdump
        • 1.4.2.1 示例1:用xfsdump备份完整的文件系统
        • 1.4.2.2 示例2:用xfsdump备份单一目录
        • 1.4.2.3 xfsdump指令限制
      • 1.4.3 恢复指令restore
        • 1.4.3.1 Restore的语法和参数
        • 1.4.3.2 用restore查看dump后的备份数据内容
        • 1.4.3.3 比较差异并还原整个文件系统
        • 1.4.3.4 仅还原部分文件的restore互动模式
      • 1.4.4 XFS文件系统的恢复指令xfsrestore
        • 1.4.4.1 xfsrestore的语法和参数
        • 1.4.4.2 对文件系统的增量恢复
        • 1.4.4.3 对整个文件系统的恢复
        • 1.4.4.4 仅复原备份档单一文件到指定目录
        • 1.4.4.5 互动模式复原部分目录
    • 1.5 光盘写入工具
      • 1.5.1 新建镜像文件:mkisofs
      • 1.5.2 光盘刻录工具:cdrecord
    • 1.6 其他常见的压缩与备份工具
      • 1.6.1 dd
      • 1.6.2 cpio

1 文件与文件系统的压缩与打包

1.1 文件压缩的原理

目前我们使用的计算机系统中是使用byte单位来计量的,但计算机的最小计量单位应该是bit。1byte=8bit。假如计算机记忆数字1,用二进制来存储,应该是00000001,前7个bit自动被填上0,可以看成是空的。而文件压缩就是利用一些复杂的计算方式,将这些空的空间丢出来,让文件占用空间变小。
要使用压缩过的文件数据,必须将它解压缩。
压缩前与压缩后的文件所占用的磁盘空间大小,就可以被称为是压缩比。
目前很多www网站也是利用文件压缩技术来进行数据传输,好让网站带宽的可利用率上升。
注:www网站压缩技术是指数据从服务器端被压缩,然后通过网线传输给计算机主机,再由计算机主机解压缩,渲染,以此提高数据传输速度。

1.2 Linux常见的压缩命令

Linux中压缩文件案的扩展名大多都是.tar,.tar.gz,.tgz,.gz,.Z,.bz2,之所以有这些拓展名区别,是因为不同的压缩命令使用的压缩技术不同,也不能互相解压缩,看到扩展名,我们就知道该压缩文件是用何种命令压缩的,知道用何种命令解压缩。

1.2.1 常见的压缩文件案扩展名

扩展名 对应的压缩程序
*.Z compress程序压缩的文件
*.gz gzip程序压缩的文件
*.bz2 bzip2程序压缩的文件
*.tar tar程序打包的文件,没有被压缩过
*.tar.gz tar程序打包,然后被gzip程序压缩的文件
*.tar.gz2 tar程序打包,然后被bzip2程序压缩的文件

压缩程序只能对一个文件压缩与解压缩,如果要压缩一堆文件,需要将这堆文件先打包成一个文件,然后对此文件进行压缩。

1.2.2 Compress

Compress命令是非常老旧的一款,只有再非常旧的UNIX机器上还会找到这个软件,想要了解这个软件的使用,需要先安装ncompress这个软件。输入yum –y install ncompress指令就可以安装。
Compress的语法和参数
压缩:compress [-rcv] 文件或目录
解压缩:uncompress 文件.Z
-r:连同目录下的文件一起压缩
-c:将压缩数据输出到stdout
-v:显示压缩后的文件信息以及压缩过程中的一些文件名变化
示例1:将/etc/man_db.conf复制到/tmp并加以压缩。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第1张图片
如图所示,我们发现被压缩的文件/tmp/man_db.cp消失了。比较原文件/etc/man_db.conf和/tmp/man_db.cp.Z的大小,发现文件被压缩到了一半大小。
将/tmp/man_db.cp.Z解压缩,如图所示
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第2张图片
我们发现解压缩之后/tmp/man_db.cp又回来了,大小恢复到原来的样子,但/tmp/man_db.cp.Z不见了。如果我想同时保留原文件和压缩文件呢?
示例2:将/tmp/man_db.cp压缩成另外一个文件来备份
这里写图片描述
如图所示,-c参数能将数据压缩结果输出到屏幕上,而不是制成压缩包档案,所以使用数据流重定向将数据压缩结果重定向到档案中,就能够同时保存原文件和压缩文件,还可以自命名压缩文件。
示例3:解压缩man_db.Z,同时保留压缩文件
这里写图片描述
如图所示,解压缩也可以利用-c参数自定义解压缩后的文件名,并且保留压缩文件。

1.2.3 gzip,zcat

gzip是当前应用度最广的软件,并且可以解开compress,zip和gzip这些软件压缩的档案。而且在Linux中被gzip压缩后的文件可以在Windows中被winrar软件解压缩。
gzip的语法和参数
压缩:gzip [-cdtv#] 档名
读取压缩文件解压缩后的内容:zcat 档名.gz
-c:将压缩或解压缩后的数据输出到屏幕上,可使用数据流重定向来处理数据
-d:解压缩的参数
-t:可以用来检验一个压缩文件的一致性,看看档案有无错误
-v:可以显示原档案/压缩文件案压缩比等信息
-#:压缩等级,#代表一个数字,-1压缩最快,但压缩比最差,-9压缩最慢,但压缩比最好,默认是-6
示例1:解压缩由compress工具压缩的档案/tmp/man_db.Z,并保留原压缩档案
这里写图片描述
如图所示,gzip能够解压缩compress压缩后的档案,且-c参数的功能和compress中提到过的一样。而被gzip解压后的档案大小和compress压缩前的档案大小一样。现在让我们删除man_db.Z和man_db.zcat,后面的示例由man_db.cp进行。
示例2:分别用gzip和compress压缩/tmp/man_db.cp,对比两者的压缩比。
这里写图片描述
如图所示,显然gzip的压缩比更佳。
示例3:将示例2中的man_db.gz文件解压缩
这里写图片描述
如图所示,/tmp/man_db就是解压缩后的档案。这里我用了gzip解压缩,而在示例1中我是用zcat指令,这两个指令是有区别的,准确来说,gzip是解压缩的指令,而zcat是读取压缩文件案解压缩后内容的指令,其输出可以参照cat指令的功能,由于示例1中我用数据流重定向,所以用这个zcat指令才能达到解压缩的目的。
zcat只能读取纯文本压缩文件案,但是zcat也可以读取compress压缩后的纯文本压缩文件。
示例4:用gzip压缩/tmp/man_db.cp,保留原文件,分别设置压缩等级-1,-5和-9,观察压缩比的区别。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第3张图片
如图所示,原文件最大,压缩等级-1的压缩比最低,压缩文件案最大,压缩等级-9的压缩比最高,压缩文件案最小。

1.2.4 bzip2,bzcat

bzip2是为了取代gzip提供更好的压缩比而来的,bzip2和bzcat的用法几乎和gzip与zcat一样。
压缩:bzip2 [-cdkzv#] 档名
读取压缩文件案解压缩后内容:bzcat 档名.bz2
-c:同gzip,将压缩后的结果显示在屏幕上
-d:同gzip,解压缩的参数
-k:保留原文件,不会删除原始档案(不用再用-c配合数据流重定向达到这一目的)
-z:压缩的参数
-v:同gzip,显示原档案/压缩文件案的压缩比等信息
-#:同gzip,#代表一个数字,用于设置压缩等级,-9最佳压缩比,-1最快压缩
示例1:用bzip2压缩/tmp/man_db.cp
这里写图片描述
如图,这里我没有加-z的压缩参数,这个效果和bzip2 -z man_db.cp是一样的。
示例2:读取man_db.cp.bz2档案内容
输入bzcat man_db.cp.bz2

注:这里的bzcat和zcat功能一样,也是读取压缩文件解压缩后的内容,但这个读取过程中并没有对压缩文件做解压缩操作。

《鸟哥的Linux私房菜》chapter9 20180818~20180826_第4张图片
示例3:将示例1的/tmp/man_db.cp.bz2解压缩
这里写图片描述
示例4:分别用compress,gzip和bzip2压缩/tmp/man_db.cp,保留原文件,设置gzip和bzip2的压缩等级分别为-1,-5,-9,对比压缩比
执行下列指令
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第5张图片
如图所示,由于bzip2产生的压缩文件名重复,因此我对bzip2每个压缩等级产生的压缩文件都重命名了。结果如图所示
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第6张图片
在同一个压缩等级下,bzip2的压缩比要比gzip压缩比高,而这3种压缩工具里压缩比最低的是compress。
bunzip2指令的功能相当于bzip2 -d,可以用bunzip2指令解压缩
示例5:用bunzip2指令对示例4中产生的man_db.cp9.bz2,man_db.cp9.gz,man_db.cp.compress解压缩。
这里写图片描述
这里写图片描述
如图所示,我们发现bunzip2指令无法对gzip压缩文件和compress压缩文件解压缩。在这里点上,bzip2就不及gzip。

1.3 打包指令tar

前面提到的压缩指令大多只能对单一档案进行压缩,虽然gzip和bzip2也能对目录进行压缩,但这两个指令对目录的压缩指的是对目录下每个文件分别进行压缩,产生很多压缩文件,如果我们想对很多文件进行压缩,仅生成1个压缩文件,这就需要用到打包指令tar。
tar的作用是将多个档案打包成1个档案,通过压缩指令bzip2或gzip的支持,就能实现将多个档案压缩成1个压缩文件的功能了。.tar.gz后缀名的压缩文件也能被winrar解压缩。

1.3.1 tar的语法和参数

打包与压缩:tar [-j|-z] [cv] [-f 建立的档名] filename
查看档名:tar [-j|-z] [tv] [-f 建立的档名]
解压缩:tar [-j|-z] [xv] [-f 建立的档名] [-C 目录]
-c:建立打包档案,搭配-v来查看过程中被打包的档名
-t:查看打包档案的内容含有哪些档名
-x:解打包或解压缩功能,搭配-C可以在特定目录中解开

注:-c,-t,-x三个参数不能出现在同一条指令中,因为这三个参数代表了不同的三个动作。因此我们这边也把它们分成3条不同的语句来写。

-j:通过bzip2的支持进行压缩/解压缩,此时档名最好为*.tar.bz2
-z:通过gzip的支持进行压缩/解压缩,此时档名最好为*.tar.gz
-v:在压缩或解压缩的过程中将正在处理的文件名显示出来
-f filename:-f后面接要被处理的档名
-C 目录:在特定目录下解压缩
后续练习会使用到的选项介绍
-p:保留备份数据的原本权限和属性,常用于备份-c重要的配置文件
-P:保留绝对路径,允许备份数据中含有根目录的存在
–exclude=FILE:在压缩过程中,不要将FILE打包
tar并不会主动建立档名,需要我们自定义档名。

1.3.2 tar的基本用法示例

示例1:使用tar加入-j或-z的参数备份/tmp目录
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第7张图片
如图所示,-p参数是保留原本档案的权限和属性,-j表示在bzip2的支持下压缩,-cv表示建立打包档案并在打包过程中显示档名。
示例2:查看示例1中tmp.tar.bz2中有哪些档名
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第8张图片
如图所示,指令中加入了-v选项,详细的权限和属性都会被罗列出来。同时我们发现,列出来的每个档名都没有根目录,这也就是示例1中出现的警告信息tar:Removing leading ‘/’ from member names所描述的,在打包压缩的时候就移除了所有档案的根目录。

1.3.3 tar:移除根目录和未移除根目录的解打包路径

移除根目录是为了安全。移除了根目录,解压后的档名是相对路径,解压时在哪个目录下解压,档案的档名前面就被加上该目录,比如我在/root目录下解压,档名就变成/root/tmp/xxx。如果没有拿掉根目录,解压后的档名是绝对路径,一定会被放到压缩前的目录,覆盖掉原本的数据。
示例3:备份根目录到tar的档案中,并在gzip的支持下压缩
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第9张图片
查看tar档案中的档名
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第10张图片
示例4:将示例1中的/root/tmp.tar.bz2解打包到/home/huyan目录下
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第11张图片
如图所示,去/home/huyan目录下查找tmp目录
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第12张图片
如图所示,解打包后原来的压缩文件/root/tmp.tar.bz2依然存在
这里写图片描述
示例5:将示例3中产生的/root/tmp.tar.gz解打包到/home/huyan目录下(让我们看看未移除根目录的打包文件,规定其解打包的路径,最后解打包到哪个路径下)
为了防止解打包到原来路径下看不出来,我们先去原来的路径修改个别文件名。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第13张图片
执行解打包指令,注意要加上参数-P,才是保留根目录的操作
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第14张图片
当前目录为/etc,指定解压目录为/home/huyan,原始目录为/tmp/test,执行上面的语句后,我们在原始目录/tmp/test下找到了解打包后的文件,如下图所示
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第15张图片

注:这里这些文件没有覆盖原始文件的原因是目录名与原始文件已经不同了(因为之前修改过原始文件的目录名)

示例6:在/home/huyan下将示例1中的/root/tmp.tar.bz2文件解打包,不指定路径
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第16张图片
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第17张图片
如图所示,解打包后文件在当前路径下
结论:当用-C指定解打包路径后,保留根目录的文件解打包到原始路径覆盖原目录,而不是指定路径。未保留根目录的文件解打包到指定路径,而不指定解打包路径时,去除根目录的文件解打包到当前路径。
补充说明:利用rm -rf指令可以删除整个目录没有任何询问。不管该目录下有没有数据。这是很危险的指令。
利用rm -rf指令删除/home/huyan目录下的tmp
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第18张图片

1.3.4 tar:对指定单一档案解打包

示例7:对/root/tmp.tar.gz档案中的testaa档案解打包
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第19张图片
如图所示,在打包文件后面加上欲解打包的文件名,就能对单个打包档案中的单个档案解打包。如下图,在test目录下只有testaa一个档案被解打包出来了。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第20张图片

1.3.5 tar:对指定档案不打包

示例8:打包某目录,但对该目录下某个档案不打包的做法。打包/tmp/test目录,但不打包该目录下的passwd.patch档案和testaa档案。/tmp/test目录内容如图所示
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第21张图片
如图所示,利用–exclude=FILE参数很容易做到这一点
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第22张图片
查看打包档案内容并没有包含/tmp/test/testaa和/tmp/test/passwd.patch档案
这里写图片描述

1.3.6 tar:备份比某个时间点更新的档案

示例9:仅备份比/tmp/test/ta要新的档案
这里写图片描述
如图,利用find /etc -newer /tmp/test/ta找出这些比/tmp/test/ta要新的档案
找到/tmp/test/ta的修改日期
这里写图片描述
执行打包命令
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第23张图片
查看档案内的档名
这里写图片描述
如图所示,连/tmp/test/ta本身都被打包进去了。

1.3.7 基本名称:tarfile和tarball

  • 对一堆档案进行打包,不压缩,打包后产生的档案是tarfile
  • 对一堆档案进行打包并压缩,打包后产生的档案是tarball

Tar除了可以将资料打包成档案外,还可以打包到特殊装置去,比如磁带机(tape)。磁带机由于是一次性读取/写入装置,我们不能用类似cp的指令去复制。但是我们可以使用tar指令。例如要将/home,/root,/etc三个目录备份到磁带机(/dev/st0)时,就可以使用下列指令:tar -jcv -f /dev/st0 /home /root /etc。

1.3.8 特殊应用:利用管线命令和数据流

示例1:将/tmp/test边打包边在/home/huyan解开
输入指令tar -cvf - /tmp/test|tar -xvf - -C /home/huyan
该管道命令中都以-来指代打包后的文件名,可以把-理解成一个缓冲区,这个命令实现了将/tmp/test目录下的所有资料直接copy到/home/huyan目录下。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第24张图片

1.4 完整备份工具

1.4.1 完整备份工具dump

dump可以备份整个文件系统,也可以备份目录并制定备份等级。
将实时文件系统备份,备份等级为level0。下次备份时,实时文件系统与leve0比较,备份有变化的文件,备份等级level1。下下次备份时,实时文件系统与level1比较,备份有变化的文件,备份等级level2。以此类推。

1.4.1.1 dump的语法和参数

dump [-Suvj] [-level] [-f 备份文件] 待备份数据
dump –W
-S:仅列出后面的待备份数据需要多少磁盘空间才能备份完毕
-u:将这次dump的时间记录到/etc/dumpdates文件中
-v:将dump的文件过程显示出来
-j:加入bzip2的支持,将数据进行压缩,默认bzip2的压缩等级为2
-level:level代表一个数字,就是我们谈到的等级,从-0~-9共10个等级
-f:后面接产生的文件,可接例如/dev/st0设备文件名等
-W:列出在/etc/fstab里面具有dump设置的分区是否有备份过

1.4.1.2 dump的限制

虽然dump支持备份整个文件系统和单一目录,但对于目录的支持是比较不足的,会有以下不同的限制情况:
当备份数据为单一文件系统时,可以使用完整的dump功能,包括利用0-9的level来备份,同时可以备份到挂载点或者是设备文件名。
当备份数据为目录时,备份就有限制
仅能使用level0,即仅支持完整备份。不支持-u参数,即无法创建/etc/dumpdates这个level备份的时间记录文件。

1.4.1.3 用dump备份完整的文件系统

假如你要将系统中最小的文件系统备份,该怎么操作呢?

注:CentOS 7的默认文件系统是XFS,XFS文件系统需要用xfsdump和xfsrestore指令备份。后面我会补充这两个指令。

首先执行df -hT指令找出系统中最小的文件系统
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第25张图片
如图所示,我们看到在我的机器上最小的文件系统是/dev/sda3,注意,这里显示/dev/sda3是ext2文件系统,因此我可以用dump做备份。/dev/sda3的挂载点是/media
执行下列指令测试一下,备份/dev/sda3需要多少容量
dump -S /dev/hdc1
这里写图片描述
结果的单位是byte,我们将它转换为MB,为59M。
执行下列指令进行备份
dump -0u -f /root/media.dump0 /media
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第26张图片
这里待备份数据用/media和用/dev/sda3都是可以的。该指令执行时屏幕上会打出一系列dump执行过程。
最后我们来验证一下/media是否真的被备份了
这里写图片描述
观察/etc/dumpdates中的数据
这里写图片描述
这样/media目录level0的备份数据就被建立起来了。那么我们如何建立/media目录level1的数据呢?
首先执行下列指令查看一下被dump过的文件系统资料,该指令会找出在/etc/fstab档案的第五字段有设定需要dump的文件系统,然后与/etc/dumpdates比对,得出结论。
如图所示,是/etc/fstab中的内容
这里写图片描述
dump –W
这里写图片描述
如图所示,我的linux系统中只有/dev/sda3和/dev/sda5这两个文件系统是ext2文件系统,而这两个文件系统在/etc/fstab中都显示需要备份,对比/etc/dumpdates的记录,就能查出被dump备份过的文件系统是哪个。
为了对比level0和level1,我们先在/media内建立2M的差异档
dd if=/dev/zero of=/media/test bs=512k count=4
这里写图片描述
然后用level1对/boot进行再次备份
dump -1u -f /root/media.dump1 /media
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第27张图片
最后查阅一下/root/media*的档案,对比一下两者大小差异。我们发现media.dump1备份的是我们刚刚增加的/media/test文件的大小,而没有把原有的50K备份下来,这就是增量备份。
这里写图片描述
如图,/etc/dumpdates内的记录也多了一条。

1.4.1.4 用dump备份单一目录

用dump备份/var/test目录,并含有压缩功能。
执行下列指令:dump -j -f /root/vartest.dump.bz2 /var/test
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第28张图片
一般用dump指令不会使用其压缩功能,但是如果你想将备份空间降低的话,可以使用压缩功能。

1.4.2 XFS文件系统的备份指令xfsdump

下面我们来介绍XFS文件系统自带的备份指令xfsdump。
xfs备份级别:

代码 级别 意义
0 完全备份 每次都能把指定的目录完全复制一遍,不管目录内容有没有变化
1-9 增量备份 每次将前一次备份后有变化的文件进行备份

注:还有一种备份是差异备份,对比第一次完整备份,将有变化的文件进行备份。

xfsdump的语法和参数和dump相差不大,这边就不详细介绍了。

1.4.2.1 示例1:用xfsdump备份完整的文件系统

《鸟哥的Linux私房菜》chapter9 20180818~20180826_第29张图片
如图所示,先用df -h指令找出最小的文件系统,我这边最小的文件系统是/dev/sda1,挂载点为/boot。然后执行指令xfsdump -0 -f /root/boot.xfsdump0 /boot进行备份,执行后会让你输入备份会话标签和备份标签。这个备份标签相当于让你对备份做一个描述。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第30张图片
如图所示,这样,我们对/boot的完整备份就做好了。
这里写图片描述
接下来我们来做/boot的level1备份,首先新建30M的差异档,方便我们对比level0和level1
这里写图片描述
然后我们对现在的/boot进行level1备份。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第31张图片
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第32张图片
备份完成了,接下来我们来比较/root/boot.xfsdump0和/root/boot.xfsdump1的差异
这里写图片描述
如图所示,我们发现level1的备份文件大小为31M,很明显没将level0备份过的文件备份下来。Level1备份的仅是我们刚刚新建的30M大小的文件。
备份成功后,我们可以在/var/lib/xfsdump/inventory/目录下查看备份档案信息
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第33张图片
同时,我们也可以执行指令xfsdump -I来查看备份信息
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第34张图片
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第35张图片
这是我备份的level0和level1的备份信息。

1.4.2.2 示例2:用xfsdump备份单一目录

将/boot/huyan目录备份到/root目录下,命名为/root/huyan.xfsdump0,如图所示,这是我要备份的/boot/huyan目录下的内容
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第36张图片
执行下列语句对/boot/huyan进行备份
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第37张图片
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第38张图片
-s后面接的目录树写法有点特殊,必须要接相对路径,也就是说目录开头和结束都不能是/。我这里写的是-s huyan /boot。
这里写图片描述
用xfsdump -I指令查看如图所示
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第39张图片
上面备份目录没有加-l 0,默认是完整备份。我们对/boot/huyan进行level1备份然后对比来看。
这里写图片描述
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第40张图片
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第41张图片
查看level0和level1的备份档案,对比大小
这里写图片描述
我们发现,虽然我们的指令用了增量备份的格式,可是系统并没有对目录进行增量备份,而是完全备份了。

1.4.2.3 xfsdump指令限制

  • xfsdump指令备份目录时不能增量备份,只能完整备份。
  • xfsdump指令只能备份已挂载的文件系统,不能备份未挂载的文件系统。
  • xfsdump指令只能备份XFS文件系统
  • xfsdump指令备份下来的数据只能让xfsrestore指令解析
  • xfsdump指令必须使用root权限才能操作
  • xfsdump指令-s参数后面必须跟相对路径,也就是说备份时必须要进入要备份的目录下
  • xfsdump指令是通过文件系统的UUID来分辨备份档的,因此不能备份两个具有相同UUID的文件系统。

1.4.3 恢复指令restore

dump的恢复使用的是restore这个命令。

1.4.3.1 Restore的语法和参数

查看模式:restore –t [-f dumpfile] [-h]
比较模式:restore –C [-f dumpfile] [-D 挂载点]
互动模式:restore –i [-f dumpfile]
还原模式:restore –r [-f dumpfile]
-t:此模式用在查看dump备份文件中含有什么重要数据,类似tar –t功能。
-f:后面接dump备份文件。
-h:查看完整备份数据中的inode与文件系统label等信息。
-C:此模式可以将dump备份文件内的数据拿出来跟实际的文件系统做比较。
-D:与-C进行搭配,可以查出后面接的挂载点与dump备份文件内不同的文件。
-i:进入互动模式,可以仅还原部分文件,用在dump备份目录时的还原。
-r:将整个文件系统还原的一种模式,备份整个文件系统后的还原。将备份后的数据还原到本目录下。

1.4.3.2 用restore查看dump后的备份数据内容

用restore查看dump备份文件/root/media.dump0
执行指令restore –t –f /root/media.dump0
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第42张图片
用restore查看dump备份文件/root/vartest.dump.bz2
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第43张图片
如图所示,dump tape is compressed说明文件有压缩。

1.4.3.3 比较差异并还原整个文件系统

就是因为dump能够查询文件系统和备份文件之间的差异,并且将分析到的差异数据进行备份,所以dump才可以进行增量备份。
还原/media文件系统
我们先修改/media目录下的数据
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第44张图片
如图,我对/media文件系统下的2个文件都进行了改名,然后我们用备份文件/root/media.dump0和/root/media.dump1还原它。
执行指令restore –C –f /root/media.dump0比较当前文件系统和完整备份时的差异
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第45张图片
如何还原整个文件系统呢,因为dump是记录整个文件系统的,因此还原时你也应该要给予一个全新的文件系统才行。因此我们先新建一个文件系统。
fdisk /dev/sda
让核心重新读取分区表
partprobe
格式化文件系统
mkfs –t ext3 /dev/sda6
挂载文件系统
mount /dev/sda6 /mnt
进行还原操作(一定要在新文件系统的挂载点下面操作)
cd /mnt
restore –r –f /root/media.dump0
如果想将level1的备份级别的数据也还原的话,继续使用还原指令
restore –r –f /root/media.dump1

1.4.3.4 仅还原部分文件的restore互动模式

/media文件系统内的数据如图所示
这里写图片描述
如果你只是想把备份文件内的某个内容找出来还原,并不想要全部还原备份文件,可以用restore的互动模式。下面我们用/root/media.dump0这个备份文件来说明。假如我们要找出/root/media.dump0中的lost+found。执行下列语句。
我们回到新文件系统的挂载点下面进行还原:cd media
开启restore的互动模式:restore –i –f /root/media.dump0。然后我们就进入了互动模式,这个互动模式跟磁盘分区指令fdisk有点像,我们可以通过在互动模式中输入help来查看互动模式中的一些指令。
ls [arg]:列出etc.dump内的文件或目录
cd arg:在etc.dump内变更目录
pwd:列出当前所在目录
add file:将file加入到等下要解压缩的文件列表中
delete file:将file从要解压缩的文件列表中删除
extract:开始将刚才选择的文件列表解压缩
quit:退出互动模式
这些指令很好记,都是Linux中常用的命令,功能都一样。
假设我们要在media.dump0的交互模式下找到lost+found文件
输入ls lost+found,系统就会列出这个文件,以证明它存在。
将这个文件加入到解压缩列表,输入add lost+found。然后输入extract还原解压缩列表里的文件就行了。
如图所示,我们发现lost+found文件出现在/media目录下面,只不过没有覆盖原文件。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第46张图片
同样对/media的level1增量备份文件/root/media.dump1做这样的操作,把/media/test文件恢复回来。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第47张图片
如图所示,当我们把test档案加入到解压缩列表中后,再次用ls指令查看test文档会发现文档带了*星号,这代表该文档在解压缩列表中,是要被恢复的文件。
此时执行extract,系统会询问你specify next volume # (none if no more volume):,这里输入1,表示的是在单独的磁盘空间上进行的还原。然后系统会询问set owner/mode for ‘.’?,这里输入n,表示不需要修改权限。
然后执行quit指令退出交互模式,这时我们就发现被解压出来的test文件出现在挂载点下面。

1.4.4 XFS文件系统的恢复指令xfsrestore

1.4.4.1 xfsrestore的语法和参数

查看所有备份文件资料:xfsrestore –l
单一档案全系统复原:xfsrestore [-f 备份档] [-L session_label] [-s 待恢复档案] 恢复到哪个目录
通过增量备份文件复原目录:xfsrestore [-f 备份档] –r 恢复到哪个目录
互动模式恢复部分文件到指定目录:xfsrestore[-f 备份档] –i 恢复到哪个目录

1.4.4.2 对文件系统的增量恢复

如图所示,我已经有两个文件系统备份文件/root/boot.xfsdump0和/root/boot.xfsdump1。其中boot.xfsdump1是boot.xfsdump0的增量备份文件。
这里写图片描述
而level1相对level0增加了/boot/test这个档案,大小为5M
这里写图片描述
此时,我将/boot/test文件删除,使系统回到level0状态,然后用xfsrestore将系统恢复到level1状态。
这里写图片描述
首先,我们先使用xfsrestore –f sourcefile –t指令来看看我们即将要利用的备份文件的内容
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第48张图片
如图所示,在备份文件里,我们找到了被备份的/boot/test档案,现在就来还原它
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第49张图片
此时我们再去查看/boot/test档案是否存在
这里写图片描述

1.4.4.3 对整个文件系统的恢复

对/boot文件系统进行备份
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第50张图片
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第51张图片
然后我将/boot/test1删除,并将/boot/test2重命名/boot/test222,将/boot/test3重命名/boot/test333。用xfsrestore将/boot还原
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第52张图片
用ls –al查看/boot内的档案,发现test1,test2和test3已经还原回来了,但是原文件test222和test333还存在。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第53张图片

1.4.4.4 仅复原备份档单一文件到指定目录

如果我们想仅复原备份档/root/boot.xfsdump0中的test1到/home/huyan目录下,该怎么做呢
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第54张图片
如图所示,只需要加-s 欲恢复的文件 目标目录这个参数就可以了。如下图所示,/home/huyan/test1就存在了
这里写图片描述

1.4.4.5 互动模式复原部分目录

复原/root/boot.xfsdump0中的test1,test2,test3这三个档案到/home/test目录下
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第55张图片
如图,新建好目标目录/home/test,然后执行xfsrestore指令进入互动模式。屏幕上会直接打印出互动模式中可用的指令。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第56张图片
如图所示,我们想要检索test1,test2,test3,不可以用ls test*这种写法,也不可以用ls test1 test2 test3这种写法。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第57张图片
被加入恢复列表的文件前面会出现一个星号*。执行extract进行恢复。
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第58张图片
如图所示,这三个文件已经被恢复到指定目录下了。

1.5 光盘写入工具

命令行刻录行为的处理过程:
先将所需要备份的数据构建成一个镜像文件(iso),利用mkisofs命令来处理。
将该镜像文件刻录至光盘或DVD中,利用cdrecord命令来处理。

1.5.1 新建镜像文件:mkisofs

mkisofs的语法和参数
mkisofs [-o 镜像文件] [-rv] [-m file] 待备份文件.. [-V vol] –graft-point isodir=systemdir …
-o:后面接你想要产生的镜像文件名
-r:通过Rock Ridge产生支持UNIX/LINUX的文件数据,可记录较多的信息
-v:显示构建ISO文件的过程
-m file:-m为排除文件(exclude)的意思,后面接的文件不备份到镜像文件中
-V vol:新建volume
-graft-point:graft有转嫁或移植的意思,相关数据在下面文章内说明。
光盘的格式为iso9660,这种格式一般仅支持旧版的dos文件名,即文件名只能以8.3(文件名8个字符,扩展名3个字符)的方式存在。加上-r参数后,文件信息能够被记录得比较完整,可包括UID/GID与权限等。所以记得加上-r参数。
一般在默认情况下,所有要被加入到镜像文件中的文件都会被放置在镜像文件的根目录,这样容易造成刻录后文件分类不易的情况,所以我们可以使用-graft-point这个参数来定义位于镜像文件中的目录。例如:
镜像文件中的目录所在=实际Linux文件系统的目录所在
/movies/=/srv/movies/(在Linux的/srv/movies内的文件,加至镜像文件中的/movies/目录)
/linux/etc=/etc(将Linux中的/etc/内的所有数据备份到镜像文件中的/linux/etc/目录)
示例1:将/root,/home,/etc目录内的数据全部刻录到镜像文件中
这里写图片描述
中间省略……
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第59张图片
如下图所示就是生成的镜像文件
这里写图片描述
让我们把这个镜像文件挂载到/home目录下查看里面的内容
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第60张图片
如图所示,产生的镜像文件中各种文件斑驳杂乱没有目录和分类。此时我们可以用-graft-point来处理。
这里写图片描述
中间省略……
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第61张图片
让我们把生成的镜像文件挂载到/home目录下查看一下内容
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第62张图片
如图所示,该镜像文件内部目录非常明确了。

1.5.2 光盘刻录工具:cdrecord

cdrecord的语法和参数
查询刻录机位置:cdrecord –scanbus dev=ATA
抹除重复读写片:cdrecord –v dev=ATA:x,y,z blank=[fast|all]
格式化DVD+RW:cdrecord –v dev=ATA:x,y,z –format
刻录:cdrecord –v dev=ATA:x,y,z 可用参数功能 file.iso
-scanbus:扫描磁盘总线找出可用的刻录机,后续的设备为ATA接口
-v:在cdrecord运行过程中显示过程
dev=ATA:x,y,z:x,y,z为刻录机位置,非常重要
blank=[fast|all]:blank为抹除可重复写入的CD/DVD-RW,使用fast较快,all较完整
-format:仅针对DVD+RW这种格式的DVD而已
-data:指定后面的文件以数据格式写入,而不是以CD音轨(-audio)方式写入
speed=X:指定刻录速度,如CD可用speed=40为40倍数,DVD则可用speed=4
-eject:指定刻录完毕后自动退出光盘
fs=Ym:指定多少缓冲存储器,可用在将镜像文件暂存至暂存区,默认为4M,一般建议可增加至8M,不过还是得视刻录机而定
针对DVD的参数功能:
driveropts=turnfree:打开buffer underrun free模式的写入功能
-sao:支持DVD-RW格式
示例1:检测你的刻录机所在位置
执行下列语句:cdrecord –scanbus dev=ATA
假设扫描到一台刻录机的位置在ATA:1,1,0这个地方,我们要将/tmp/system.img刻录到CD/DVD里面去,这里先以CD为例。
示例2:进行CD的刻录操作
执行下列语句抹除光盘的原始内容:cdrecord –v dev=ATA:1,1,0 blank=fast
开始刻录:cdrecord –v dev=ATA:1,1,0 fs=8m –dummy –data /tmp/system.img
刻录完毕后测试挂载一下:
mount –t iso9660 /dev/cdrom /mnt
df –h /mnt
ll /mnt
卸载光盘:umount /mnt
示例3:进行DVD-RW的刻录操作
先抹除一下原本的内容:cdrecord –v dev=ATA:1,1,0 blank=fast
开始写入DVD,注意有些参数和CD不同了:cdrecord –v dev=ATA:1,1,0 fs=8m –data –sao driveropts=burnfree /tmp/system.img
刻录完毕后挂载测试一下:
mount /dev/cdrom /mnt
df –h /mnt
卸载DVD:umount /mnt

1.6 其他常见的压缩与备份工具

1.6.1 dd

之前,我们都将dd指令用作制作一个指定大小的文件,但其实dd最大的功能在于备份。
dd的语法和参数
dd if=input_file of=output_file bs=block_size count=number
if:input file,也可以是设备
of:output file,也可以是设备
bs:规划的一个block的大小,若未指定,默认是512bytes(一个扇区的大小)
count:有多少个bs的意思
示例1:将/etc/passwd备份到/tmp/passwd.back
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第63张图片
示例2:将自己磁盘的第一个扇区备份下来
这里写图片描述
磁盘的第一个扇区内含有MBR和分区表,通过这个操作,我们可以一口气将这个磁盘的MBR和分区表进行备份。
示例3:找出你系统最小的那个分区并将它备份下来
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第64张图片
这里写图片描述
你可以说,tar用来备份关键数据,而dd则可以用来备份整块分区或者整块硬盘,如果要将数据填回到文件系统中,可能需要考虑到原本的文件系统才能成功。
示例4:你想要将你的/dev/hdc1完整得复制到另一个分区上,请使用你系统上未分区的空间再新建一个与/dev/hdc1差不多大小的分区(只能比/dev/hdc1大不能比它小),然后将之进行完整地复制(包括需要复制启动扇区的区块)
先进行分区操作:fdisk /dev/hdc得到/dev/hdc9这个新分区
核心读取分区表:partprobe
不需要格式化,直接进行扇区表面的复制:dd if=/dev/hdc1 of=/dev/hdc9
将新分区挂载测试:mount /dev/hdc9 /mnt
使用df指令查看比较/dev/hdc1和/dev/hdc9,发现两个分区一模一样。
卸载分区:umount /mnt
不需要经过格式化,dd指令可以将原本旧分区中的扇区表面数据整个复制过来,连同super block,boot sector,meta data等全部也会复制过来。

1.6.2 cpio

cpio可以备份任何东西,包括设备文件,但是cpio不会主动去找文件来备份,需要配合类似find等可以根据文件名找到文件的命令来告知cpio该被备份的数据在哪里。
cpio的语法和参数
备份:cpio –ovcB>[file|device]
还原:cpio –ivcdu<[file|device]
查看:cpio –ivct<[file|device]
备份会使用到的参数
-o:将数据copy输出到文件或设备上
-B:让默认的blocks可以增加至5120bytes,默认是512bytes。这样做的好处是可以让大文件的存储速度加快
还原会使用到的参数
-i:将数据从文件或设备复制到系统中
-d:自动新建目录。使用cpio所备份的数据内容可能在不同层目录中,因此我们必须要让cpio在还原时可以新建新目录。
-u:自动将较新的文件覆盖旧文件
-t:需要配合-i参数,查看以cpio新建的文件或设备的内容
一些可共享的参数
-v:让存储的过程中文件名可以在屏幕上显示
-c:以一种较新的portable format方式存储
示例1:找出/boot下面所有文件,然后将他们备份到/tmp/boot.cpio,然后将备份的文件在/root目录下解开
这里写图片描述
中间省略……
《鸟哥的Linux私房菜》chapter9 20180818~20180826_第65张图片
将备份的文件/tmp/boot.cpio在/root目录下解开
注:这一步操作和鸟哥写的不一样,执行cpio –idvc cpio –idvcu 但是我们发现,备份文件没有被还原到/root目录下,而是被还原到原来的位置去了。所以用ll /root/boot指令会提示没有该路径。

你可能感兴趣的:(《鸟哥的Linux私房菜》)