第9章、 档案与文件系统的压缩与打包

9.1. 压缩文件案的用途与技术
目前我们使用的计算机系统中都是使用所谓的 bytes 单位;来计量的!不过,事实上,计算机最小的计量单位应该是 bits 才对啊,此外,我们也知道 1 byte = 8 bits 。但是如果今天我们只是记忆一个数字,亦即是 1 这个数字呢?他会如何记录?假设一个 byte 可以看成底下的模样:
□□□□□□□□
由于我们记录数字是 1 ,考虑计算机所谓的二进制,如此一来, 1 会在最右边占据 1 个 bit ,而其他的 7 个 bits 将会自动的被填上 0 !你看看,其实在这样的例子中,那 7 个 bits 应该是『空的』才对!不过,为了要满足目前我们的操作系统数据的存取,所以就会将该数据转为 byte 的型态来记录了!而一些聪明的计算机工程师就利用一些复杂的计算方式, 将这些没有使用到的空间『丢』出来,以让档案占用的空间变小!这就是压缩的技术!
另外一种压缩技术也很有趣,他是将重复的数据进行统计记录的。举例来说,如果你的数据为『111….』共有100个1时, 那么压缩技术会记录为『100个1』而不是真的有100个1的位存在!这样也能够精简档案记录的容量。
其实档案里面有相当多的『空间』存在,并不是完全填满的, 而『压缩』的技术就是将这些『空间』填满,以让整个档案占用的容量下降! 不过,这些『压缩过的档案』并无法直接被我们的操作系统所使用的,因此, 若要使用这些被压缩过的档案数据,则必须将他『还原』回来未压缩前的模样, 那就是所谓的『解压缩』!而至于压缩前与压缩后的档案所占用的磁盘空间大小, 就可以被称为是『压缩比』!更多的技术文件或许你可以参考一下:
- RFC 1952 文件:http://www.ietf.org/rfc/rfc1952.txt
- 鸟哥站上的备份:
http://linux.vbird.org/linux_basic/0240tarcompress/0240tarcompress_gzip.php

其最大的好处就是压缩过的档案容量变小了, 所以你的硬盘容量无形之中就可以容纳更多的资料。此外,在一些网络数据的传输中,也会由于数据量的降低, 好让网络带宽可以用来作更多的工作!目前很多的 WWW 网站也是利用文件压缩的技术来进行数据的传送,好让网站带宽的可利用率上升 !

9.2. Linux 系统常见的压缩指令
Linux的环境中,压缩文件案的扩展名大多是:『.tar, .tar.gz, .tgz, .gz, .Z, .bz2』,为什么会有这样的扩展名呢?
这是因为 Linux 支持的压缩指令非常多,且不同的指令所用的压缩技术并不相同,当然彼此之间可能就无法互通压缩/解压缩文件案。 所以,当你下载到某个压缩文件时,自然就需要知道该档案是由哪种压缩指令所制作出来的,好用来对照着解压缩! 底下我们就列出几个常见的压缩文件案扩展名:
这里写图片描述
Linux上常见的压缩指令就是 gzip 与 bzip2 ,至于 compress 已经退流行了。 gzip 是由 GNU 计划所开发出来的压缩指令,该指令已经取代了 compress 。 后来 GNU 又开发出 bzip2 这个压缩比更好的压缩指令!不过,这些指令通常仅能针对一个档案来压缩与解压缩,如此一来, 每次压缩与解压缩都要一大堆档案,那个所谓的『打包软件, tar』就显的很重要!
这个 tar 可以将很多档案『打包』成为一个档案!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是『打包』而已,亦即是将很多档案集结成为一个档案, 事实上,他并没有提供压缩的功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能! 底下我们就来谈一谈这些在 Linux 底下基本的压缩指令!

