004 文件与文件系统的压缩与打包
1. Linux系统常见的压缩命令
linux下压缩文件的扩展名大多为*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *bz2
Linux 支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,需要用扩展名进行区分
*.Z compress 程序压缩的文件;
*.gz gzip 程序压缩的文件;
*.bz2 bzip2 程序压缩的文件;
*.tar tar 程序打包的数据,并没有压缩过;
*.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
|
① Compress(新的CentOS系统已经不安装,gzip已经可以解压compress压缩的文件),压缩后原来文件不存在
安装 ncompress
yum install ncompress
[root@www ~]# compress [-rcv] 文件或目录<==这里是压缩 [root@www ~]# uncompress 文件.Z <==这里是解压缩
选项与参数: -r :可以连同目录下的文件也同时给予压缩 -c :将压缩数据输出成为 standard output (输出到屏幕) -v :可以显示出压缩后的文件信息以及压缩过程中的一些文件名变化。
②gzip, zcat
gzip可以说是应用最广的压缩命令了,目前可以解开compress、zip与gzip等软件压缩的文件。压缩后文件不存在。
[root@www ~]# gzip [-cdtv#] 文件名 [root@www ~]# zcat 文件名.gz
选项与参数: -c :将压缩的数据输出到屏幕上,可通过数据流重定向来处理; -d :解压缩的参数; -t :可以用来检验一个压缩文件的一致性,看看文件有无错误; -v :可以显示出原文件/压缩文件的压缩比等信息; -# :压缩等级,-1 最快,但是压缩比最差;-9 最慢,但是压缩比最好,默认是 -6
压缩文件原来是文本文件的,可以使用zcat进行读取(gizp和compress压缩的)
不要使用 gunzip 这个命令,不好记。使用 gzip -d 来进行解压缩。与 gzip 相反, gzip -d 会将原本的 .gz 删除,产生原本的 man.config 文件。
③bzip2, bzcat 压缩比比gzip更好,用法与gzip一致
[root@www ~]# bzip2 [-cdkzv#] 文件名 [root@www ~]# bzcat 文件名.bz2 |
2. 打包命令:tar
tar 可以将多个目录或文件打包成一个大文件,同时还可以通过 gzip/bzip2 的支持,将该文件同时进行压缩
tar常用选项
[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 打包!
- 仅解开单一文件的方法
[root@www ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
# 解压包含shadow的文件
将shadow文件解压
[root@www ~]# tar -jxv -f 打包档.tar.bz2 待解开文件名
[root@www ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
- 打包某目录,但不含该目录下的某些文件之作法
- [root@www ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
>--exclude=/root/system.tar.bz2 /etc /root
连续输入多行,可以按 \ 然后按Enter
上面是打包压缩/etc和/root,但不包括/root/下以etc开始的文件或文件夹和/root/system.tar.bz2
- 仅备份比某个时刻还要新的文件
--newer-mtime 参数
其实有两个参数:一个是『 --newer 』另一个就是『 --newer-mtime 』, 当使用 --newer 时,表示后续的日期包含『 mtime 与 ctime 』,而 --newer-mtime 则仅是 mtime 而已
tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 \
>--newer-mtime="2008/09/29"/etc/*
表示mtime比2008-09-29更新的时间会被打包压缩
- 基本名称: tarfile, tarball
如果仅是打包而已,就是『 tar -cv -f file.tar 』而已,这个文件我们称呼为 tarfile 。 如果还有进行压缩的支持,例如『 tar -jcv -f file.tar.bz2 』时,我们就称呼为 tarball。
- 特殊应用:利用管线命令与数据流
# 1. 将 /etc 整个目录一边打包一边在 /tmp 解开 [root@www ~]# cd /tmp [root@www tmp]# tar -cvf - /etc | tar -xvf - |
3. 完整备份工具:
① dump
如果想要备份的数据如下时,则有不同的限制情况:
- 当待备份的数据为单一文件系统:
如果是单一文件系统 (filesystem) ,那么该文件系统可以使用完整的 dump 功能,包括利用 0~9 的数个 level 来备份, 同时,备份时可以使用挂载点或者是设备文件名 (例如 /dev/sda5 之类的设备文件名) 来进行备份! - 待备份的数据只是目录,并非单一文件系统:
例如你仅想要备份 /home/someone/ ,但是该目录并非独立的文件系统时。此时备份就有限制,包括:
- 所有的备份数据都必须要在该目录 (本例为:/home/someone/) 底下;
- 且仅能使用 level 0 ,亦即仅支持完整备份而已;
- 不支持 -u 选项,亦即无法创建 /etc/dumpdates 这个各别 level 备份的时间记录档;
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 共十个等级; -f :有点类似 tar ,后面接产生的文件,亦可接例如 /dev/st0 设备文件名等 -W :列出在 /etc/fstab 里面的具有 dump 配置的 partition 是否有备份过
② restore
恢复数据,dump的恢复就是用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 :将整个 filesystem 还原的一种模式,用在还原针对文件系统的 dump 备份; 其他较常用到的选项功能: -h :察看完整备份数据中的 inode 与文件系统 label 等信息 -f :后面就接你要处理的那个 dump 文件 -D :与 -C 进行搭配,可以查出后面接的挂载点与 dump 内有不同的文件
4. 光盘写入工具
命令行刻录的步骤:
- 先将所需要备份的数据构建成为一个映像档(iso),利用 mkisofs 命令来处理;
- 将该映像档烧录至光盘或 DVD 当中,利用 cdrecord 命令来处理。
mkisofs:创建镜像文件
[root@www ~]# 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,有点像 Windows 在文件资源管理内看到的 CD title 的东西 -graft-point:graft有转嫁或移植的意思。
cdrecord:光盘刻录工具
[root@www ~]# cdrecord -scanbus dev=ATA <==查询刻录机位置 [root@www ~]# cdrecord -v dev=ATA:x,y,z blank=[fast|all]<==抹除重复读写片 [root@www ~]# cdrecord -v dev=ATA:x,y,z -format <==格式化DVD+RW [root@www ~]# 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 而已; [可用选项功能] 主要是写入 CD/DVD 时可使用的选项,常见的选项包括有: -data :指定后面的文件以数据格式写入,不是以 CD 音轨(-audio)方式写入! speed=X :指定刻录速度,例如CD可用 speed=40 为40倍数,DVD则可用 speed=4 之类 -eject :指定刻录完毕后自动退出光盘 fs=Ym :指定多少缓冲存储器,可用在将映像文件先缓存至缓冲区。默认为 4m, 一般建议可添加到 8m ,不过,还是得视你的刻录机而定。 针对 DVD 的选项功能: driveropts=burnfree :打开 Buffer Underrun Free 模式的写入功能 -sao :支持 DVD-RW 的格式
- 检测你的刻录机所在位置:cdrecord -scanbus dev=ATA
- 进行 CD 的刻录动作:
# 0. 先抹除光盘的原始内容:(非可重复读写则可略过此步骤) [root@www ~]# cdrecord -v dev=ATA:1,1,0 blank=fast
# 中间会跑出一堆信息告诉你抹除的进度,而且会有 10 秒钟的时间等待取消 # 可以避免『手滑』的情况!^_^# 1. 开始烧录: [root@www ~]# cdrecord -v dev=ATA:1,1,0 fs=8m -dummy -data \ > /tmp/system.img
....中间省略.... Track 01: 168 of 176 MB written (fifo 100%) [buf 100%] 10.5x. <==显示百分比
# 上面会显示进度,还有 10.5x 代表目前的刻录速度 cdrecord: fifo had 2919 puts and 2919 gets. cdrecord: fifo was 0 times empty and 2776 times full, min fill was 97%. # 2. 烧录完毕后,测试挂载一下,检验内容: [root@www ~]# mount -t iso9660 /dev/cdrom /mnt [root@www ~]# df -h /mnt Filesystem Size Used Avail Use% Mounted on /dev/hdd 177M 177M 0 100% /mnt
- 进行 DVD-RW 的烧录动作:
# 0. 同样的,先来抹除一下原本的内容: [root@www ~]# cdrecord -v dev=ATA:1,1,0 blank=fast
# 1. 开始写入 DVD ,请注意,有些选项与 CD 并不相同 [root@www ~]# cdrecord -v dev=ATA:1,1,0 fs=8m -data -sao \ > driveropts=burnfree /tmp/system.img
# 2. 同样的,j进行测试 [root@www ~]# mount /dev/cdrom /mnt [root@www ~]# df -h /mnt Filesystem Size Used Avail Use% Mounted on /dev/hdd 177M 177M 0 100% /mnt [root@www ~]# umount /mnt
5. 其他常见压缩和备份工具
① dd
不仅能够复制大文件,最大功效在于备份
重要参数
[root@www ~]# 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 的意思。
② cpio
需要配合find等可以找到文件的指令来告知cpio该备份的数据在哪
[root@www ~]# cpio -ovcB > [file|device]<==备份 [root@www ~]# cpio -ivcdu < [file|device]<==还原 [root@www ~]# cpio -ivct < [file|device]<==察看
备份会使用到的选项与参数: -o :将数据 copy 输出到文件或设备上 -B :让默认的 Blocks 可以添加至 5120 bytes ,默认是 512 bytes ! 这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念) 还原会使用到的选项与参数: -i :将数据自文件或设备 copy 到系统当中 -d :自动创建目录,使用 cpio 所备份的数据内容不见得会在同一层目录中,因此我们 必须要让 cpio 在还原时可以创建新目录,此时就得要 -d 选项的帮助 -u :自动的将较新的文件覆盖较旧的文件! -t :需配合 -i 选项,可用在"察看"以 cpio 创建的文件或设备的内容 一些可共享的选项与参数: -v :让储存的过程中文件名称可以在屏幕上显示 -c :一种较新的 portable format 方式储存
例子:
[root@www ~]# find /boot | cpio -ocvB > /tmp/boot.cpio [root@www ~]# ll -h /tmp/boot.cpio -rw-r--r-- 1 root root 16M Dec 17 23:30 /tmp/boot.cpio
我们使用 find /boot 可以找出文件名,然后通过那条管线 (|, 亦即键盘上的 shift+\ 的组合), 就能将档名传给 cpio 来进行处理,最终会得到 /tmp/boot.cpio 那个文件