DomBro Studio

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

2017/12/11

目录

在Linux下面有相当多的压缩指令命令可以运行操作。这些压缩指令命令可以让我们更方便地从网络上面下载大型的文件呢!此外,我们知道在Linux下面的扩展名是没有什么很特殊的意义的,不过,针对这些压缩指令命令所做出来的压缩文件,为了方便记忆,还是会有一些特殊的命名方式。

1. 压缩文件的用途与技术


文件太大会导致占据过大的磁盘空间,从网上下载资源时文件过大也会导致传输速度变慢。文件压缩技术就可以解决这类问题。较大型的文件通过文件压缩,可以将它的磁盘使用量降低,可以达到减低文件大小的效果,有的压缩程序还可以进行大小限制,是一个大型文件分成数个小型文件。

目前计算机系统中都是使用 byte 单位来计量,但计算机最小单位是 bit ,且 1byte=8bit 这意味着每个 byte 当中会有 8 个空格,每个空格可以是 0或1 。当我们将数据记录到计算机,为了满足操作系统数据的访问会将数据转为 byte 的形态来记录,这意味着当数据不满足 1byte 大小,该 byte 里面会有很多拿来“补位”的空格。一些计算机工程师利用复杂的计算方式,将这些没有使用到的空间丢出来,让文件占用的空间变小,这就是压缩技术。


2. Linux 系统常见的压缩命令

Linux 支持的压缩命令非常多,且不同的命令所用的压缩技术命不相同,当然彼此之间就无法相互压缩/解压缩文件。所以,虽然文件扩展名在 Linux 中并没什么卵用,但为了让我们人类知道某个压缩文件是那种压缩命令制作出来的,好用来对照着解压缩,所以压缩文件的扩展名还是 hin 有必要滴。以下是几个常见的压缩文件扩展名:

1
2
3
4
5
6
*.Z compress程序压缩文件(已经不流行,淘汰啦!)
*.gz gzip程序压缩的文件;
*.bz2 bzip2程序压缩的文件;
*.tar tar程序打包的数据,并没有压缩过;
*.tar.gz tar程序打包的文件,其中经过gzip的压缩;
*.tar.bz2 tar程序打包的文件,其中经过bzip2的压缩。

Linux 中最常见的压缩命令就是 gZip和bzip2

2.1 gZip,zcat

gZip 是应用最广的压缩命令。目前 gZip 可以解开 compress,Zip 与gZip等软件压缩文件。以下是命令语法:

1
2
3
4
5
6
7
8
9
10
[root@www~]#gzip [-cdtv#] 文件名
[root@www ~]# zcat 文件名.gz
参数:
-c :将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性,看看文件有无错误;
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :压缩等级,-1最快,但是压缩比最差,-9 最慢,但是压缩比最好默认是 –6。
```
- 范例:使用 gZip 进行压缩,默认状态下原文件会被压缩成 .gz 文件,原文件就不存在了。

[root@www ~]#cd /tmp
[root@www tmp]#cp/ etc/man.config .
[root@www tmp]#gzip -v man.config
man.config: 56.1% – replaced with man.config.gz
[root@www tmp]# ll /etc/man.config /tmp/man*
-rw-r–r–1root root 4617 Jan 6 2007 /etc/man.config
-rw-r–r–1root root 2057 Nov 10 17:14 /tmp/man.config.gz <==gzip压缩比较佳

1
2

- 范例:用 zcat 将上一范例压缩的文本文件读出来

[root@www tmp]# zcat man.config.gz

此时屏幕上会显示该压缩文件解压后的文件内容。

zcat可以读取纯文本文件被压缩后的压缩文件。

1
2

- 范例:将第一个范例的文件解压缩

[root@www tmp]#gzip -d man.config.gz

与gzip相反,gzip -d 会将原本的 .gz 删除,产生原本的 man.config 文件。

1
2

- 范例:将上一范例解压缩的文件用最佳压缩比压缩,并保留原来的文件

[root@www tmp]#gzip -9 -c man.config > man.config.gz

#其实gzip的压缩已经优化过了,所以虽然gzip提供1~9的压缩等级,不过使用默认的6就非常好用了。因此上述的范例四可以不要加入那个-9的参数。

#范例的重点在那个-c与>的使用。

1
2
3
4

<h3 id="2.2">2.2 bzip2,bzcat</h3>

如果gzip是为了替代compress并提供更好的压缩比而成立的,那么bzip2则是为了取代gzip并提供更佳的压缩比而来的。bzip2真是很不错的东西,这玩意的压缩比竟然比gzip还要好。至于bzip2的用法几乎与gzip相同。

[root@www ~]#bzip2[-cdkzv#] 文件名
[root@www ~]# bzcat 文件名.bz2
参数:
-c :将压缩过程中产生的数据输出到屏幕上;
-d :解压缩的参数;
-k :保留原文件,而不会删除原始的文件;
-z :压缩的参数;
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :与gzip同样的,都是在计算压缩比的参数,-9 最佳,-1最快。

1
2

- 范例: 将文件以 bzip2 进行压缩

[root@www tmp]#bzip2-z man.config

此时 man.config 会变成 man.config.bz2

1
2

- 范例:将上一范例内容读出来

[root@www tmp]# bzcat man.config.bz2

此时屏幕上会显示 man.config.bz2 解压缩之后的文件内容。

1
2

- 范例: 将第一个范例的文件解压缩

[root@www tmp]#bzip2 -d man.config.bz2

1
2

- 范例: 用最佳压缩比压缩,并保留原文件

[root@www tmp]#bzip2 -9 -c man.config > man.config.bz2

1
2
3
4
5
6
7
8
9
10


<h2 id="3">3. 打包命令 tar</h2>

上面提到的 gip、bzip2大多仅针对单一文件来进行压缩。而将多个文件过目录包成一个大文件的命令功能,称他为 "打包命令" 。Linux 下面这种打包命令就是大名鼎鼎的 **tar** 。 **tar 不仅可以将多个目录或文件打包成一个大文件,还可以通过 gZip/bzip2 的支持,将该文件同时进行压缩**。目前 Windows 的WinRAR 也支持 .tar.gz 文件名的解压缩。


<h3 id="3.1">3.1 tar</h3>

tar 的参数很多,具体可以找男人 man 一下

[root@www ~]#tar [-j|-z] [cv] [-f 新建的文件名] filename… <==打包与压缩
[root@www ~]#tar [-j|-z] [tv] [-f新建的文件名] <==查看文件名
[root@www ~]#tar [-j|-z] [xv] [-f 新建的文件名] [-C 目录] <==解压缩
参数:
-c :新建打包文件,可搭配 -v 来查看过程中被打包的文件名(filename)。
-t :查看打包文件的内容含有哪些文件名,重点在查看文件名。
-x :解打包或解压缩的功能,可以搭配 -C(大写) 在特定目录解开。
特别留意的是,-c, -t, -x 不可同时出现在一串命令行中。
-j :通过bzip2的支持进行压缩/解压缩,此时文件名最好为 .tar.bz2。
-z :通过gzip的支持进行压缩/解压缩,此时文件名最好为
.tar.gz。
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来。
-f filename:-f 后面要接被处理的文件名。建议 -f 单独写一个参数。
-C 目录 :这个参数用在解压缩时,若要在特定目录解压缩,可以使用这个参数。
其他后续练习会使用到的参数介绍:
-p :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件。
-P :保留绝对路径,即允许备份数据中含有根目录存在之意。
–exclude=FILE:在压缩的过程中,不要将 FILE 打包。

1
2
3
4
5
6
7
8
9
10

- 最简单的使用 tar 就只要记忆下面的方式即可

> 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
filename.tar.bz2 使我们自己取的文件名,tar 并不会主动创建文件名,要我们自定义。所以扩展名就显得很重要了。如果不加 -j|-z 的话,文件名是\*.tar 就行。 使用 -j|-z 最好根据 压缩软件的支持取名为\* .tar.gz或\*.tar.bz2。


- 范例:使用 tar 加入 -j 或 -z 的参数备份 /etc/目录

[root@www ~]#tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/‘ from member names <==注意这个警告消息
/etc/
….中间省略….
/etc/esd.conf
/etc/crontab

由于加上 -v 这个参数,因此正在作用中的文件名就会显示在屏幕上。

如果你可以翻到第一页,会发现出现上面的错误信息,下面会讲解。

至于 -p的参数,重点在于保留原本文件的权限与属性之意。

[root@www ~]#tar -jpcv -f /root/etc.tar.bz2 /etc

显示的消息会跟上面一模一样。

[root@www ~]# ll /root/etc*
-rw-r–r–1root root 8740252 Nov 15 23:07 /root/etc.tar.bz2
-rw-r–r–1root root 13010999 Nov 15 23:01/root/etc.tar.gz

为什么建议你使用 -j 这个参数?从上面的数值你可以知道了吧?

1
2

- 使用 tar 文件的数据内容(可查看文件名),与备份文件名有否根目录的意义

[root@www ~]#tar -jtv -f /root/etc.tar.bz2
….前面省略….
-rw-r–r– root/root 1016 2008-05-25 14:06:20 etc/dbus-1/session.conf
-rw-r–r– root/root 153 2007-01-07 19:20:54 etc/esd.conf
-rw-r–r– root/root 255 2007-01-06 21:13:33 etc/crontab
如果加上-v 这个参数时,详细的文件权限/属性都会被列出来。
如果只是想要知道文件名而已,那么就将-v去掉即可。
从上面的数据我们可以发现一件很有趣的事情,那就是每个文件名都没了根目录了。
这也是上一个练习中出现的那个警告信息“tar:Removing leading /' from member names(删除了文件名开头的/‘)”所告知的情况。

1
2
3
4

去掉根目录的原因主要是为了安全。我们使用tar备份的数据可能会需要解压缩回来使用,在 tar 所记录的文件名(就是我们刚才使用 tar -jtvf 所查看到的文件名)那就是解压缩后的实际文件名。如果去掉了根目录,假设你将备份数据在/tmp 中解开,那么解压缩的文件名就会变成“/tmp/etc/xxx”。但如果没有去掉根目录,解压缩后的文件名就会是绝对路径,即解压缩后的数据一定会被放置到/etc/xxx去。如此一来,你的原本的/etc/下面的数据就会被备份数据所覆盖过去了。

- 将文件名中的根目录也备份下来,并查看以下内分文件内容文件名

[root@www ~]#tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
….中间过程省略….
[root@www ~]#tar -jtf /root/etc.and.root.tar.bz2
/etc/dbus-1/session.conf
/etc/esd.conf
/etc/esd.conf
/etc/crontab

这次查阅文件名不含 -v 参数,所以仅有文件名而已,没有详细属性/权限等参数。

有发现不同点了吧?如果加上-P 参数,那么文件名内的根目录就会存在。不过,个人建议,还是不要加上-P 这个参数来备份。毕竟很多时候,我们备份是为了要未来追踪问题用的,倒不一定需要还原回原本的系统中。所以拿去根目录后,备份数据的应用会比较有弹性,也比较安全。

1
2

- 使用 tar 解打包

[root@www ~]#tar-jxv -f /root/etc.tar.bz2
[root@www ~]# ll
….(前面省略)….
drwxr-xr-x 105 root root 12288 Nov 1104:02 etc
….(后面省略)….
此时该打包文件会在本目录下进行解压缩的操作。所以,你等一下就会在主文件夹下面发现一个名为 etc 的目录

1
2
3
如果想在 /tmp 文件夹下解开这个打包文件,当然可以 `cd/tmp` 但是有一种更简单的方法在指定路径下解压

- 使用 -C 在指定路径下解压缩

[root@www ~]#tar -jxv -f /root/etc.tar.bz2 -C /tmp
[root@www ~]# ll /tmp
….(前面省略)….
drwxr-xr-x 105 root root 12288 Nov 1104:02 etc

1
2
3


- 仅解开单一文件

1. 先找到我们要的文件名,假设解开 shadow 文件好了:

[root@www ~]#tar -jtv -f /root/etc.tar.bz2 |grep’shadow’
-r——– root/root 1230 2008-09-29 02:21:20 etc/shadow-
-r——– root/root 622 2008-09-29 02:21:20 etc/gshadow-
-r——– root/root 636 2008-09-29 02:21:25 etc/gshadow
-r——– root/root 1257 2008-09-29 02:21:25 etc/shadow <==这是我们要的。

先找出重要的文件名。其中那个grep是“选取”关键字的功能。

2. 将该文件解开。语法与实际方法如下:

[root@www ~]#tar -jxv -f 打包文件.tar.bz2 待解开文件名
[root@www ~]#tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@www ~]# ll etc
total 8
-r——–1root root 1257 Sep29 02:21shadow <==只有一个文件。

#此时只会解开一个文件而已。不过,重点是那个文件名。你要找到正确的文件名。

在本例中,你不能写成 /etc/shadow ,因为它是记录在 etc.tar.bz2 内的文件名。

1
2

- 打包某目录但不包含该目录下的某些文件做法 --exclude

[root@www ~]#tar -jcv -f /root/system.tar.bz2 –exclude=/root/etc* –exclude=/root/system.tar.bz2 /etc/root

1
2
3
4
5
上面这个例子在打包的时候,将/root/etc* 和本身排除在外进行打包

- 仅备份比某个时刻还要新的文件 --newer-mtime --newer

其中 --newer 表示后续的日期包含 mtime(文件内容更改时间)与ctime(文件站状态如权限与属性更改时间),--newer-mtime 只包含 mtime

[root@www ~]#tar-jcv -f /root/etc.newer.then.passwd.tar.bz2 –newer-mtime=”2008/09/29” /etc/*
….(中间省略)….
/etc/smartd.conf <==真的有备份的文件
….(中间省略)….
/etc/yum.repos.d/ <==目录都会被记录下来
tar: /etc/yum.repos.d/CentOS-Base.repo: file iSunchanged; not dumped

最后一行显示的是“没有被备份的”,也即 not dumped 的意思。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

范例中的仅仅把 /etc/ 文件下,文件内容更改时间 mtime 比 2008/09/29 新的文件进行打包。这个命令是一个对差异文件备份特别方便的命令。


- 基本名称 tarfile tarball


tar 打包出来的文件有没有进行压缩所得到的文件称谓的不同。如果只是打包而已,就是 `tar -cv -f file.tar` 而已,这个文件称之为 tarfile。如果还有压缩支持 `tar -jcv -f file.tar.bz2` 即使用 gZip 或 bZip2 进行压缩压缩,称呼为 tarball。当然,这就是一个基本称谓而已。


此外,tar 除了可以将数据打包成为文件之外,还能够将文件打包到某些特别的设备去,举例来说,磁带机(tape)就是一个常见的例子。磁带机由于是一次性读取/写入的设备,因此我们不能够使用类似 cp 等命令来复制的。那如果想要将/home, /root, /etc 备份到磁带机(/dev/st0)时,就可以使用“tar -cv -f /dev/st0 /home /root /etc”,很简单容易吧?磁带机用在备份(尤其是企业应用)是很常见的工作。



- tar 特殊应用 **利用管道命令与数据流**

在 tar 的使用中,有一种方式最特殊,那就是通过标准输入输出的数据流重定向(standard input/standard output),以及管道命令(pipe)的方式,将待处理的**文件一边打包一边解压缩到目标目录去**。下面是范例

将 /etc 整个目录一边打包一边在 /tmp中解开

[root@www ~]#cd /tmp
[root@www ~]#tar -cvf - /etc |tar-xvf -

这个操作有点像是cp -r /etc /tmp依旧是有其有用途的。

要注意的地方在于输出文件变成 - 而输入文件也变成 - ,又有一个 | 存在。

这分别代表 standard output, standard input 与管道命令。

简单的想法中,你可以将 - 想成是在内存中的一个设备(缓冲区)。

在当前目录下 ll 你会发现,目录下会直接出现 解压后的 etc/

1
2
3
4
5
6
7
8
9
10
11
12

上面的例子中,想要将 /etc 下面的数据直接复制到目前路径下 /tmp,但是又觉得直接复制 cp -r /etc /tmp 有点麻烦,那么就直接以这个方式来打包,其中,命令里面的 - 就是表示那个被打包的文件。由于我们不想让那个中间文件存在,所以就用这个方式来进行复制行为。

- 系统备份范例

系统上有非常多的重要目录需要进行备份,而且其实我们也不建议你将备份数据放置到/root目录下。假设目前你已经知道重要的目录有下面这几个:
/etc/(配置文件)
/home/(用户的主文件夹)
/var/spool/mail/(系统中,所有账号的邮件信箱)
/var/spool/cron/(所有账号的工作调度配置文件)
/root(系统管理员的主文件夹)
/home/loop*不需要备份,而且/root下面的压缩文件也不需要备份,另外假设你要将备份的数据放置到/backups,并且该目录仅有 root 有权限进入。此外,每次备份的文件名都希望不相同,例如使用backup-system-20171011.tar.bz2 之类的文件名来处理。那你该如何处理这个备份数据呢?(请先动手操作试试,再来查看一下下面的参考解答。)

#1. 先处理要放置备份数据的目录与权限:
[root@www ~]# mkdir /backups
[root@www ~]#chmod 700 /backups
[root@www ~]# ll -d /backups
drwx—— 2 root root 4096 Nov 30 16:35 /backups

2. 假设今天是 2017/10/11 ,则新建备份的方式如下:

[root@www ~]#tar -jcv -f /backups/backup-system-20171011.tar.bz2 \

–exclude=/root/.bz2 –exclude=/root/.gz –exclude=/home/loop* \
/etc /home /var/spool/mail /var/spool/cron /root
…. 这是一个超级漫长的过程….
[root@www ~]# ll -h /backups/
-rw-r–r–1root root 8.4M Nov 30 16:43 backup-system-20091130.tar.bz2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26




<h2 id="4">4. 完整备份工具:dump</h2>


某些夜黑人静的夜晚,你想要针对文件系统进行备份或者存储功能时,不能不谈到这个 dump 命令。


<h3 id="4.1">4.1 dump</h3>

假设你的 /home 是独立的一个文件系统,那你第一次进行过dump后,再进行第二次dump时,你可以指定不同的备份等级,假如指定等级为1时,此时新备份的数据只会记录与第一次备份所有差异的文件而已。
比如,第一次备份时使用的是 level 0,这个等级也是完整的备份。等到第二次备份时,实时文件系统内的数据已经与 level 0 不一样了,而level1 仅只是比较目前的文件系统与 level 0 之间的差异后,备份有变化过的文件而已。至于 level 2则是与 level 1 进行比较。

- dump 对单一文件备份的限制

`dump` 支持对整个文件系统或者是单一目录,但是**对单一目录的支持比较不足**,废话要不然还要 `tar`干啥。
如果是单一文件系统,那么该文件系统可以使用完整的dump功能,包括利用0~9的数个level来备份,同时,备份时可以使用挂载点或者是设备文件名(例如/dev/sda5 之类的设备文件名)来进行备份。 但如果带备份数据只是目录,并非单一文件系统就包括以下限制

> 所有的备份数据都必须要在该目录(本例为/home/someone/)下面;
>且仅能使用 level 0,即仅支持完整备份而已;
>不支持-u参数,即无法创建/etc/dumpdates这个level备份的时间记录文件。
>dump 的参数虽然非常繁杂,不过如果只是想要简单的操作时,你只要记得下面的几个参数就很够用了。

- dump 简单操作

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

1
2

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

1. 先找出系统中最小的那个文件系统,如下所示:

[root@www ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 9.5G 3.7G 5.3G 42% /
/dev/hdc3 4.8G 651M 3.9G 15% /home
/dev/hdc1 99M 11M 83M 12% /boot <==看起来最小的就是它。
tmpfS 363M 0 363M 0% /dev/shm

2. 先测试一下如果要备份此文件系统需多少容量

[root@www ~]# dump -S/dev/hdc1
5630976 <==注意一下,这个单位是 byte,所以差不多是 5.6MB。

3. 将完整备份的文件名记录成为 /root/boot.dump,同时更新记录文件:

[root@www ~]# dump -0u -f /root/boot.dump/boot
DUMP: Date of thiSlevel0dump: Tue Dec 2 02:53:45 2008<==记录等级与备份时间
DUMP: Dumping /dev/hdc1(/boot)to /root/boot.dump <==dump的源与目标
DUMP: Label: /boot <==文件系统的 label
DUMP: Writing 10 Kilobyte records
DUMP: mapping(PasSI)[regular files] <==开始进行文件对应
DUMP: mapping(PasSII)[directories]
DUMP: estimated 5499 blocks. <==评估整体block数量
DUMP: Volume1started with block1at: Tue Dec 2 02:53:46 2008
DUMP: dumping(PasSIII)[directories] <==开始 dump工作
DUMP: dumping(PasSIV)[regular files]
DUMP:Closing /root/boot.dump <==结束写入备份文件
DUMP: Volume1completed at: Tue Dec 2 02:53:47 2008
DUMP: Volume15550 blockS(5.42MB) <==最终备份数据容量
DUMP: Volume1took 0:00:01
DUMP: Volume1transfer rate: 5550 kB/s
DUMP: 5550 blockS(5.42MB)on1volume(s)
DUMP: finished in1seconds, throughput 5550 kBytes/sec
DUMP: Date of thiSlevel0dump: Tue Dec 2 02:53:45 2008
DUMP: Date thiSdumpCompleted: Tue Dec 2 02:53:47 2008
DUMP: Average transfer rate: 5550 kB/s
DUMP: DUMPISDONE

在命令的执行方面,dump后面接 /boot 或 /dev/hdc1都可以的。

而执行 dump的过程中会出现如上的一些信息,你可以自行仔细查看。

[root@www ~]# ll /root/boot.dump/etc/dumpdates
-rw-rw-r–1root disk 43 Dec 2 02:53 /etc/dumpdates
-rw-r–r–1root root 5683200 Dec 2 02:53 /root/boot.dump

由于加上 -u 的选项,因此 /etc/dumpdates文件的内容会被更新。注意,

这个文件仅有在 dump完整的文件系统时才有支持自动更新的功能。

4. 查看一下系统自动新建的记录文件:

[root@www ~]#cat /etc/dumpdates
/dev/hdc1 0 Tue Dec 2 02:53:47 2008 +0800
[文件系统] [等级] [ Ctime 的时间 ]

1
2
3
4

这样就很简单的新建了/root/boot.dump 文件。该文件将整个 /boot 文件系统都备份下来,并且将备份时间写入 /etc/dumpdates 文件中,准备让下次备份时可以做一个参考依据。

- 新建 level 1 备份

1. 看一下有没有任何文件系统被 dump过的数据

[root@www ~]# dump -W
Last dump(s)done(Dump’>’ file systems):

/dev/hdc2 ( /)Last dump: never
/dev/hdc3 ( /home)Last dump: never
/dev/hdc1 ( /boot)Last dump: Level 0, Date Tue Dec 2 02:53:47 2008

如上面的结果,该结果会找出 /etc/fstab 里面第五字段设置有需要 dump的

分区,然后与 /etc/dumpdateS进行比对,可以得到上面的结果。

尤其是第三行,可以显示我们曾经对 /dev/hdc1进行过 dump的备份操作。

2. 先恶搞一下,新建一个大约 10 MB 的文件在 /boot 内:

[root@www ~]#dd if=/dev/zero of=/boot/testing.img bs=1MCount=10
10+0 recordSin
10+0 recordSout
10485760 byteS(10 MB)Copied, 0.166128 seconds, 63.1MB/s

3. 开始新建差异备份文件,此时我们使用 level 1吧:

[root@www ~]# dump -1u -f /root/boot.dump.1/boot
….(中间省略)….
[root@www ~]# ll /root/boot*
-rw-r–r–1root root 5683200 Dec 2 02:53 /root/boot.dump
-rw-r–r–1root root 10547200 Dec 2 02:56 /root/boot.dump.1

看看文件大小,岂不是就是刚才我们所新建的那个大文件的大小吗?

4. 最后再看一下是否有记录 level 1备份的时间点呢?

[root@www ~]# dump -W
Last dump(s)done(Dump’>’ file systems):
/dev/hdc2 ( /)Last dump: never
/dev/hdc3 ( /home)Last dump: never
/dev/hdc1 ( /boot)Last dump: Level 1, Date Tue Dec 2 02:56:33 2008
….(中间省略)….
通过这个简单的方式,我们就能够仅备份差异文件的部分了。下面再来看看针对单一目录的dump用途。
用dump备份非文件系统,即单一目录的方法
现在让我们来处理一下/etc的dump备份。因为/etc并非单一文件系统,它只是个目录而已。所以依据限制的说明,-u evel 1~9 都是不适用的。我们只能够使用 level 0 的完整备份将/etcdump 下来,因此就变得很简单了。

1
2

- dump 备份单一目录

#让我们将 /etc 整个目录通过 dump进行备份,且含压缩功能
[root@www ~]# dump -0j -f /root/etc.dump.bz2 /etc
DUMP: Date of thiSlevel0dump: Tue Dec 2 12:08:22 2008
DUMP: Dumping /dev/hdc2(/(dir etc))to /root/etc.dump.bz2
DUMP: Label: /1
DUMP: Writing 10 Kilobyte records
DUMP:Compressing output atCompression level 2(bzlib)
DUMP: mapping(PasSI)[regular files]
DUMP: mapping(PasSII)[directories]
DUMP: estimated 115343 blocks.
DUMP: Volume1started with block1at: Tue Dec 2 12:08:23 2008
DUMP: dumping(PasSIII)[directories]
DUMP: dumping(PasSIV)[regular files]
DUMP:Closing /root/etc.dump.bz2
DUMP: Volume1completed at: Tue Dec 2 12:09:49 2008
DUMP: Volume1took 0:01:26
DUMP: Volume1transfer rate: 218 kB/s
DUMP: Volume1124680kB uncompressed, 18752kBCompressed, 6.649…

上面特殊字体的部分显示:原本有 124680KB 的容量,被压缩成为 18752KB,

整个压缩比为 6.649:1,还可以。

一般来说dump不会使用包含压缩的功能,不过如果你想要将备份的空间降低的话,那个-j的参数是可以使用的。加上-j之后你的dump结果会使用较少的硬盘空间。如上述的情况来看,文件大小由原本的128MB左右下滑到18MB左右,当然可以节省备份空间。

1
2
3
4
5


<h3 id="4.2">4.3 restore</h3>

备份文件就是在急用时可以恢复系统的重要数据。所以有备份当然要学习如何恢复。dump 的恢复使用的就是 restore 这个命令。它的参数相当多,可以自行 man restore,下面仅是一个简单的介绍。

[root@www ~]# restore -t [-f dumpfile] [-h] <==用来查看 dump文件
[root@www ~]# restore -C [-f dumpfile] [-D挂载点] <==比较dump与实际文件
[root@www ~]# restore -i [-f dumpfile] <==进入互动模式
[root@www ~]# restore -r [-f dumpfile] <==还原整个文件系统
参数:
相关的各种模式,各种模式无法混用。例如不可以写 -tC 。
-t :此模式用在查看 dump起来的备份文件中含有什么重要数据。类似tar-t 功能。
-C :此模式可以将 dump内的数据拿出来跟实际的文件系统做比较,
最终会列出“在 dump文件内有记录的,且目前文件系统不一样”的文件。
-i :进入互动模式,可以仅还原部分文件,用在 dump目录时的还原。
-r :将整个文件系统还原的一种模式,用在还原针对文件系统的 dump备份。
其他较常用到的参数功能:
-h :查看完整备份数据中的 inode 与文件系统 label 等信息。
-f :后面就接你要处理的那个 dump文件。
-D :与 -C 进行搭配,可以查出后面接的挂载点与 dump内有不同的文件。

1
2

- 使用 restore -t 查阅 dump 内容

[root@www ~]# restore -t -f /root/boot.dump
Dump date: Tue Dec 2 02:53:45 2008 <==说明备份的日期
Dumped from: the epoch
Level0dumpof /boot on www.vbird.tsai:/dev/hdc1 <==说明 level 状态
Label: /boot <==说明该文件系统的表头。
2 .
11 ./lost+found
2009 ./grub
2011 ./grub/grub.conf
….下面省略….
[root@www ~]# restore -t -f /root/etc.dump
Dumptape isCompressed. <==加注说明数据有压缩
Dump date: Tue Dec 2 12:08:22 2008
Dumped from: the epoch
Level0dumpof /(dir etc)on ubuntu:/dev/hdc2 <==是目录。
Label: /1
2 .
1912545 ./etc
1912549 ./etc/rpm
1912550 ./etc/rpm/platform
….下面省略….
这个查阅的数据其实显示出的是文件名与原文件的inode状态,所以我们可以说,dump会参考inode的记录。通过这个查询我们也能知道dump的内容为何

1
2
3
4

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

dump 可以进行累计备份,是因为它具有可以查询文件系统与备份文件之间的差异,并且将分析到的差异数据进行备份的缘故。

1. 先尝试更改文件系统的内容:

[root@www ~]#cd /boot
[root@www boot]# mvConfig-2.6.18-128.el5Config-2.6.18-128.el5-back

2. 看看查询文件系统与备份文件之间的差异。

[root@www boot]# restore -C -f /root/boot.dump
Dump date: Tue Dec 2 02:53:45 2008
Dumped from: the epoch
Level0dumpof /boot on ubuntu:/dev/hdc1
Label: /boot
filesys= /boot
restore: unable to stat ./config-2.6.18-128.el5: No such file or directory Some fileSwere modified!
1compare errors

看到上面的特殊字体了吧。那就是有差异的部分。总共有一个文件被更改。

```

