第九章 档案与文件系统的压缩与封装
1. Gzip 格式规范: http://www.ietf.org/rfc/rfc1952.txt
2. 以下列出几个常见的压缩文件扩展名:
扩展名 | 压缩类型 |
*.Z | compress 程序压缩的档案 |
*.gz | gzip 程序压缩的档案 |
*.bz2 | bzip2 程序压缩的档案 |
*.tar | tar 程序打包的数据,并没有压缩过 |
*.tar.gz | tar 程序打包的档案,并且经过 gzip 的压缩 |
*.tar.bz2 | tar 程序打包的档案,并且经过 bzip2 的压缩 |
gzip 是由 GNU 计划所开发出来的压缩指令,该指令已经取代了 compress。后来 GNU 又开发出 bzip2 这个压缩比更好癿压缩指令。不过,它们仅能对一个档案进行压缩与解压缩。tar 可以将很多档案『打包』成为一个档案,单纯的 tar 功能仅是『打包』而已,并没有提供压缩的功能。后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起。
3. gzip 是应用度最广的压缩指令,目前 gzip 可以解开 compress, zip 与 gzip 等软件所压缩的档案:
# gzip [-cdtv#] 文件名 # zcat 文件名.gz
选项说明如下:
选项 | 功能 |
-c | 将压缩的数据输出到屏幕上,可透过数据流重导向来处理 |
-d | 解压缩 |
-t | 用来检验压缩文件的一致性,看看档案有无错误 |
-v | 可以显示出原档案/压缩文件案的压缩比等详细信息 |
-# | 压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好,默认是 -6 |
当你使用 gzip 进行压缩时,在默认状态下原本的档案会被压缩成为 .gz 的档名, 源文件就不再存在了。gzip -d (等价于gunzip)会将原本的 .gz 文件删除,解压出原本的档案。zcat 可以读取压缩后的文本文件的内容。
4. bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的:
# bzip2 [-cdkzv#] 文件名 # bzcat 文件名.bz2
选项说明如下:
选项 | 功能 |
-c | 将压缩的数据输出到屏幕上,可透过数据流重导向来处理 |
-d | 解压缩 |
-z | 压缩 |
-v | 可以显示出原档案/压缩文件案的压缩比等详细信息 |
-# | 压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好,默认是 -6 |
当你要解开一个压缩文件时, 这个档案的名称为 .bz, .bz2, .tbz, .tbz2 等等,那么就可以尝试使用 bzip2 来解压。bunzip2 和 bzip2 -d 是等价的。用 bzip2 压缩后,源文件也不会存在了。
5. 虽然 gzip 与 bzip2 也能够对目录进行压缩, 但这两个指令对目录的压缩指的是『将目录内的所有档案 "分别" 进行压缩』的动作。tar 可以将多个目录或档案打包成一个大档案,同时还可以通过 gzip/bzip2 的支持,将该档案同时进行压缩:
# tar [-j|-z] [cv] [-f 建立的文件名] filename... <==打包与压缩 # tar [-j|-z] [tv] [-f 建立的文件名] <==察看档名 # tar [-j|-z] [xv] [-f 建立的文件名] [-C 目录] <==解压缩
选项说明如下:
选项 | 功能 |
-c | 建立打包档案,可搭配 -v 来察看过程中被打包的档名(filename) |
-t | 察看打包档案的内容含有哪些档名 |
-x | 解打包或解压缩,可以搭配 -C 在特定目录解开 |
-j | 通过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2 |
-z | 透过 gzip 的支持进行压缩/解压缩:此时档名最好为 *.tar.gz |
-v | 在压缩/解压缩的过程中,将正在处理的文件名显示出来 |
-f filename | -f 后面要立刻接要被处理的压缩文件名 |
-C 目录 | 用在解压缩时,若要在特定目录解压缩,可以使用 |
-p | 保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件 |
-P | 保留绝对路径,亦即允许备份数据中含有根目录存在 |
--exclude=FILE | 在压缩的过程中,不要将 FILE 打包 |
最简单地使用 tar 有以下方式:
1) 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的档案或目录名称
2) 查 询:tar -jtv -f filename.tar.bz2
3) 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
6. 如果我只想要解开打包档案内的其中一个档案而已,只要使用 -jtv 找到你要的档名,然后:
# tar -jxv -f 打包档.tar.bz2 待解开档名
7. 以下指令可以打包 /etc/ /root 这两个目录,但却不会打包 /root/etc* 开头的档案,而且这个新的打包档案会放置成为 /root/system.tar.bz2 , 当然这个档案自己不要打包自己 (因为这个档案放置在 /root 底下):
# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root
8. 如果你只想要备份新的档案而已,可以使用--newer或--newer-mtime选项,前者既包含mtime也包含ctime:
# tar -jcvf /root/etc.newer.then.passwd.tar.bz2 --newer-mtime="2008/09/29" /etc/*
9. 如果用tar打包出来的文件,没有压缩,我们一般称其为tarfile,如果压缩了,则称为tarball。
10. tar还能够将档案打包到磁带机 (tape)上,磁带机由于是一次性读取/写入的装置,因此我们不能够使用类似 cp 等指令来复制:
# tar -cv -f /dev/st0 /home /root /etc
11. 当-f后跟的是减号(-)时,代表标准输出(压缩时)或标准输入(解压时),比如,下列命令等价于cp -r /etc:
# tar -cvf - /etc | tar -xvf -
12. dump 指令除了能够对整个 filesystem 备份外,也能够对目录来备份,还可以制定等级:
dump的语法如下:
# dump [-Suvj] [-level] [-f 备份档] 待备份资料 # dump -W
选项说明如下:
选项 | 功能 |
-S | 仅列出后面的待备份数据需要多少磁盘空间才能够备份完毕 |
-u | 将这次 dump 的时间记录到 /etc/dumpdates 档案中 |
-v | 将 dump 档案的过程显示出来 |
-j |
加入 bzip2 的支持,将数据进行压缩,默认 bzip2 压缩等级为 2 一般来说 dump 不会自动使用压缩的功能。 |
-level | dump 等级,从 -0 ~ -9 共十个等级 |
-v | 在压缩/解压缩的过程中,将正在处理的文件名显示出来 |
-f | 后面接产生的档案,亦可接例如 /dev/st0 装置文件名等 |
-W | 列出在 /etc/fstab 里面的具有 dump 设定的 partition 是否有备份过 |
dump在备份数据时:
1) 当待备份的资料为单一文件系统时,那么该文件系统可以使用完整的 dump 功能,包括利用 0~9 的数个 level 来备份,同时,备份时可以使用挂载点或装置文件名 来进行备份。
2) 待备份的数据只是目录,并非单一文件系统时,备份会有如下限制:
a) 所有的备份数据都必项要在该目录底下;
b) 且仅能使用 level 0 ,亦即仅支持完整备份而已;
c) 不支持 -u 选项,亦即无法建立 /etc/dumpdates 这个个别 level 备份的时间记录文件;
13. dump 的复原使用的是 restore 这个指令:
# restore -t [-f dumpfile] [-h] <==用来察看 dump 档 # restore -C [-f dumpfile] [-D 挂载点] <==比较dump与实际档案 # restore -i [-f dumpfile] <== 进入互动模式 # restore -r [-f dumpfile] <==还原整个文件系统选项说明如下:
选项 | 功能 |
-t | 察看 dump 起来的备份文件中含有什么数据 |
-C |
将 dump 内的数据跟实际的文件系统做比较,列出『在 dump 档案内有但与 目前文件系统不一样』的档案 |
-i | 进入互动模式,可以仅还原部分档案,用在 dump 目录时的还原 |
-r |
将整个 filesystem 还原,用在还原针对文件系统的 dump 备份 |
-h | 察看备份数据中的 inode 与文件系统 label 等信息 |
-f | 后面接要处理的那个 dump 档案 |
-D | 与 -C 搭配,后面接挂载点 |
默认restore会将备份文件解压到当前目录。进入互动模式后,add file 可以将 file 加入待解压档案列表中;delete file 可以将 file 移除出待解压档案列表;extract 会开始将刚刚选择的档案列表解压缩出去。
14. 要利用刻录机将数据刻录到 DVD 时, 要先将数据生成一个映像档,这样才能够写入DVD片中。而将数据生成像档的方式就是通过 mkisofs 这个指令:
mkisofs [-o 映像档] [-rv] [-m file] 待备份文件.. [-V vol] -graft-point isodir=systemdir ...
选项说明如下:
选项 | 功能 |
-o | 后面接想要产生的那个映像档档名 |
-r |
通过 Rock Ridge 产生支持 Unix/Linux 的档案数据,可记录较多的信息 |
-v | 显示生成 ISO 档案的过程 |
-m file |
排除 (exclude) 后面档案(file)不生成到映像档中 |
-V vol | 建立 Volume,有点像 Windows 在档案总管内看到的 CD title 的东西 |
-graft-point | graft有转嫁或移植的意思,指定当前目录与映像档中目录的映射关系 |
光盘的格式一般称为 iso9660 ,这种格式一般仅支持旧版的 DOS 档名,亦即档名只能以 8.3 (文件名8个字符,扩展名3个字符) 的方式存在。如果加上 -r 的选项,那么档案信息能够被记录得比较完整,可包括UID/GID与权限等等。默认情况下,所有要被加到映像档中的档案都会被放置到映象文件中的根目录, 如可以使用 -graft-point 这个选项,以如下方式来定义位于映像文件中的目录:
映像文件中的目录所在=实际 Linux 文件系统的目录所在
15. cdrecord 指令可以进行文字接口的刻录行为:
# cdrecord -scanbus dev=ATA <==查询刻录机位置 # cdrecord -v dev=ATA:x,y,z blank=[fast|all] <==擦除重复读写片 # cdrecord -v dev=ATA:x,y,z -format <==格式化DVD+RW # cdrecord -v dev=ATA:x,y,z [可用选项功能] file.iso选项说明如下:
选项 | 功能 |
-scanbus | 扫瞄磁盘总线并找出可用的刻录机,后续癿装置为 ATA 接口 |
-v | 在 cdrecord 运行过程中,显示过程 |
dev=ATA:x,y,z |
后续的 x, y, z 为你系统上刻录机所在的位置,可通过-scanbus查询到。 |
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 | 指定多少缓存可用在记录DVD的过程中。默认为 4m, 一般建议可增加到 8m |
driveropts=burnfree | 仅针对DVD,打开 Buffer Underrun Free 模式的写入功能 |
-sao | 支持 DVD-RW 的格式 |
IDE 与 SATA 都能够使用 dev=ATA 这种模式来查询。
16. dd 可以读取磁盘装置的内容(几乎是直接读取扇区"sector"),然后将整个装置备份成一个档案:
dd if="input_file" of="output_file" bs="block_size" count="number"
if 是 input file,也可以是装置;of 是 output file,也可以是装置;bs 为规划的一个 block 的大小,若未指定则默认为 512 bytes(一个 sector 的大小);count 指定多少个 bs。tar 可以用来备份关键数据,而 dd 则可以用来备份整个 partition 或 整块 disk,因为它是硬件级别的复制,而不是文件系统级别的。(superblock,boot sector,metadata 的区块,使用 cp 或 tar 指令是无法备份的。)不过,要将数据填回到 filesystem 当中, 需要考虑到原本的 filesystem 才行。
17. cpio 可以备份任何东西,包括装置设备档案。但 cpio 是流式指令,需要配合类似 find 等可以找到文件名的指令来告知 cpio 该被备份的数据在哪里:
# cpio -ovcB > [file|device] <==备份 # cpio -ivcdu < [file|device] <==还原 # cpio -ivct < [file|device] <==察看
选项说明如下:
选项 | 功能 |
-o | 将数据 copy 输出到档案或装置上 |
-B | 让默认的 Blocks 可以增加至 5120 bytes ,默认是 512 bytes。这样的好处是可以让大档案的储存速度加快。 |
-i |
将数据从档案或装置 copy 到当前目录 |
-d | 自动建立目录。使用 cpio 所备份的数据可能会在不同层的目录中,-d 选项可以让 cpio 在还原时可以建立新目录 |
-u | 自动地将较新的档案覆盖较旧的档案 |
-t | 需配合 -i 选顷,可用在"察看"以 cpio 建立的档案或装置的内容 |
-v | 让储存的过程中文件名可以在屏幕上显示 |
-c | 以一种较新的portable format 方式储存 |
fs=Ym | 指定多少缓存可用在记录DVD的过程中。默认为 4m, 一般建议可增加到 8m |
driveropts=burnfree | 仅针对DVD,打开 Buffer Underrun Free 模式的写入功能 |
-sao | 支持 DVD-RW 的格式 |