9.2.1. compress
compress这个压缩指令是非常老旧的一款,如果你所在的环境还是有老旧的系统,那么还是得要学一学就是了。好了, 如果你有网络的话,那么安装其实很简单!
这里写图片描述
这里写图片描述
这里写图片描述
关于 yum 更详细的用法我们会在后续的章节介绍,这里仅是提供一个大概的用法而已。 等你安装好这个软件后,接下来让我们看看如何使用 compress !
这里写图片描述
在预设的情况中,被 compress 压缩的源文件会不见,而压缩文件案会被建立起来, 而且扩展名会是 *.Z。 那么如何解压缩呢?
这里写图片描述
解压缩直接用 uncompress 即可!解压缩完毕后该档案就自动的变回来了!不过,那个压缩文件却又不存在了,那如果我想要保留源文件且又要建立压缩文件呢?可以使用 -c 的语法!
这里写图片描述
这里写图片描述

9.2.2. gzip, zcat
gzip 可以说是应用度最广的压缩指令了!目前 gzip 可以解开 compress, zip 与 gzip 等软件所压缩的档案。 至于 gzip 所建立的压缩文件为 *.gz 的档名!
这里写图片描述
与 compress 类似的,当你使用 gzip 进行压缩时,在预设的状态下原本的档案会被压缩成为 .gz 的档名, 源文件就不再存在了。您也可以发现,由于 gzip 的压缩比要比 compress 好的多,所以当然建议使用 gzip ! 此外,使用 gzip 压缩的档案在 Windows 系统中,竟然可以被 WinRAR 这个软件解压缩!至于其他的用法如下:
这里写图片描述
其实 gzip 的压缩已经优化过了,所以虽然 gzip 提供 1~9 的压缩等级,不过使用默认的 6 就非常好用了! 因此上述的范例四可以不要加入那个 -9 的选项。范例四的重点在那个 -c 与 > 的使用!
cat 可以读取纯文本档,那个 zcat 则可以读取纯文本档被压缩后的压缩文件! 由于 gzip 这个压缩在指令主要想要用来取代 compress 的,所以不但 compress 的压缩文件案可以使用 gzip 来解开,同时 zcat 这个指令可以同时读取 compress 与 gzip 的压缩文件!

9.2.3. bzip2, bzcat
bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的。压缩比竟然比 gzip 还要好:
这里写图片描述
使用 compress 扩展名自动建立为 .Z ,使用 gzip 扩展名自动建立为 .gz 。这里的 bzip2 则是自动的将扩展名建置为 .bz2 !所以当我们使用具有压缩功能的 bzip2 -z 时,那么刚刚的 man.config 就会自动的变成了 man.config.bz2 这个档名!
那么如果我想要读取这个档案的内容呢? 是否一定要解开?当然不需要!可以使用简便的 bzcat 这个指令来读取内容即可!例如上面的例子中, 我们可以使用 bzcat man.config.bz2 来读取数据而不需要解开!此外,当你要解开一个压缩文件时, 这个档案的名称为 .bz, .bz2, .tbz, .tbz2 等等,那么就可以尝试使用 bzip2 来解看看!当然,也可以使用 bunzip2 这个指令来取代 bzip2 -d 。

9.3. 打包指令: tar
前一小节谈到的指令大多仅能针对单一档案进行压缩,虽然 gzip 与 bzip2 也能够针对目录来进行压缩, 不过,这两个指令对目录的压缩指的是『将目录内的所有档案 “分别” 进行压缩』的动作! 而不像在 Windows 的系统,可以使用类似 WinRAR 这一类的压缩软件来将好多数据『包成一个档案』的样式。
这种将多个档案或目录包成一个大档案的指令功能,我们可以称呼他是一种『打包指令』! 那 Linux 打包指令就是鼎鼎大名的 tar ! tar 可以将多个目录或档案打包成一个大档案,同时还可以透过 gzip/bzip2 的支持,将该档案同时进行压缩! 更有趣的是,由于 tar 的使用太广泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 档名的解压缩!

