Linux系统文件压缩与备份

2022-12-28 14:05:22 浏览数 (1)

在 Linux 系统选有相当多的压缩命令可以使用,这些压缩指令可以让我们更方便的从网上下载大型文件,本章第一节内容我们就来谈谈这个 Linux 系统下常用的几种压缩格式吧.

♥ 文章声明 ♥ 该系列文章部分文字描述,整理于以下文献,化繁为简. 《鸟哥的Linux私房菜 (基础学习篇 第三版)》 - 作者:鸟哥 《Linux就该这么学》 - 作者:刘遄

Linux 文件压缩

你是否有过文件文件太大,导致无法以U盘将他复制完成的困扰,还有你是否有过要备份某些重要数据,偏偏这些数据量太大了,耗掉了你很多的磁盘空间呢,这个时候,那个『文件压缩』技术可就派的上用场了.

由于我们记录数字是 1 考虑计算机所谓的二进位如此一来 1 会在最右边占据 1 个bit,而其他的 7 个bits将会自动的被填上 0 所以说,剩下的那 7 位空间则是空值,而压缩就是将这些空值暂时的填充满,使其能够节约空间,当我们使用的时候,再将这些空值展开,这就是最常用的压缩技术.

另外一种压缩技术也很有趣,他是将重复的数据进行统计记录的,举例来说,如果你的数据为『111....』共有100个1时,那么压缩技术会记录为『100个1』而不是真的有100个1的位存在,这样也能够精简文件记录的容量呢.

在这里有个小知识点,有些汇编语言算法,可以将一部电影压缩到几KB的大小,而且还可以有声音,是不是很神奇,这也是汇编语言的强大之处.

这是因为 Linux 支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,当然彼此之间可能就无法互通压缩/解压缩文件,所以当你下载到某个压缩包时,自然就需要知道该文件是由哪种压缩命令所制作出来的,好用来对照着解压缩啊,也就是说,虽然 Linux 文件的属性基本上是与文件没有绝对关系的,但是为了好区分这些文件使用的是那种压缩技术,从而出现了拓展名,下面是 Linux 系统下常用的一些压缩格式.

.Z ----------> compress 程序压缩的文件 .gz ----------> gzip 程序压缩的文件 .bz2 ----------> bzip2 程序压缩的文件 .tar ----------> tar 程序打包的数据,并没有压缩过 .tar.gz ----------> tar 程序打包的文件,其中并且经过 gzip 的压缩 .tar.bz2 ----------> tar 程序打包的文件,其中并且经过 bzip2 的压缩 tar.xz ----------> tar 程序打包的文件,其中并且经过 xz 的压缩

Linux上常见的压缩命令就是 gzip 与 bzip2 ,至于 compress 已经推出江湖了,gzip 是由 GNU 计划所开发出来的压缩命令,该命令已经取代了 compress 后来 GNU 又开发出 bzip2 这个压缩比更好的压缩命令.

◆compress 压缩◆

compress命令使用 Lempress-Ziv 编码压缩数据文件,compress是个历史悠久的压缩程序,文件经它压缩后,其名称后面会多出 ".Z" 的扩展名,当要解压缩时,可执行uncompress指令,事实上uncompress是指向compress的符号连接,因此不论是压缩或解压缩,都可通过compress指令单独完成,但是需要注意的是,这个命令只有在老式的Unix主机上还在使用,一般已经弃用了.

在使用这个命令之前,我们必须要先来安装一下它,因为这个命令已经不常用了,所以并没有集成安装.

代码语言:javascript复制
[root@localhost ~]# yum install -y ncompress
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Package ncompress-4.2.4.4-3.el7.x86_64 already installed and latest version
Nothing to do

[root@localhost ~]# rpm -qi ncompress
Name        : ncompress
Version     : 4.2.4.4
Release     : 3.el7
Architecture: x86_64
Install Date: Fri 16 Nov 2018 06:30:17 AM EST
Group       : Applications/File
Size        : 36101
License     : Public Domain
Signature   : RSA/SHA256, Wed 02 Apr 2014 12:23:03 PM EDT, Key ID 199e2f91fd431d51
Source RPM  : ncompress-4.2.4.4-3.el7.src.rpm
Build Date  : Sun 26 Jan 2014 12:52:02 PM EST
Build Host  : x86-020.build.eng.bos.redhat.com
Relocations : (not relocatable)
Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Vendor      : Red Hat, Inc.
URL         : http://ncompress.sourceforge.net/
Summary     : Fast compression and decompression utilities
Description :

