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

  •  常见的两种压缩方法
    • 数据通过二进制数字存储,通常以字节为单位
    • 1、比如数字8,存储结果为0000 1000,前端有四个bits空闲被浪费,通过复杂的算法,就能把这些浪费的空间利用起来
    • 2、统计重复数据的个数,实现文件记录的精简
    • 压缩前后占用空间的比例称为“压缩比”
  • 常见压缩与打包的扩展名
    • *.Z:compress程序压缩
    • *.gz:gzip程序压缩
    • *.bz2:bzip2程序压缩
    • *.tar:tar程序打包,未压缩
    • *.tar.gz:用gzip压缩后用tar打包
    • *.tar.bz2:bzip2压缩后用tar打包
    •  
    • 压缩程序发展:compress --> gzip --> bzip2(向下兼容)
      • gzip和bzip2可以被Windows的WinRAR识别
    • 打包程序:tar
  • compress(*.Z)
    • 基本语法:
      • 压缩:compress [-rcv] dirname/filename
        • -r:连同目录下的文件也给予压缩
        • -c:将压缩数据输出称为standard output(输出到屏幕)
          • 一般默认会删除源文件
          • 如果要保留,可以借助该参数
          • 如:compress -c man.config > man.config.back.Z
        • -v:显示压缩后的的文件信息和压缩过程中一些文件名的变化
      • 解压缩:uncompress ***.Z
  • gzip(*.gz)
    • 基本语法
      • (解)压缩:gzip [-cdtv#] filename
        • -c:将压缩数据输出到屏幕上,可以通过数据流重定向来处理
          • 跟compress的-c参数一样可以用来保留源文件
        • -d:解压缩
          • 等价于gunzip,但是建议使用gzip -d
        • -t:检验压缩文件一致性
        • -v:显示压缩比等信息
        • -#:压缩等级
          • -1:最快,但是压缩比最差
          • -9:最慢,但是压缩比最好
          • -6:默认等级
      • 读取:zcat ***.gz
        • 读取的是纯文本文件压缩后的文件
  • bzip2(*.bz2)
    • 基本语法
      • (解)压缩:bzip2 [-cdkzv#] filename
        • -c:将压缩过程中产生的数据输出到屏幕上
          • 和compress和gzip的-c参数一样
        • -d:解压缩
          • 等价于bunzip2,但还是建议使用bzip2 -d
        • -k:保留源文件
        • -z:压缩
        • -v:显示压缩比等信息
        • -#:压缩等级
          • 与gzip相同
      • 读取:bzcat ***.bz2
  • tar(*.tar / *.tar.gz / *.tar.bz2)
    • 基本语法
      • 打包压缩:tar [-j | -z] [-cv] [-f new_filename] filename1, filename2, filename3,.........
        • -p:(小写)保留数据原本的权限和属性,常用于备份重要的配置文件
        • -P:(大写)保留绝对路径,允许备份数据存在根目录
          • 默认会删除根目录,如“/etc”会变成“etc”
          • 默认情况下会警告:"tar:Removing leading `\` from menber names"
      • 查看文件名:tar [-j | -z] [-tv] [-f filename]
      • 解压:tar [-j | -z] [-xv] [-f filename [filename]] [-C dirname]
        • -c:新建打包文件
        • -t:查看打包文件的内容
        • -x:解包或者解压
          • -C 目录:解包或解压到指定目录
          • 默认会解包或解压到当前目录
          • 如果打包压缩时加入了-P参数,会解包或解压到它的原目录
        • ======以上三种参数是三种模式,不能同时使用======
        • -j:使用bzip2,文件名最好为*.tar.bz2
        • -z:使用 gzip,文件名最好为*.tar.gz
        • ======以上两个参数指定了压缩方式=====
        • -v:显示正在处理的文件名
          • 如果是查看文件,加入该参数表示显示文件的详细信息
        • -f filename:文件名
          • tar不会主动创建文件名
          • 如果是解压,还可以接着在filename继续指定要解压的文件(注意考虑是带不带根目录的)
        • --exclude=FILE:忽略FILE文件,不进行打包
    • 常用指令
      • 压缩:tar -jcv -f new_filename.tar.bz2 filename1, filename2, .........
      • 查询:tar -jtv -f filename.tar.bz2
      • 解压:tar -jxv -f filename.tar.bz2 -C destination
    • 查看包含关键词(以aaa为例)的文件
      • tar -jtv -f filename | grep 'aaa'
      • grep是选取关键词的功能
    • 只备份比某文件更新的文件
      • 先用ll命令查看该文件的time
      • 给tar命令加入--newer参数:
        • --newer="2008/09/22":同时比较ctime和mtime
        • --newer-mtime:只比较mtime
        • --newer-ctime:只比较ctime
      • 如:tar -jcv -f /root/etc.newer.tar.bz2 --newer-mtime="2008/09/22" /etc/*
        • 备份/etc目录下mtime比该时间早的文件
    • tarfile和tarball
      • tarfile是纯粹打包的文件
      • tarball是打包后又进行压缩的文件
    • tar还可以把文件打包到特殊设备上去,比如磁带机(一次性读取/写入)
      • 某些设备是不能直接用cp命令写入,但tar可以
      • 如:tar -cv -f /dev/st0 /home /root /etc,常用该命令来进行备份
    • 特殊应用:利用管道命令与数据流
  • 完整备份工具:dump
    • 基本语法1:dump [-Suvj] [-level] [-f 备份文件] 待备份数据
      • -S:仅列出所需的磁盘空间
      • -u:将这次备份记录到/etc/dumpdates文件中
        • 文件记录内容包括文件系统、等级、ctime
      • -v:显示过程
      • -j:使用bzip2,默认等级2
        • 一般dump不会使用压缩功能
      • -level:指定等级-0 ~ -9共十个等级
        • -0为完整备份
        • -1在参考-0的基础上对发生更改的数据进行备份
        • -2在参考-1的基础上对发生更改的数据进行备份
        • ……(以此类推)
      • -f:后接生成的文件名
    • 基本语法2:dump -W
      • 列出具有dump设置的分区是否备份过
      • 参考了/etc/fstab文件
    • 若待备份数据为单一文件系统
      • 可以使用完整的dump功能
      • 可以使用挂载点  或  设备文件名
    • 若待备份数据只是目录
      • 所有备份数据必须在此目录下
      • 只能使用level 0也就是完整备份
      • 不支持-u,无法创建相应的时间记录文件
  • 恢复dump备份数据:restore
    • 查看dump文件:restore -t [-f dumpname] [-h]
      • -h:查看完整备份数据中的inode与文件系统label等信息
      • 如果备份数据经过压缩,第一行会提示“dumptape is compressed”
    • 比较dump与实际文件:restore -C [-f dumpname] [-D 挂载点]
      • 列出dump有记录,且目前系统文件不同的文件
      • 不列出新增的文件
    • 互动模式:restore -i [-f dumpfile]
      • 实现部分文件的恢复
      • 该模式下执行help命令可以列出菜单,主要功能如下
        • ls:列出dump内的文件和目录
          • 待解压的文件或目录会有“*”作为前缀
        • cd:在dump内更改目录
        • pwd:列出dump文件的路径文件名
        • add file:将file加入待解压的文件列表
        • delete:将file从待解压的文件列表中删除
        • extract:按照文件列表执行解压
    • 还原整个文件系统:restore -r [-f dumpfile]
      • 还原到当前目录下所在的文件系统
  • 新建iso镜像文件:mkisofs
    • 基本语法:mkisofs [-o 输出文件] [-rv] [-m file] 待备份文件.... [-V vol] -graft-point isodir=systemdir ....
      • -o:后接输出文件名
      • -r:通过Rock Ridge产生支持UNIX/Linux的文件数据,可记录较多的信息
        • 默认使用ISO9660格式,该格式仅支持旧版DOS文件名,只能以“8.3”(文件名8字符,扩展名3字符)的方式存在
        • 加入该参数,可以记录比较完整的信息,包括UID/GID、权限等
      • -v:显示过程
      • -m file:排除file文件
      • -V vol:新建Volume
      • -graft-point isodir=systemdir:(转嫁、移植)指定待备份文件放置在光盘下的哪个目录
        • 默认文件都丢在光盘根目录上
        • 如:/linux/etc=/etc表示将带备份文件/etc目录放置到光盘的/linux/etc目录下
        • 该参数后面的文件就是要备份的文件,无需重新写出备份文件
      • 如:mkisofs -r -V 'Linux_file' -o /tmp/system.img -m /home/lost+found -graft-point /root=/root /home=/home /etc=/etc
  • 光盘刻录工具:cdrecord
    • 查询刻录机位置:cdrecord -scanbus dev=ATA
      • -scanbus:扫描磁盘总线并找出可用的刻录机,后接设备接口
        • 早期刻录机采用SCSI接口,目前一般为IDE或SATA接口,ATA模式能同时查询这两种接口

    • 抹除重复读写片:cdrecord -v dev=ATA:x,y,z blank=[fast | all]
      • dev=ATA:x,y,z:后接设备接口,及刻录机的位置(x,y,z)
      • blank=[fast | all]:抹除可重复写入的CD/DVD-RW,fast较快,all较完整
    • 格式化DVD+RM:cdrecord -v dev=ATA:x,y,z -format
      • -format:仅针对DVD+RW格式的DVD
    • 刻录:cdrecord -v dev=ATA:x,y,z [可用参数功能] file.iso
      • -data:以数据格式写入,而不是以CD音轨(-audio)方式写入
      • speed=X:指定刻录速度
      • -eject:刻录完毕后自动退出光盘
      • fs=Ym:指定缓冲存储器为YM,可将镜像文件先暂存到暂存区
        • 默认为4M
        • 一般可增加到8M,视刻录机而定
      • ======以下参数针对DVD,写入DVD时必须加入这两个参数======
      • driveropts=burnfree:打开Buffer Underrun Free模式写入功能
      • -sao:支持DVD-RW格式
    • 光盘种类
      • CD有CD-R、CD-RW
      • DVD有DVD-R、DVD+R、DVD-RW、DVD+RW
      • (R为一次写入,RW为重复写入)
      • !!!DVD+RW的抹除方法比较特殊,是用-format参数
    • 对于CD-RW,直接刻录会自动抹除数据
    • 对于DVD-RW,直接刻录不会主动进入自动抹除功能,需要手动抹除
  • 打包、制作空文件:dd
    • 基本语法:dd if="input file" of="output file" bs="block size" count="number"
      • if:输入文件或设备
      • of:输出文件或设备
      • bs:规划block大小
        • 默认为512bytes
      • count:指定block个数
    • 执行结果的行首会出现”x+y“的信息(如”3+1“)
      • x是使用的完整block个数
      • y是使用的未满的block个数
    • 该命令常用于备份,如果要恢复,把if和of倒过来即可
    • 备份:tar和dd
      • 备份关键数据:tar
      • 备份整块分区或者整块硬盘:dd
    • 恢复分区时,新建的分区不需要格式化就可以直接作为恢复的目的分区
      • 因为dd会把分区中扇区表面的数据整个复制过来
      • 包括superblock, boot sector, meta data等
  • 强力备份:cpio
    • 备份:cpio -ovcB > [file | device]
      • -o:将数据copy输出到文件或设备上
      • -v:让存储过程中文件名显示到屏幕上
      • -c:一种较新的portable format方式存储
      • -B:让blocks增加到5120bytes,方便大文件的存储
        • 默认是512bytes
    • 还原:cpio -ivcdu < [file | device]
      • -i:将数据从文件或设备复制到系统中
      • -d:自动新建目录
      • -u:自动将较新的文件覆盖旧文件
    • 查看:cpio -ivct < [file |device]
      • -t:配合-i,用于查看以cpio新建的文件或设备的内容
    • cpio可以备份任何东西,甚至设备文件
    • cpio不会主动去找文件来备份,需要find等命令结合管道命令和数据流重定向来找到文件名并且告知cpio
      • find /boot -print先找出/boot下的文件
      • find /boot | cpio -ocvB > /tmp/boot.cpio 将/boot备份出来
\00