9.3.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 欲解压缩的目录;

那个 filename.tar.bz2 是我们自己取的档名,tar 并不会主动的产生建立的档名!我们要自定义! 所以扩展名就显的很重要了!如果不加 [-j|-z] 的话,档名最好取为 .tar 即可。如果是 -j 选项,代表有 bzip2 的支持,因此档名最好就取为 .tar.bz2 ,因为 bzip2 会产生 .bz2 的扩展名之故! 至于如果是加上了 -z 的 gzip 的支持,那档名最好取为 *.tar.gz !
另外,由于『 -f filename 』是紧接在一起的,过去很多文章常会写成『-jcvf filename』,这样是对的, 但由于选项的顺序理论上是可以变换的,所以很多读者会误认为『-jvfc filename』也可以~事实上这样会导致产生的档名变成 c ! 因为 -fc 嘛!所以,建议您在学习 tar 时,将『 -f filename 』与其他选项独立出来,会比较不容易发生问题。

一、使用 tar 加入 -j 或 -z 的参数备份 /etc/ 目录
有事没事备份一下 /etc 这个目录是件好事!备份 /etc 最简单的方法就是使用 tar :
这里写图片描述
由上述的练习,我们知道使用 bzip2 亦即 -j 这个选项来制作备份时,能够得到比较好的压缩比! 如上表所示,由原本的 /etc/ (118MBytes) 下降到 8.7Mbytes 左右!至于加上『 -p 』这个选项的原因是为了保存原本档案的权限与属性!我们曾在第七章的 cp 指令介绍时谈到权限与文件类型(例如连结档)对复制的不同影响。 同样的,在备份重要的系统数据时,这些原本档案的权限需要做完整的备份比较好。此时 -p 这个选项就派的上用场了。 接下来让我们看看打包档案内有什么数据存在?

二、查阅 tar 档案的数据内容(可察看文件名),与备份文件名有否根目录的意义
要察看档名非常的简单!可以这样做:
这里写图片描述
如果加上 -v 这个选项时,详细的档案权限/属性都会被列出来!如果只是想要知道档名而已, 那么就将 -v 拿掉即可。从上面的数据我们可以发现一件很有趣的事情,那就是每个文件名都没了根目录了!这也是上一个练习中出现的那个警告讯息『tar: Removing leading /' from member names(移除了档名开头的/’ )』所告知的情况!
那为什么要拿掉根目录呢?主要是为了安全!我们使用 tar 备份的数据可能会需要解压缩回来使用, 在 tar 所记录的文件名 (就是我们刚刚使用 tar -jtvf 所察看到的档名) 那就是解压缩后的实际档名。 如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的档名就会变成『/tmp/etc/xxx』。 但『如果没有拿掉根目录,解压缩后的档名就会是绝对路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!』如此一来,你的原本的 /etc/ 底下的数据, 就会被备份数据所覆盖过去了!
如果你确定你就是需要备份根目录到 tar 的档案中,那可以使用 -P (大写) 这个选项,请看底下的例子分析:
这里写图片描述
如果加上 -P 选项,那么文件名内的根目录就会存在!不过,还是不要加上 -P 这个选项来备份! 毕竟很多时候,我们备份是为了要未来追踪问题用的,倒不一定需要还原回原本的系统中! 所以拿掉根目录后,备份数据的应用会比较有弹性!也比较安全!

三、将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)
进行解打包!
这里写图片描述
此时该打包档案会在『本目录下进行解压缩』的动作! 所以,你等一下就会在家目录底下发现一个名为 etc 的目录!所以如果你想要将该档案在 /tmp 底下解开, 可以 cd /tmp 后,再下达上述的指令即可。有更简单的方法可以『指定欲解开的目录』 ,可以使用 -C 这个选项!举例来说:
这里写图片描述
这样一来,你就能够将该档案在不同的目录解开!这个 -C 的选项务必要记忆一下的! 好了,处理完毕后,请记得将这两个目录删除!
这里写图片描述

