第九章、文件与文件系统的压缩与打包

第九章、文件与文件系统的压缩与打包
  2.1 compress
  2.2 gzip, zcat
  2.3 bzip2, bzcat
  6.1 dd
  6.2 cpio

 

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

2. Linux 系统常见的压缩命令
压缩文件的扩展名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2』  
当你下载到某个压缩档时,自然就需要知道该文件是由哪种压缩命令所制作出来的,好用来对照著解压缩啊!
底下我们就列出几个常见的压缩文件扩展名吧:
Linux上常见的压缩命令就是 gzip 与 bzip2 ,至於 compress 已经退流行了
这个 tar 可以将很多文件『打包』成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是『打包』而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的功能,后来,GNU 计画中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能!
 
2.1 compress
过期。。  
 
2.2 gzip, zcat
 
gzip
可以说是应用度最广的压缩命令了!目前 gzip 可以解开 compress, zip 与 gzip 等软件所压缩的文件。 至於 gzip 所创建的压缩档为 *.gz 的档名喔!让我们来看看这个命令的语法吧:  
 
与 compress 类似的,当你使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的档名, 原始文件就不再存在了。您也可以发现,由於 gzip 的压缩比要比 compress 好的多,所以当然建议使用 gzip 啦! 此外,使用 gzip 压缩的文件在 Windows 系统中,竟然可以被 WinRAR 这个软件解压缩呢!很好用吧!至於其他的用法如下:
 
cat 可以读取纯文字档,那个 zcat 则可以读取纯文字档被压缩后的压缩档! 由於 gzip 这个压缩命令主要想要用来取代 compress 的,所以不但 compress 的压缩文件可以使用 gzip 来解开,同时 zcat 这个命令可以同时读取 compress 与 gzip 的压缩档呦!
 
2.3 bzip2, bzcat
若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的。 bzip2 真是很不错用的东西~这玩意的压缩比竟然比 gzip 还要好~至於 bzip2 的用法几乎与 gzip 相同! 看看底下的用法吧!
使用 gzip 扩展名自动创建为 .gz 。这里的 bzip2 则是自动的将扩展名建置为 .bz2 罗!所以当我们使用具有压缩功能的 bzip2 -z 时,那么刚刚的 man.config 就会自动的变成了 man.config.bz2 这个档名罗!
 
好了,那么如果我想要读取这个文件的内容呢? 是否一定要解开?当然不需要罗!可以使用简便的 bzcat 这个命令来读取内容即可!例如上面的例子中, 我们可以使用 bzcat man.config.bz2 来读取数据而不需要解开!此外,当你要解开一个压缩档时, 这个文件的名称为 .bz, .bz2, .tbz, .tbz2 等等,那么就可以尝试使用 bzip2 来解看看啦!当然罗,也可以使用 bunzip2 这个命令来取代 bzip2 -d 罗。
 

3. 打包命令: tar
前一小节谈到的命令大多仅能针对单一文件来进行压缩,虽然 gzip 与 bzip2 也能够针对目录来进行压缩, 不过,这两个命令对目录的压缩指的是『将目录内的所有文件 "分别" 进行压缩』的动作! 而不像在 Windows 的系统,可以使用类似 WinRAR 这一类的压缩软件来将好多数据『包成一个文件』的样式。
这种将多个文件或目录包成一个大文件的命令功能,我们可以称呼他是一种『打包命令』啦! 那 Linux 有没有这种打包命令呢?是有的!那就是鼎鼎大名的 tar 这个玩意儿了! tar 可以将多个目录或文件打包成一个大文件,同时还可以透过 gzip/bzip2 的支持,将该文件同时进行压缩! 由於 tar 的使用太广泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 档名的解压缩呢!
 
1.tar
tar 的选项与参数非常的多!我们只讲几个常用的选项,更多选项您可以自行 man tar 查询罗!
 
其实最简单的使用 tar 就只要记忆底下的方式即可:
  • 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
  • 查 询:tar -jtv -f filename.tar.bz2
  • 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
 
如果解压的是gzip文件,则tar -zxv。。。。
 
1.那个 filename.tar.bz2 是我们自己取的档名,tar 并不会主动的产生创建的档名喔!我们要自订啦! 所以扩展名就显的很重要了!
2.如果不加 [-j|-z] 的话,档名最好取为 *.tar 即可。如果是 -j 选项,代表有 bzip2 的支持,因此档名最好就取为 *.tar.bz2 ,因为 bzip2 会产生 .bz2 的扩展名之故!
3.至於如果是加上了 -z 的 gzip 的支持,那档名最好取为 *.tar.gz 喔!了解乎?
 
另外,由於『 -f filename 』是紧接在一起的,过去很多文章常会写成『-jcvf filename』,这样是对的, 但由於选项的顺序理论上是可以变换的,所以很多读者会误认为『-jvfc filename』也可以~事实上这样会导致产生的档名变成 c ! 因为 -fc 嘛!所以罗,建议您在学习 tar 时,将『 -f filename 』与其他选项独立出来,会比较不容易发生问题。
 
 
例子
 