说明

整理笔记参考了 《鸟哥的Linux私房菜》 一书。这本书我是买的京东阅读的正版电子书籍。

如果不想买书看的话可以直接戳这里进入鸟哥Linux私房菜的线上博客 : http://linux.vbird.org/。请大家支持正版!!

至于笔记中的命令我是都敲过一遍的并进行了理解,并不是单纯的复制粘贴呦!

CATALOG
  1. 1. 目录
  2. 2. 前言
  3. 3. 1. 压缩文件的用途与技术
  4. 4. 2. Linux 系统常见的压缩命令
    1. 4.1. 2.1 gZip,zcat
  • 此时屏幕上会显示该压缩文件解压后的文件内容。
  • zcat可以读取纯文本文件被压缩后的压缩文件。
  • 与gzip相反,gzip -d 会将原本的 .gz 删除,产生原本的 man.config 文件。
  • 此时 man.config 会变成 man.config.bz2
  • 此时屏幕上会显示 man.config.bz2 解压缩之后的文件内容。
  • 由于加上 -v 这个参数,因此正在作用中的文件名就会显示在屏幕上。
  • 如果你可以翻到第一页,会发现出现上面的错误信息,下面会讲解。
  • 至于 -p的参数,重点在于保留原本文件的权限与属性之意。
  • 显示的消息会跟上面一模一样。
  • 为什么建议你使用 -j 这个参数?从上面的数值你可以知道了吧?
  • 这次查阅文件名不含 -v 参数,所以仅有文件名而已,没有详细属性/权限等参数。
  • 1. 先找到我们要的文件名,假设解开 shadow 文件好了:
  • 先找出重要的文件名。其中那个grep是“选取”关键字的功能。
  • 2. 将该文件解开。语法与实际方法如下:
  • 在本例中,你不能写成 /etc/shadow ,因为它是记录在 etc.tar.bz2 内的文件名。
  • 最后一行显示的是“没有被备份的”,也即 not dumped 的意思。
  • 将 /etc 整个目录一边打包一边在 /tmp中解开
  • 这个操作有点像是cp -r /etc /tmp依旧是有其有用途的。
  • 要注意的地方在于输出文件变成 - 而输入文件也变成 - ,又有一个 | 存在。
  • 这分别代表 standard output, standard input 与管道命令。
  • 简单的想法中,你可以将 - 想成是在内存中的一个设备(缓冲区)。
  • 在当前目录下 ll 你会发现,目录下会直接出现 解压后的 etc/
  • 2. 假设今天是 2017/10/11 ,则新建备份的方式如下:
  • 1. 先找出系统中最小的那个文件系统,如下所示:
  • 2. 先测试一下如果要备份此文件系统需多少容量
  • 3. 将完整备份的文件名记录成为 /root/boot.dump,同时更新记录文件:
  • 在命令的执行方面,dump后面接 /boot 或 /dev/hdc1都可以的。
  • 而执行 dump的过程中会出现如上的一些信息,你可以自行仔细查看。
  • 由于加上 -u 的选项,因此 /etc/dumpdates文件的内容会被更新。注意,
  • 这个文件仅有在 dump完整的文件系统时才有支持自动更新的功能。
  • 4. 查看一下系统自动新建的记录文件:
  • 1. 看一下有没有任何文件系统被 dump过的数据
  • 如上面的结果,该结果会找出 /etc/fstab 里面第五字段设置有需要 dump的
  • 分区,然后与 /etc/dumpdateS进行比对,可以得到上面的结果。
  • 尤其是第三行,可以显示我们曾经对 /dev/hdc1进行过 dump的备份操作。
  • 2. 先恶搞一下,新建一个大约 10 MB 的文件在 /boot 内:
  • 3. 开始新建差异备份文件,此时我们使用 level 1吧:
  • 看看文件大小,岂不是就是刚才我们所新建的那个大文件的大小吗?
  • 4. 最后再看一下是否有记录 level 1备份的时间点呢?
  • 上面特殊字体的部分显示:原本有 124680KB 的容量,被压缩成为 18752KB,
  • 整个压缩比为 6.649:1,还可以。
  • 1. 先尝试更改文件系统的内容:
  • 2. 看看查询文件系统与备份文件之间的差异。
  • 看到上面的特殊字体了吧。那就是有差异的部分。总共有一个文件被更改。
    1. 0.1. 说明