四、仅解开单一档案的方法
刚刚上头我们解压缩都是将整个打包档案的内容全部解开!如果我只想要解开打包档案内的其中一个档案而已, 你只要使用 -jtv 找到你要的档名,然后将该档名解开即可。 我们用底下的例子来说明一下:
这里写图片描述

五、打包某目录,但不含该目录下的某些档案的作法
假设我们想要打包 /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 』的模式!这个地方得要特别留意!

六、仅备份比某个时刻还要新的档案
某些情况下你会只想要备份新的档案而已!此时就用 –newer-mtime ! 其实有两个选项,一个是『 –newer 』另一个就是『 –newer-mtime 』,这两个选项有何不同呢? 我们在 第七章的 touch 介绍中谈到过三种不同的时间参数, 当使用 –newer 时,表示后续的日期包含『 mtime 与 ctime 』,而 –newer-mtime 则仅是 mtime 而已!
这里写图片描述
现在你知道这个指令的好用了吧!甚至可以进行差异档案的记录与备份, 这样子的备份就会显的更容易!你可以这样想象,如果我在一个月前才进行过一次完整的数据备份, 那么这个月想要备份时,当然可以仅备份上个月进行备份的那个时间点之后的更新的档案即可! 为什么呢?因为原本的档案已经有备份了嘛!干嘛还要进行一次?只要备份新数据即可。这样可以降低备份的容量!

七、基本名称: tarfile, tarball ?
另外值得一提的是,tar 打包出来的档案有没有进行压缩所得到档案称呼不同! 如果仅是打包而已,就是『 tar -cv -f file.tar 』而已,这个档案我们称呼为 tarfile 。 如果还有进行压缩的支持,例如『 tar -jcv -f file.tar.bz2 』时,我们就称呼为 tarball (tar 球?) ! 这只是一个基本的称谓而已,不过很多书籍与网络都会使用到这个 tarball 的名称! 所以得要跟您介绍介绍。
此外,tar 除了可以将资料打包成为档案之外,还能够将档案打包到某些特别的装置去,举例来说, 磁带机 (tape) 就是一个常见的例子。磁带机由于是一次性读取/写入的装置,因此我们不能够使用类似 cp 等指令来复制的! 那如果想要将 /home, /root, /etc 备份到磁带机 (/dev/st0) 时,就可以使用:『tar -cv -f /dev/st0 /home /root /etc』,很简单容易! 磁带机用在备份 (尤其是企业应用) 是很常见的工作!

八、特殊应用:利用管线命令与数据流
在 tar 的使用中,有一种方式最特殊,那就是透过标准输入输出的数据流重导向(standard input/standard output), 以及管线命令 (pipe) 的方式,将待处理的档案一边打包一边解压缩到目标目录去。 关于数据流重导向与管线命令更详细的数据我们会在第十一章 bash 再跟大家介绍, 底下先来看一个例子吧!
这里写图片描述
在上面的例子中,我们想要『将 /etc 底下的资料直接 copy 到目前所在的路径,也就是 /tmp 底下』,但是又觉得使用 cp -r 有点麻烦,那么就直接以这个打包的方式来打包,其中,指令里面的 - 就是表示那个被打包的档案! 由于我们不想要让中间档案存在,所以就以这一个方式来进行复制的行为!

九、例题:系统备份范例
系统上有非常多的重要目录需要进行备份,而且其实我们也不建议你将备份数据放置到 /root 目录下! 假设目前你已经知道重要的目录有底下这几个:
- /etc/ (配置文件)
- /home/ (用户的家目录)
- /var/spool/mail/ (系统中,所有账号的邮件信箱)
- /var/spool/cron/ (所有账号的工作排成配置文件)
- /root (系统管理员的家目录)