接下来,我们来看一下它的命令参数说明吧.

代码语言:javascript复制
[root@localhost ~]# compress --help

命令语法:[ compress [选项] 文件或目录 ]

        -f              #强制覆盖掉目标文件
        -c              #将结果送到标准输出,无文件被改变
        -r              #递归的操作方式
        -b 数字         #压缩效率是一个介于9~16
        -d              #对文件进行解压缩而非压缩
        -v              #显示指令执行过程

压缩实例:通过使用compress -c命令压缩一个文件.

代码语言:javascript复制
[root@localhost ~]# ls -lh
total 944K
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash

[root@localhost ~]# compress -c bash > bash.Z

[root@localhost ~]# ls -lh
total 1.6M
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
-rw-r--r--. 1 root root 596K Nov 16 06:38 bash.Z

解压实例:通过使用compress -d命令解压一个文件.

代码语言:javascript复制
[root@localhost ~]# ls -lh
total 596K
-rw-r--r--. 1 root root 596K Nov 16 06:38 bash.Z

[root@localhost ~]# compress -d bash.Z

[root@localhost ~]# ls -lh
total 944K
-rw-r--r--. 1 root root 942K Nov 16 06:38 bash

◆zip,unzip 压缩◆

zip命令可以用来解压缩文件,或者对文件进行打包操作,zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有 ".zip" 扩展名的压缩文件,由于各种系统都支持zip的压缩格式,所以在一定程度上,是可以通用的.

在使用这个命令之前,我们必须要先来安装一下它,因为这个命令并没有集成安装.

代码语言:javascript复制
[root@localhost ~]# yum install -y zip unzip
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Package zip-3.0-11.el7.x86_64 already installed and latest version
Package unzip-6.0-19.el7.x86_64 already installed and latest version
Nothing to do

接下来,我们来看一下它的命令参数说明吧.

代码语言:javascript复制
[root@localhost ~]# zip --help

命令语法:[ zip/unzip [选项] 文件或目录 ]

        -r              #递归压缩,连同子目录一同压缩
        -S              #包含系统和隐藏文件
        -v              #显示指令执行过程
        -q              #不显示指令执行过程

压缩实例:通过使用zip -r -v 命令将/etc/目录全部内容压缩.

代码语言:javascript复制
[root@localhost ~]# zip -r -v lyshark.zip /etc/

[root@localhost ~]# ls -lh
total 12M
-rw-r--r--. 1 root root 12M Nov 16 09:46 lyshark.zip

查询实例:通过使用unzip -l命令查询一个压缩包中的文件.

代码语言:javascript复制
[root@localhost ~]# unzip -l lyshark.zip

解压实例:通过使用unzip -d命令将文件解压到指定目录.

代码语言:javascript复制
[root@localhost ~]# unzip lyshark.zip -d /tmp/

[root@localhost ~]# ls -lh /tmp/
total 12K
drwxr-xr-x. 84 root root 8.0K Nov  6 11:02 etc

◆gzip,zcat 压缩◆

gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用,其拓展名为.gz,gzip不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式,据统计gzip命令对文本文件有60%~70%的压缩率,减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.

由于这个命令很常用,我们无需来安装它,他是系统内置的,下面来看一下它的常用参数吧.

代码语言:javascript复制
[root@localhost ~]# gzip --help

命令语法:[ gzip/zcat [选项] 文件或目录 ]

        -a              #使用ASCII文字模式
        -d              #解开压缩文件
        -f              #强行压缩文件
        -l              #列出压缩文件的相关信息
        -n              #压缩时,不保存原来的文件名称及时间戳
        -N              #压缩时,保存原来的文件名称及时间戳
        -q              #不显示警告信息
        -r              #递归处理
        -v              #显示指令执行过程

压缩实例:通过使用gzip -rv命令压缩一个文件.

代码语言:javascript复制
[root@localhost ~]# ls -lh
total 944K
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash

[root@localhost ~]# gzip -rv bash
bash:    51.2% -- replaced with bash.gz

[root@localhost ~]# ls -lh
total 460K
-rwxr-xr-x. 1 root root 460K Sep 26  2017 bash.gz

查询实例:通过使用gzip -l/zcat -l命令查询一个文件.