1.使用 tar 加入 -j 或 -z 的参数备份 /etc/ 目录
有事没事备份一下 /etc 这个目录是件好事
由上述的练习,我们知道使用 bzip2 亦即 -j 这个选项来制作备份时,能够得到比较好的压缩比! 如上表所示,由原本的 /etc/ (118MBytes) 下降到 8.7Mbytes 左右!至於加上『 -p 』这个选项的原因是为了保存原本文件的权限与属性!
 
2.查阅 tar 文件的数据内容(可察看档名),与备份档名有否根目录的意义
如果加上 -v 这个选项时,详细的文件权限/属性都会被列出来!如果只是想要知道档名而已, 那么就将 -v 拿掉即可。从上面的数据我们可以发现一件很有趣的事情,那就是每个档名都没了根目录了!这也是上一个练习中出现的那个警告信息『tar: Removing leading `/' from member names(移除了档名开头的 `/' )』所告知的情况!
那为什么要拿掉根目录呢?主要是为了安全!我们使用 tar 备份的数据可能会需要解压缩回来使用, 在 tar 所记录的档名 (就是我们刚刚使用 tar -jtvf 所察看到的档名) 那就是解压缩后的实际档名。 如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的档名就会变成『/tmp/etc/xxx』。 但『如果没有拿掉根目录,解压缩后的档名就会是绝对路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!』如此一来,你的原本的 /etc/ 底下的数据, 就会被备份数据所覆盖过去了!
 
如果你确定你就是需要备份根目录到 tar 的文件中,那可以使用 -P (大写) 这个选项
如果加上 -P 选项,那么档名内的根目录就会存在喔!不过,鸟哥个人建议,还是不要加上 -P 这个选项来备份!
 
 
3.将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)
那如果想要解打包呢?很简单的动作就是直接进行解打包嘛!
此时该打包文件会在『本目录下进行解压缩』的动作!
 
『指定欲解开的目录』呢? 有的,可以使用 -C 这个选项喔!
 
4.仅解开单一文件的方法
你只要使用 -jtv 找到你要的档名,然后将该档名解开即可
 
5.打包某目录,但不含该目录下的某些文件之作法
假设我们想要打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件, 因为该文件都是刚刚我们才创建的备份档嘛!而且假设这个新的打包文件要放置成为 /root/system.tar.bz2 , 当然这个文件自己不要打包自己 (因为这个文件放置在 /root 底下啊!),此时我们可以透过 --exclude 的帮忙! 那个 exclude 就是不包含的意思!所以你可以这样做:
上面的命令是一整列的~其实你可以打成:『tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』,如果想要两行输入时,最后面加上反斜线 (\) 并立刻按下 [enter] , 就能够到第二行继续输入了。这个命令下达的方式我们会在第三章再仔细说明。 透过这个 --exclude="file" 的动作,我们可以将几个特殊的文件或目录移除在打包之列
 
在新版的 tar 命令中,鸟哥发现原本的『 --exclude file 』似乎无法实际运行了!使用 man tar 明明有看到这个选项的说, 但使用 info tar 才发现,选项功能已经变成了『 --exclude=file 』的模式!这个地方得要特别留意呢!
 
6.仅备份比某个时刻还要新的文件
 
--newer-mtime 这个选项就粉重要啦
 
7.基本名称: tarfile, tarball ?
另外值得一提的是,tar 打包出来的文件有没有进行压缩所得到文件称呼不同喔! 如果仅是打包而已,就是『 tar -cv -f file.tar 』而已,这个文件我们称呼为 tarfile 。 如果还有进行压缩的支持,例如『 tar -jcv -f file.tar.bz2 』时,我们就称呼为 tarball (tar 球?)! 这只是一个基本的称谓而已,不过很多书籍与网络都会使用到这个 tarball 的名称! 所以得要跟您介绍介绍
 
 
8.特殊应用:利用管线命令与数据流
在 tar 的使用中,有一种方式最特殊,那就是透过标准输入输出的数据流重导向(standard input/standard output), 以及管线命令 (pipe) 的方式,将待处理的文件一边打包一边解压缩到目标目录去。 关於数据流重导向与管线命令更详细的数据我们会在第十一章 bash 再跟大家介绍, 底下先来看一个例子吧!
 
 

4. 完整备份工具:dump, restore
 
4.1完整备份工具:dump
某些时刻你想要针对文件系统进行备份或者是储存的功能时,不能不谈到这个 dump 命令! 这玩意儿我们曾在前一章的 /etc/fstab 里面稍微谈过。 其实这个命令除了能够针对整个 filesystem 备份之外,也能够仅针对目录来备份喔! 底下就让我们来谈一谈这个命令的用法吧!
 