然后我们也知道,由于第八章曾经做过的练习的关系, /home/loop* 不需要备份,而且 /root 底下的压缩文件也不需要备份,另外假设你要将备份的数据放置到 /backups ,并且该目录仅有 root 有权限进入! 此外,每次备份的档名都希望不相同,例如使用:backup-system-20091130.tar.bz2 之类的档名来处理。 那你该如何处理这个备份数据呢?(请先动手作看看,再来察看一下底下的参考解答!)
这里写图片描述
这里写图片描述

9.4. 完整备份工具:dump, restore
某些时刻你想要针对文件系统进行备份或者是储存的功能时,不能不谈到这个 dump 指令! 这玩意儿我们曾在前一章的 /etc/fstab 里面稍微谈过。 其实这个指令除了能够针对整个 filesystem 备份之外,也能够仅针对目录来备份!

9.4.1. dump
其实 dump 的功能颇强,他除了可以备份整个文件系统之外,还可以制定等级!意思就是假设你的 /home 是独立的一个文件系统,那你第一次进行过 dump 后,再进行第二次 dump 时, 你可以指定不同的备份等级,假如指定等级为 1 时,此时新备份的数据只会记录与第一次备份所有差异的档案而已。 看不懂吗?没关系!我们用一张简图来说明。
这里写图片描述
如上图所示,上方的『实时文件系统』是一直随着时间而变化的数据,例如在 /home 里面的档案数据会一直变化一样。 而底下的方块则是 dump 备份起来的数据,第一次备份时使用的是 level 0 ,这个等级也是完整的备份! 等到第二次备份时,实时文件系统内的数据已经与 level 0 不一样了,而 level 1 仅只是比较目前的文件系统与 level 0 之间的差异后,备份有变化过的档案而已。至于 level 2 则是与level 1 进行比较!
虽然 dump 支持整个文件系统或者是单一个别目录,但是对于目录的支持是比较不足的,这也是 dump 的限制所在。 简单的说,如果想要备份的数据如下时,则有不同的限制情况:

1.当待备份的资料为单一文件系统:
如果是单一文件系统 (filesystem) ,那么该文件系统可以使用完整的 dump 功能,包括利用 0~9 的数个 level 来备份, 同时,备份时可以使用挂载点或者是装置文件名 (例如 /dev/sda5 之类的装置文件名) 来进行备份!

2.待备份的数据只是目录,并非单一文件系统:
例如你仅想要备份 /home/someone/ ,但是该目录并非独立的文件系统时。此时备份就有限制啦!包括:
- 所有的备份数据都必须要在该目录 (本例为:/home/someone/) 底下;
- 且仅能使用 level 0 ,亦即仅支持完整备份而已;
- 不支持 -u 选项,亦即无法建立 /etc/dumpdates 这个个别 level 备份的时间记录文件;

dump 的选项虽然非常的繁复,不过如果只是想要简单的操作时,您只要记得底下的几个选项就很够用了!
这里写图片描述
这里写图片描述

一、用 dump 备份完整的文件系统
假如要将系统的最小的文件系统捉出来进行备份,那该如何进行呢?
这里写图片描述
这里写图片描述
这里写图片描述
这样很简单的就建立起来 /root/boot.dump 档案,该档案将整个 /boot/ 文件系统都备份下来了! 并且将备份的时间写入 /etc/dumpdates 档案中,准备让下次备份时可以作为一个参考依据。 现在让我们来进行一个测试,检查看看能否真的建立 level 1 的备份呢?
这里写图片描述
这里写图片描述
透过这个简单的方式,我们就能够仅备份差异档案的部分!底下再来看看针对单一目录的 dump 用途!

