Chapter 12 压缩打包

12.1 确定文件类型

下面列出了几种常见的压缩文件的扩展名:

*.Z         compress程序压缩的文件
*.zip       zip压缩文件
*.gz        gzip压缩文件
*.bz2       bzip2压缩文件
*.xz        xz压缩文件
*.tar       tar打包文件,无压缩
*.tar.gz
*.tar.bz2
*.tar.xz

然而文件扩展名与文件类型并无直接关系,我们可以使用file命令查看文件类型:

[root@Cent-KVM ~]# file testfile 
testfile: gzip compressed data

Linux下也可以很方便地查看文件头,来判断文件类型

12.2 zip

zip是一种经典的压缩方式,文件头是504B0304,504B的ASCII对应为PK

[root@Cent-KVM ~]# od -t x testfile.zip 
0000000 04034b50
[root@Cent-KVM ~]# head -n 1 testfile.zip 
PK
  • zip [选项] 输出文件 输入文件

    -r :递归压缩目录

yum -y install unzip

  • unzip [选项] zip_file

    -b dir : 解压到指定目录

    -l :查看文件中的内容而不解压文件

12.3 gzip

gz是由GNU计划所开发出来的压缩命令,应用十分广泛。许多网页就使用了gz压缩加快传输。

文件头共10字节,包含幻数、版本号、时间戳。其中ID1、ID2是固定的,CM压缩算法目前仅一种

故gz文件总以1F8B08开始

[root@Cent-KVM ~]# od -t x test.gz 
0000000 08088b1f
  • gzip [选项] file

    -v 显示压缩比等信息

    -r 分别压缩目录中的每个文件

    -d 解压gz文件

    -c –stdout,输出到屏幕,可以重定向

    -l 列出信息

注意gzip压缩或解压会替换掉原文件,而使用stdout则不会删除

如果不想删除原文件,可以:

gzip -c test.txt > test.gz

还可以指保存的路径

gzip -dc test.gz > /home/test.txt

12.4 bzip2

bzip2提供了更好的压缩比,用法与gzip基本相同

yum -y install bzip2

  • bzip2 [选项] file

    -k 保留原文件

12.5 xz

xz的压缩比更高,但是压缩相对也慢一些,用法与gzip和bzip2几乎相同

12.6 cat/more/less/grep

如果gzip, bzip2, xz压缩的是文本文件,那么可以直接通过对应的命令读取文件的内容

例如:

[root@Cent-KVM ~]# bzcat test.txt.bz2 
111
222
[root@Cent-KVM ~]# xzless passwd.xz
[root@Cent-KVM ~]# zgrep 'cent' passwd.gz 
cent:x:1000:1000:cent:/home/cent:/bin/bash

12.7 tar

gzip, bzip2, xz 这些命令压缩的对象都是文件,如果要将整个目录压缩,就要配合tar生成打包文件(tarfile)再生成压缩文件(tarball)

tar命令的选项非常之多

例如:

压缩:tar -cJvf file1.tar.xz 原文件

查询:tar -tjvf file2.tar.bz2

解压:tar -xzvf file3.tar.gz -C 解压目录

互斥项:

  • 操作:

    -c    创建打包文件
    -x    解包
    -t    查看打包文件的内容
  • 压缩方式:

    -z    gzip
    -j    bzip2
    -J    xz
  • 解压目录:

    -C dir    用于解压缩,指定解压目录
    -P        压缩或解压时不去除路径开头的/,即使用绝对路径

其他常用选项:

  •   -v                处理时显示正在处理的文件名
      -f filename       接要被处理的文件名
      -p                提取有关文件权限的信息(default for superuser)
      --exclude=FILE    打包时排除文件

实例:

  • 总结:使用绝对路径打包和解压

    压缩:tar -cPzvf test1.tar.gz /root/test

    解压:tar -xPzvf test1.tar.gz

    三个条件(压缩时原文件用绝对路径表示,压缩、解压都带-P选项)缺一不可,否则会解压到当前路径

    当然,这样做是比较危险的,容易覆盖的一些重要文件

  • 排除指定目录/文件:

    tar --exclude=[目录名/*|文件名] -czvf filename.tar.gz 目录名

    注意 -f 要紧跟文件名,exclude可以方放前面,不要把它俩隔开

  • 仅解压指定文件

    [root@Cent-KVM ~]# tar -tzvf backup.tar.gz | grep passwd
    -rw-r--r-- root/root       889 2021-11-22 17:35 backup/passwd
    [root@Cent-KVM ~]# tar -xzvf backup.tar.gz backup/passwd
    backup/passwd
  • 备份指定日期之后的文件

    tar cjvf /root/etc.tar.bz2 --newer-mtime="2020/02/02" /etc/*

打包到特殊位置:

  • 磁带(/dev/st0)

    tar -cvf /dev/st0 /root /home /etc

  • 管道

    cd /tmp
    tar -cvf - /etc | tar -xvf -

    两个-分别代表stdout, stdin

12.8 dd

dd if="input" of="output" bs="block_size" count="n"

举例:

  • 备份一个文件,bs默认512Bytes

    dd if=/etc/passwd of=/tmp/passwd.bak

  • 从光盘上备份出iso镜像

    dd if=/dev/sr0 of=/tmp/system.iso

  • iso镜像刻录到U盘

    dd if=/tmp/system.iso of=/dev/sda

  • 备份boot分区

    dd if=/dev/vda2 of=/tmp/boot.img

12.9 光盘镜像

12.9.1 mkisofs

yum -y install genisoimage

在CentOS 7,此时mkisofs和genisoimage是等价的

/usr/bin/mkisofs -> /etc/alternatives/mkisofs -> /usr/bin/genisoimage

  • genisoimage [options] [-o filename] pathspec [pathspec …]

    -r 通过Rock River产生支持UNIX/Linux的文件数据,可记录UID/GID等信息

    -v verbose

    -V volid Specifies the volume ID (volume name or label)

    -m file 排除文件

mkisofs -r -v -o etc.img /etc

这样可以把/etc下所有文件写入镜像文件顶层目录中

如果要写入来自不同目录的一些文件,可以使用-graft-point,以把他们放入镜像的不同目录

mkisofs -r -V 'linux file' -o system.img -graft-point /root.bak=/root /etc.bak=/etc

12.9.2 loop 挂载

mount -o loop system.img /mnt/linux

系统会把档案文件映射到loop设备上,进而实现挂载

loop挂载的文件需要具有文件系统,不然会无法读取

在CentOS 7上测试时,貌似可省略-o loop