1.dump
其实 dump 的功能颇强,他除了可以备份整个文件系统之外,还可以制定等级喔!什么意思啊! 假设你的 /home 是独立的一个文件系统,那你第一次进行过 dump 后,再进行第二次 dump 时, 你可以指定不同的备份等级,假如指定等级为 1 时,此时新备份的数据只会记录与第一次备份所有差异的文件而已
 
虽然 dump 支持整个文件系统或者是单一各别目录,但是对於目录的支持是比较不足的,这也是 dump 的限制所在。 简单的说,如果想要备份的数据如下时,则有不同的限制情况:
 
  • 当待备份的数据为单一文件系统:
如果是单一文件系统 (filesystem) ,那么该文件系统可以使用完整的 dump 功能,包括利用 0~9 的数个 level 来备份, 同时,备份时可以使用挂载点或者是装置档名 (例如 /dev/sda5 之类的装置档名) 来进行备份!
 
  • 待备份的数据只是目录,并非单一文件系统:
例如你仅想要备份 /home/someone/ ,但是该目录并非独立的文件系统时。此时备份就有限制啦!包括:
 
    • 所有的备份数据都必须要在该目录 (本例为:/home/someone/) 底下;
    • 且仅能使用 level 0 ,亦即仅支持完整备份而已;
    • 不支持 -u 选项,亦即无法创建 /etc/dumpdates 这个各别 level 备份的时间记录档;
 
 
dump 的选项虽然非常的繁复,不过如果只是想要简单的操作时,您只要记得底下的几个选项就很够用了!
 
1.用 dump 备份完整的文件系统
 
这样很简单的就创建起来 /root/boot.dump 文件,该文件将整个 /boot/ 文件系统都备份下来了! 并且将备份的时间写入 /etc/dumpdates 文件中,准备让下次备份时可以作为一个参考依据。 现在让我们来进行一个测试,检查看看能否真的创建 level 1 的备份呢?
透过这个简单的方式,我们就能够仅备份差异文件的部分罗!底下再来看看针对单一目录的 dump 用途!
 
2.用 dump 备份非文件系统,亦即单一目录的方法
现在让我们来处理一下 /etc 的 dump 备份吧!因为 /etc 并非单一文件系统,他只是个目录而已。 所以依据限制的说明, -u, level 1~9 都是不适用的。我们只能够使用 level 0 的完整备份将 /etc 给他 dump 下来。因此作法就变的很简单了
 
 
2.restore
dump 的复原使用的是 restore 这个命令!
 
1.用 restore 观察 dump 后的备份数据内容
这个查阅的数据其实显示出的是档名与原始文件的 inode 状态,所以我们可以说, dump 会参考 inode 的记录哩!
 
 
2.比较差异并且还原整个文件系统
为什么 dump 可以进行累积备份呢?就是因为他具有可以查询文件系统与备份文件之间的差异, 并且将分析到的差异数据进行备份的缘故。所以我们先来看看,如何查询有变动过的资讯呢?
如同上面的动作,透过曾经备份过的资讯,也可以找到与目前实际文件系统中有差异的数据呢! 如果你不想要进行累积备份,但也能透过这个动作找出最近这一阵子有变动过的文件说!了解乎? 那如何还原呢?由於 dump 是记录整个文件系统的,因此还原时你也应该要给予一个全新的文件系统才行。 因此底下我们先创建一个文件系统,然后再来还原吧!
由於我们是备份整个文件系统,因此你也可以建置一个全新的文件系统 (partition) 来进行还原的动作! 整个还原的动作也不难,如上表最后一个命令,就是将备份文件中的数据还原到本目录下。 你必须要变更目录到挂载点所在的那个目录才行啊!这样还原的文件才不会跑错地方!如果你还想要将 level 1 的 /root/boot.dump.1 那个文件的内容也还原的话,那就继续使用『restore -r -f /root/boot.dump.1』去还原吧!
 
3.仅还原部分文件的 restore 互动模式
某些时候你只是要将备份档的某个内容捉出来而已,并不想要全部解开,那该如何是好?此时你可以进入 restore 的互动模式 (interactive mode)。在底下我们使用 etc.dump 来进行范例说明。假如你要将 etc.dump 内的 passwd 与 shadow 捉出来而已,该如何进行呢?
 
透过互动式的 restore 功能,可以让你将备份的数据取出一部份,而不必全部都得解压缩才能够取得你想要的文件数据。 而 restore 内的 add 除了可以添加文件外,也能够添加整个备份的『目录』喔!还不错玩吧! 赶紧测试看看先! ^_^
 
 

5. 光盘写入工具
  
5.1 mkisofs:创建映像档
  
5.2 cdrecord:光盘烧录工具
 
 

6. 其他常见的压缩与备份工具
  
6.1 dd
  
 
6.2 cpio
 
 

 
7. 重点回顾
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

posted @ 2017-05-24 22:39  crazyYong  阅读(639)  评论(0编辑  收藏  举报