二、用 dump 备份非文件系统,亦即单一目录的方法
现在让我们来处理一下 /etc 的 dump 备份吧!因为 /etc 并非单一文件系统,他只是个目录而已。 所以依据限制的说明, -u, level 1~9 都是不适用的。我们只能够使用 level 0 的完整备份将 /etc 给他 dump 下来。因此作法就变的很简单了!
这里写图片描述
这里写图片描述
一般来说 dump 不会使用包含压缩的功能,不过如果你想要将备份的空间降低的话,那个 -j 的选项是可以使用的。 加上 -j 之后你的 dump 成果会使用较少的硬盘容量!如上述的情况来看,档案容量由原本的 128MB 左右下滑到 18MB 左右,当然可以节省备份空间!

9.4.2. restore
dump 的复原使用的是 restore 这个指令!这个指令的选项也非常的多~您可以自行 man restore 瞧瞧! 鸟哥在这里仅作个简单的介绍 !
这里写图片描述
这里写图片描述

一、用 restore 观察 dump 后的备份数据内容
要找出 dump 的内容就使用 restore -t 来查阅即可!例如我们将 boot.dump 的档案内容捉出来看看!
这里写图片描述
这个查阅的数据其实显示出的是文件名与源文件的 inode 状态,所以我们可以说, dump 会参考 inode 的记录! 透过这个查询我们也能知道 dump 的内容为何!再来查一查如何还原吧!

二、比较差异并且还原整个文件系统
为什么 dump 可以进行累积备份呢?就是因为他具有可以查询文件系统与备份文件之间的差异, 并且将分析到的差异数据进行备份的缘故。所以我们先来看看,如何查询有变动过的信息呢?你可以使用如下的方法检验:
这里写图片描述
如同上面的动作,透过曾经备份过的信息,也可以找到与目前实际文件系统中有差异的数据! 如果你不想要进行累积备份,但也能透过这个动作找出最近这一阵子有变动过的档案说!了解乎? 那如何还原呢?由于 dump 是记录整个文件系统的,因此还原时你也应该要给予一个全新的文件系统才行。 因此底下我们先建立一个文件系统,然后再来还原!
这里写图片描述
由于我们是备份整个文件系统,因此你也可以建置一个全新的文件系统 (partition) 来进行还原的动作! 整个还原的动作也不难,如上表最后一个指令,就是将备份文件中的数据还原到本目录下。 你必须要变更目录到挂载点所在的那个目录才行!这样还原的档案才不会跑错地方!如果你还想要将 level 1 的/root/boot.dump.1 那个档案的内容也还原的话,那就继续使用『restore -r -f /root/boot.dump.1』去还原吧!

三、仅还原部分档案的 restore 互动模式
某些时候你只是要将备份档的某个内容捉出来而已,并不想要全部解开,那该如何是好?此时你可以进入 restore 的互动模式 (interactive mode)。在底下我们使用 etc.dump 来进行范例说明。假如你要将 etc.dump 内的 passwd 与 shadow 捉出来而已,该如何进行呢?
这里写图片描述
这里写图片描述
这里写图片描述
透过交互式的 restore 功能,可以让你将备份的数据取出一部份,而不必全部都得解压缩才能够取得你想要的档案数据。 而 restore 内的 add 除了可以增加档案外,也能够增加整个备份的『目录』!

9.5. 光盘写入工具
某些时刻你可能会需要使用类似 DVD 之类的储存媒体来备份出来! 举例来说,你的系统配置文件或者是讨论区的数据库档案(变动性非常的频繁)。虽然 Linux 图形接口已经有不少的刻录软件可用, 但有时如果你希望系统自动在某些时刻帮你主动的进行刻录时,那么文字接口的刻录行为就有帮助了!
那么文本模式的刻录行为作法是这样的:
- 先将所需要备份的数据建置成为一个映像档(iso),利用 mkisofs 指令来处理;
- 将该映像文件刻录至光盘或 DVD 当中,利用 cdrecord 指令来处理。