代码语言:javascript复制
[root@localhost ~]# gzip -l bash.gz

         compressed        uncompressed  ratio uncompressed_name
             470300              964544  51.2% bash

[root@localhost ~]# zcat -l bash.gz
         compressed        uncompressed  ratio uncompressed_name
             470300              964544  51.2% bash

解压实例:通过使用gzip -dv / zcat命令解压一个文件.

代码语言:javascript复制
[root@localhost ~]# ls -lh
total 460K
-rwxr-xr-x. 1 root root 460K Sep 26  2017 bash.gz

[root@localhost ~]# gzip -dv bash.gz
bash.gz:         51.2% -- replaced with bash

[root@localhost ~]# zcat -d bash.gz >bash_zcat
[root@localhost ~]# ls -lh
total 2.1M
-rw-r--r--. 1 root root 942K Nov 16 06:56 bash
-rw-r--r--. 1 root root 942K Nov 16 06:56 bash.zcat
-rwxr-xr-x. 1 root root 460K Sep 26  2017 bash.gz

◆bzip2,bzcat 压缩◆

bzip2命令用于创建和管理,包括解压缩,.bz2格式的压缩包,我们遇见Linux压缩打包方法有很多种,以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看,相信大家看完后会有很多收获.

在使用这个命令之前,我们必须要先来安装一下它,因为这个命令并没有集成安装.

代码语言:javascript复制
[root@localhost ~]# yum install -y bzip2
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Package bzip2-1.0.6-13.el7.x86_64 already installed and latest version
Nothing to do

紧接着,下面来看一下它的常用参数吧.

代码语言:javascript复制
[root@localhost ~]# bzip2 --hlep

命令语法:[ bzip2/bzcat [选项] 文件或目录 ]

        -c              #输出压缩解压过程
        -d              #执行解压缩
        -k              #解压后保留原始文件
        -v              #压缩或解压时详细输出
        -z              #强制执行压缩

压缩实例:通过使用bzip2 -kzv命令将bash文件压缩.

代码语言:javascript复制
[root@localhost ~]# ls -lh
total 944K
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash

[root@localhost ~]# bzip2 -kzv bash
  bash:     2.164:1,  3.697 bits/byte, 53.79% saved, 964544 in, 445742 out.

[root@localhost ~]# ls -lh
total 1.4M
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
-rwxr-xr-x. 1 root root 436K Sep 26  2017 bash.bz2

解压实例:通过使用bzip2 -kdv命令解压缩bash.bz2文件.

代码语言:javascript复制
[root@localhost ~]# ls -lh
total 436K
-rwxr-xr-x. 1 root root 436K Sep 26  2017 bash.bz2

[root@localhost ~]# bzip2 -kdv bash.bz2
  bash.bz2: done

[root@localhost ~]# ls -lh
total 1.4M
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
-rwxr-xr-x. 1 root root 436K Sep 26  2017 bash.bz2

◆tar 归档并压缩◆

tar命令可以为linux的文件和目录创建压缩包,利用tar可以为某一特定文件创建备份,也可以在压缩包中改变文件,或者向压缩包中加入新的文件,tar最初被用来在磁带上创建备份,现在,用户可以在任何设备上创建压缩文件啦,利用tar命令可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的.

这里要弄清两个概念:打包和压缩,打包是指将一大堆文件或目录变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件.

为什么要区分这两个概念呢? 这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2).

首先老样子,我们先来看一下tar命令所支持的参数吧,在这里我们列出最常用的参数.

代码语言:javascript复制
[root@localhost ~]# tar --hlep

命令语法:[ tar [选项] 文件或目录 ]

        -c              #新建打包
        -t              #查看打包文件
        -x              #解压打包文件
        -j              #通过bz2进行压缩与解压
        -z              #通过gz进行压缩与解压
        -J              #通过xz进行压缩与解压
        -v              #显示压缩与解压过程
        -C              #指定解压到哪里

压缩与解压tar.gz:通过使用tar -czvf xzvf tvf命令压缩解压与查询.

代码语言:javascript复制
[root@localhost ~]# tar -czvf lyshark.tar.gz /etc/*        #将/etc/*目录下的内容压缩成lyshark.tar.gz
[root@localhost ~]# tar -tvf lyshark.tar.gz                #查询包中的内容
[root@localhost ~]# tar -xzvf lyshark.tar.gz -C /etc/      #将压缩包,解压到/etc/目录下