9.5.1.mkisofs:建立映像档
我们从 FTP 站捉下来的 Linux 映像档 (不管是 CD 还是 DVD) 都得要继续刻录成为实体的光盘/DVD 后, 才能够进一步的使用,包括安装或更新你的 Linux !同样的道理,你想要利用刻录机将你的数据刻录到 DVD 时, 也得要先将你的数据报成一个映像档,这样才能够写入DVD片中。而将你的数据报成一个映像档的方式就透过 mkisofs 这个指令即可。 mkisofs 的使用方式如下:
这里写图片描述
这里写图片描述
其实 mkisofs 有非常多好用的选项可以选择,不过如果我们只是想要制作数据光盘时,上述的选项也就够用了。 光盘的格式一般称为 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/ 目录中) ;

如果你想要将 /root, /home, /etc 等目录内的数据通通刻录起来的话, 先得要处理一下映像档,我们先不使用 -graft-point 的选项来处理这个映像档试看看:
这里写图片描述
这里写图片描述
这里写图片描述
由上面的范例我们可以看到,三个目录 (/root, /home, /etc) 的数据通通放置到了映像文件的最顶层目录中! 真是不方便~尤其由于 /root/etc 的存在,导致那个 /etc 的数据似乎没有被包含进来的样子!真不合理~ 而且还有 lost+found 的目录存在!此时我们可以使用 -graft-point 来处理!
这里写图片描述
很奇怪,怎么我的数据会这么大(600多MB)?原来是 /home 里面在第八章的时候,练习时多了一个 /home/loopdev 的大档案!所以在重新制作一次 iso 档,并多加一个『 -m /home/loopdev 』来排除该档案的备份, 最终的档案则仅有 176MB !还好还好! ^_^ !接下来让我们处理刻录的动作了吧!

9.5.2. cdrecord:光盘刻录工具
我们是透过 cdrecord 这个指令来进行文字接口的刻录行为,这个指令常见的选项有底下数个:
这里写图片描述
这里写图片描述

一、侦测你的刻录机所在位置:
文本模式的刻录确实是比较麻烦的,因为没有所见即所得的环境!要刻录首先就得要找到刻录机才行! 而由于早期的刻录机都是使用 SCSI 接口,因此查询刻录机的方法就得要配合着 SCSI 接口的认定来处理了。 查询刻录机的方式为:
这里写图片描述
利用 cdrecord -scanbus 就能够找到正确的刻录机!由于目前个人计算机上最常使用的磁盘驱动器接口为 IDE 与 SATA , 这两种接口都能够使用 dev=ATA 这种模式来查询,因此上述的指令得要背一下!另外,在查询的结果当中可以发现有一台刻录机, 其中也显示出这台刻录机的型号,而最重要的就是上表中有底线的那三个数字!那三个数字就是代表这台刻录机的位置! 以上表的例子中,这部刻录机的位置在『 ATA:1,1,0 』这个地方!
如何将 /tmp/system.img 刻录到 CD/DVD 里面去呢?先以 CD 为例,用的是 CD-RW (可重复读写) 的光盘片,说实在话,虽然 CD-RW 或 DVD-RW 比较贵一点,不过至少可以重复利用, 对环境的冲击比较小!建议大家使用可重复读写的片子。由于 CD-RW 可能要先进行抹除的工作(将原本里面的数据删除)然后才能写入, 因此,底下我们先来看看如何抹除一片 CD/DVD 的方法,然后直接写入光盘!
由于 CD/DVD 都是使用 cdrecord 这个指令,因此不论是 CD 还是 DVD 片,下达指令的方法都差不多!不过, DVD 的写入需要额外的 driveropts=burnfree 或 -dao 等选项的辅助才行。 另外,CD 片有 CD-R(一次写入) 与 CD-RW(重复写入),至于 DVD 则主要有两种格式,分别是 DVD-R 及 DVD+R 两种格式。 如果是可重复读写的则为: DVD-RW, DVD+RW 。除了 DVD+RW 的抹除方法可能不太一样的。