压缩与解压tar.bz2:通过使用tar -cjvf xjvf tvf命令压缩解压与查询.

代码语言:javascript复制
[root@localhost ~]# tar -cjvf lyshark.tar.bz2 /etc/*        #将/etc/*目录下的内容压缩成lyshark.tar.bz2
[root@localhost ~]# tar -tvf lyshark.tar.bz2                #查询包中的内容
[root@localhost ~]# tar -xjvf lyshark.tar.bz2 -C /etc/      #将压缩包,解压到/etc/目录下

压缩与解压tar.xz:通过使用tar -cJvf xJvf tvf命令压缩解压与查询.

代码语言:javascript复制
[root@localhost ~]# tar -cJvf lyshark.tar.xz /etc/*         #将/etc/*目录下的内容压缩成lyshark.tar.xz
[root@localhost ~]# tar -tvf lyshark.tar.xz                 #查询包中的内容
[root@localhost ~]# tar -xJvf lyshark.tar.xz -C /etc/       #将压缩包,解压到/etc/目录下

Linux 文件备份

老实说,备份是系统损毁时等待救援的救星,因为你需要重新安装系统时,备份的好坏会影响到你系统复原的进度,不过我们想先知道的是,系统为什么会损坏啊?是人为的还是怎样产生的啊? 事实上,系统有可能由于不预期的伤害而导致系统发生错误,什么是不预期的伤害呢?这是由于系统可能因为不预期的硬件损坏,例如硬盘坏掉等等,或者是软件问题导致系统出错,包括人为的操作不当或是其他不明因素等等所致,下面我们就来谈谈系统损坏的情况与如何备份吧.

◆cpio 块级备份◆

cpio命令主要是用来建立或者还原备份的工具程序,cpio命令可以复制文件到归档包中,或者从归档包中复制文件,这个命令挺有趣的,因为 cpio 可以备份任何东西,包括装置设备文件,不过 cpio 有个大问题,那就是 cpio 不会主动的去找文件来备份,一般来说 cpio 得要配合类似 find 等可以找到文件的命令来告知 cpio 该被备份的数据在哪里,好了废话不多说,先看语法吧.

代码语言:javascript复制
[root@localhost ~]# cpio --help

备份语法:[ cpio –cvBo > [文件|设备] ]

        -c              #使用portable format存储方式
        -v              #显示过程
        -B              #设定输入输出块为512bytes
        -o              #进入copy-out模式(压缩)

查看语法:[ cpio –ivct < [cpio文件] ]

        -i              #将数据从文件复制到系统中

        -c              #使用portable format存储方式
        -t              #查看CPIO压缩包内容

还原语法:[ cpio –idvcu < [cpio文件] ]

        -i              #进入copy-in模式(解压)
        -d              #恢复到指定位置(视压缩方式恢复)
        -v              #显示过程
        -c              #使用portable format存储方式
        -u              #替换所有文件,无提示

实例1:使用cpio -cvBo命令,来备份/etc/目录

代码语言:javascript复制
[root@localhost ~]# find /etc/ -print | cpio -cvBo > /root/etc.cpio

[root@localhost ~]# ls -lh
total 109M
-rw-r--r--. 1 root root 109M Nov 16 10:50 etc.cpio

实例2:使用cpio -cvBo命令,将/etc/目录下的内容备份到/sdb磁盘

代码语言:javascript复制
[root@localhost ~]# find /etc/ -print | cpio -cvBo > /dev/vdb

实例3:使用cpio -ivct命令查询,压缩包内容

代码语言:javascript复制
[root@localhost ~]# ls -lh
total 109M
-rw-r--r--. 1 root root 109M Nov 16 10:50 etc.cpio

[root@localhost ~]# cpio -ivct < etc.cpio

实例4:使用cpio -idvcu还原文件到/etc/目录

代码语言:javascript复制
[root@localhost ~]# ls -lh
total 109M
-rw-r--r--. 1 root root 109M Nov 16 10:50 etc.cpio

[root@localhost ~]# cpio -idvcu < /root/etc.cpio

◆dd 测速与拷贝◆

dd命令用于复制文件并对原文件的内容进行转换和格式化处理,dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果,用的比较多的还是用dd来备份裸设备,但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便,建议在有需要的时候使用dd对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便,另外,使用dd对磁盘操作时,最好使用块设备文件.

代码语言:javascript复制
[root@localhost ~]# dd --help

备份语法:[ dd [if=源文件] [of=输出] [count=计数] ]

        if=文件名        #输入文件名
        of=文件名        #输出文件名
        bs=bytes        #读入计数
        count=blocks    #仅拷贝blocks个块
        /dev/zero       #是字符设备会不断返回0值字节
        /dev/null       #空设备,相当于一个垃圾桶
代码语言:javascript复制
#将本地的 /dev/sda 整盘备份到 /dev/hdd
[root@localhost ~]# dd if=/dev/sda /of=/dev/hdd

#将 /dev/sda 全盘数据备份成指定路径的image文件
[root@localhost ~]# dd if=/dev/sda of=/tmp/image

#将image备份文件恢复到指定盘/dev/sdb
[root@localhost ~]# dd if=/tmp/image of=/dev/sdb

#备份 /dev/sda 全盘数据,并利用gzip工具进行压缩,保存到指定路径 /tmp/image.gz
[root@localhost ~]# dd if=/dev/sda | gzip > /tmp/image.gz

#恢复,将压缩的备份文件 /tmp/image.gz ,恢复到制定盘 /dev/sdb
[root@localhost ~]# gizp -dc /tmp/image.gz | dd of=/dev/sdb

#备份MBR,备份磁盘 /dev/sda 开始的512个字节大小的MBR信息到指定文件 /tmp/mbr512
[root@localhost ~]# dd if=/dev/sda of=/tmp/mbr512 count=1 bs=512
1 0 records in
1 0 records out
512 bytes (512 B) copied, 0.00015245 s, 3.4 MB/s

其中:count=1 指仅拷贝一个块;bs=512 指块大小为512个字节

#恢复MBR,将备份 /tmp/mbr512 的MBR信息写到磁盘开始部分 /dev/sda
[root@localhost ~]# dd if=/tmp/mbr512 of=/dev/sda
1 0 records in
1 0 records out
512 bytes (512 B) copied, 0.000201242 s, 2.5 MB/s

#拷贝内存内容到磁盘
[root@localhost ~]# dd if=/dev/mem of=/tmp/mem_image bs=1024(指定块大小为1k)
dd: error reading ‘/dev/mem’: Bad address
632 0 records in
632 0 records out
647168 bytes (647 kB) copied, 0.001591 s, 407 MB/s

#拷贝光盘内容到指定文件夹,并保存为/tmp/LyShark.iso文件
[root@localhost ~]# dd if=/dev/sr0 of=/tmp/LyShark.iso
1249 0 records in
1248 0 records out
638976 bytes (639 kB) copied, 0.368021 s, 1.7 MB/s

#利用随机数填充磁盘,彻底销毁磁盘 /dev/sdb 数据
[root@localhost ~]# dd if=/dev/urandom of=/dev/sdb

#测试磁盘读写速度(可分别测试1024,2048,4096,8192)
[root@localhost ~]# dd if=/dev/zero of=/dev/null bs=1024 count=10000
10000 0 records in
10000 0 records out
10240000 bytes (10 MB) copied, 0.00852247 s, 1.2 GB/s

◆mkisofs 制作镜像◆

mkisofs命令用来将指定的目录与文件做成ISO 9660格式的映像文件,以供刻录光盘,其实 mkisofs 有非常多好用的选项可以选择,不过如果我们只是想要制作数据光盘时,下面介绍的的选项也就够用了,光盘的格式一般称为 iso9660 这种格式一般仅支持旧版的 DOS 档名,亦即档名只能以 8.3 (档名8个字节,扩展名3个字节) 的方式存在,如果加上 -r 的选项之后,那么文件资讯能够被记录的比较完整,可包括UID/GID与权限等.

下面我们来看一下它的基本参数吧.

代码语言:javascript复制
[root@localhost ~]# mkisofs --help

命令语法:[ mkisofs [选项] 文件或目录 ]

        -o              #后面接镜像名
        -r              #连同文件属性一起记录
        -v              #显示构建过程
        -m              #排除指定文件
        -V              #新建volume

制作一个镜像:通过mkisofs制作一个镜像将/etc目录制作成lyshark.iso.

代码语言:javascript复制
[root@localhost ~]# mkisofs -r -v -o /root/lyshark.iso /etc/

[root@localhost ~]# ls -lh
total 123M
-rw-r--r--. 1 root root 123M Nov 16 11:14 lyshark.iso

0 人点赞