二、进行 CD 的刻录动作:
这里写图片描述
这里写图片描述
事实上如果你忘记抹除可写入光盘时,其实 cdrecord 很聪明的会主动的帮你抹除! 因此上面的信息你只要记得刻录的功能即可。特别注意 -data 那个选项!因为如果没有加上 -data 的选项时, 默认数据会以音轨格式写入光盘中,所以最好能够加上 -data 这个选项! 上述的功能是针对 CD ,底下我们使用一片可重复读写的 DVD-RW 来测试一下写入的功能!

三、进行 DVD-RW 的刻录动作:
这里写图片描述
这里写图片描述
整体指令没有差很多!只是 CD-RW 会自动抹除,但 DVD-RW 似乎得要自己手动某除才行!并不会主动进入自动抹除的功能! 如果你的 Linux 是用来做为服务器之用的话,那么无时无刻的去想『如何备份重要数据』是相当重要的! 关于备份我们会在第五篇再仔细的谈一谈,这里你要会使用这些工具即可!

9.6. 其他常见的压缩与备份工具
9.6.1. dd
我们在第八章当中的特殊 loop 装置挂载时使用过 dd 这个指令。这个指令可不只是制作一个档案而已,这个 dd 指令最大的功效,应该是在于『备份』! 因为 dd 可以读取磁盘装置的内容(几乎是直接读取扇区”sector”),然后将整个装置备份成一个档案!真的是相当的好用,我们仅讲一些比较重要的选项,如下:
这里写图片描述
这里写图片描述
这里写图片描述
你可以说, tar 可以用来备份关键数据,而 dd 则可以用来备份整颗 partition 或整颗 disk ,不过,如果要将数据填回到 filesystem 当中, 可能需要考虑到原本的 filesystem 才能成功啊!让我们来完成底下的例题试看看:
这里写图片描述
这里写图片描述

9.6.2. cpio
这个指令挺有趣的,因为 cpio 可以备份任何东西,包括装置设备档案。不过 cpio 有个大问题, 那就是 cpio 不会主动的去找档案来备份! cpio 得要配合类似 find 等可以找到文件名的指令来告知 cpio 该被备份的数据在哪里! 因为牵涉到我们在第三篇才会谈到的数据流重导向说~ 所以这里你就先背一下语法,等到第三篇讲完你就知道如何使用 cpio !
这里写图片描述
这里写图片描述
上述的选项与指令中怎么会没有指定需要备份的数据呢?还有那个大于 (>) 与小于 (<) 符号是怎么回事啊?因为 cpio 会将数据整个显示到屏幕上,因此我们可以透过将这些屏幕的数据重新导向 (>) 一个新的档案! 至于还原呢?就是将备份文件读进来 cpio (<) 进行处理之意!我们来进行几个案例你就知道啥是啥了!
这里写图片描述
我们使用 find /boot 可以找出档名,然后透过那条管线 (|, 亦即键盘上的 shift+\ 的组合), 就能将档名传给 cpio 来进行处理!最终会得到 /tmp/boot.cpio 那个档案!接下来让我们来进行解压缩看看。
这里写图片描述
事实上 cpio 可以将系统的数据完整的备份到磁带机上头去!如果你有磁带机的话!
- 备份:find / | cpio -ocvB > /dev/st0
- 还原:cpio -idvc < /dev/st0

这个 cpio 好像不怎么好用!但是,他可是备份的时候的一项利器!因为他可以备份任何的档案, 包括 /dev 底下的任何装置档案!所以他可是相当重要的!而由于 cpio 必需要配合其他的程序,例如 find 来建立档名,所以 cpio 与管线命令及数据流重导向的相关性就相当的重要了! 其实系统里面已经含有一个使用 cpio 建立的档案!那就是 /boot/initrd-xxx 这个档案! 现在让我们来将这个档案解压缩看看,看你能不能发现该档案的内容为何?
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/kk53976047/article/details/78984399