• 20220816 08. 文件与文件系统的压缩,打包与备份


    8.1 压缩文件的用途与技术

    目前我们使用的计算机系统中都 是使用所谓的 Bytes 单位来计量的!不过,事实上,计算机最小的计量单位应该是 bits 才对

    1 Byte = 8 bits

    • 压缩

    • 解压缩

    • 压缩比

    8.2 Linux 系统常见的压缩指令

    Linux 文件的属性基本上是与文件名没有绝对关系的

    为了帮助我们人类小小的脑袋瓜子,所 以适当的扩展名还是必要的

    常见的压缩文件扩展名

    扩展名 描述
    *.Z compress 程序压缩的文件;
    *.zip zip 程序压缩的文件;
    *.gz gzip 程序压缩的文件;
    *.bz2 bzip2 程序压缩的文件;
    *.xz xz 程序压缩的文件;
    *.tar tar 程序打包的数据,并没有压缩过;
    *.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
    *.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
    *.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩

    Linux上常见的压缩指令就是 gzip, bzip2 以及最新的 xz ,至于 compress 已经退流行了。为 了支持 windows 常见的 zip,其实 Linux 也早就有 zip 指令了! gzip 是由 GNU 计划所开发出 来的压缩指令,该指令已经取代了 compress 。 后来 GNU 又开发出 bzip2 及 xz 这几个压缩 比更好的压缩指令!不过,这些指令通常仅能针对一个文件来压缩与解压缩,此时“打包软件, tar”就显的很重要

    tar 可以将很多文件“打包”成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是“打包”而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的 功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方 便并且更强大的压缩与打包功能

    8.2.1 gzip, zcat/zmore/zless/zgrep

    gzip 可以说是应用度最广的压缩指令了

    gzip 可以解开 compress, zip 与 gzip 等软件所 压缩的文件

    gzip 所创建的压缩文件为 *.gz 的文件名

    gzip [-cdtv#] 文件名 
    zcat 文件名.gz 
    
    选项与参数: 
    -c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理; 
    -d :解压缩的参数; 
    -t :可以用来检验一个压缩文件的一致性~看看文件有无错误; 
    -v :可以显示出原文件/压缩文件的压缩比等信息; 
    -# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
    
    # 范例一:找出 /etc 下面 (不含子目录) 容量最大的文件,并将它复制到 /tmp ,然后以 gzip 压缩
    ls -ldSr /etc/*
    cd /tmp
    cp /etc/services .
    gzip -v services
    ll /etc/services /tmp/services*
    

    使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的文件名,原始文 件就不再存在了。

    使用 gzip 压缩的文件在 Windows 系统中,竟然可以被 WinRAR/7zip 这 个软件解压缩

    # 范例二:由于 services 是文本文件,请将范例一的压缩文件的内容读出来
    zcat services.gz
    # 由于 services 这个原本的文件是是文本文件,因此我们可以尝试使用 zcat/zmore/zless 去读取
    # 直接用 less 也可以读取
    
    # 范例三:将范例一的文件解压缩
    gzip -d services.gz
    #  gzip -d 会将原本的 .gz 删除,回复到原本的 services 文件
    
    
    # 范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
    gzip -9 -c services > services.gz
    
    # 范例五:由范例四再次创建的 services.gz 中,找出 http 这个关键字在哪几行?
    zgrep -n 'http' services.gz
    

    通过大于 (>) 这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不 是屏幕

    如果你还想要从文字压缩文件当中找数据的话,可以通过 egrep 来搜寻关键字

    8.2.2 bzip2, bzcat/bzmore/bzless/bzgrep

    若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的

    bzip2 的用法几乎与 gzip 相同

    bzip2 [-cdkzv#] 文件名 
    bzcat 文件名.bz2 
    
    选项与参数: 
    -c :将压缩的过程产生的数据输出到屏幕上! 
    -d :解压缩的参数 
    -k :保留原始文件,而不会删除原始的文件喔! 
    -z :压缩的参数 (默认值,可以不加) 
    -v :可以显示出原文件/压缩文件的压缩比等信息; 
    -# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
    
    # 范例一:将刚刚 gzip 范例留下来的 /tmp/services 以 bzip2 压缩 
    bzip2 -v services 
    ls -l services* 
    # 此时 services 会变成 services.bz2 之外,你也可以发现 bzip2 的压缩比要较 gzip 好喔!! # 压缩率由 gzip 的 79% 提升到 bzip2 的 81% 哩! 
    
    # 范例二:将范例一的文件内容读出来! 
    bzcat services.bz2 
    
    # 范例三:将范例一的文件解压缩 
    bzip2 -d services.bz2 
    
    # 范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件 
    bzip2 -9 -c services > services.bz2
    

    8.2.3 xz, xzcat/xzmore/xzless/xzgrep

    虽然 bzip2 已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推 出了 xz 这个压缩比更高的软件!这个软件的用法也跟 gzip/bzip2 几乎一模一样

    xz [-dtlkc#] 文件名 
    xcat 文件名.xz 
    
    选项与参数: 
    -d :就是解压缩啊! 
    -t :测试压缩文件的完整性,看有没有错误 
    -l :列出压缩文件的相关信息 
    -k :保留原本的文件不删除~ 
    -c :同样的,就是将数据由屏幕上输出的意思! 
    -# :同样的,也有较佳的压缩比的意思!
    

    通过“ time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz] ”去执行运算 结果,结果发现这三个指令的执行时间依序是: 0.019s, 0.042s, 0.261s

    8.3 打包指令: tar

    gzip, bzip2, xz 也能够针对目录 来进行压缩,不过, 这两个指令对目录的压缩指的是“将目录内的所有文件 "分别" 进行压 缩”的动作

    这种将多个文件或目录包成一个大文件的指令功能,我们可以称呼他是一种“打包指令”啦! 那 Linux 有没有这种打包指令呢?是有的!那就是鼎鼎大名的 tar 这个玩意儿了! tar 可以将 多个目录或文件打包成一个大文件,同时还可以通过 gzip/bzip2/xz 的支持,将该文件同时进 行压缩! 更有趣的是,由于 tar 的使用太广泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 文件名的解压缩呢

    8.3.1 tar

    tar [-z|-j|-J] [cv] [-f 待创建的新文件名] filename...       # 打包与压缩 
    tar [-z|-j|-J] [tv] [-f 既有的 tar文件名]       # 察看文件名 
    tar [-z|-j|-J] [xv] [-f 既有的 tar文件名] [-C 目录]         # 解压缩 
    
    选项与参数: 
    -c :创建打包文件,可搭配 -v 来察看过程中被打包的文件名(filename) 
    -t :察看打包文件的内容含有哪些文件名,重点在察看“文件名”就是了; 
    -x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开 特别留意的是, -c, -t, -x 不可同时出现在一串命令行中。 
    
    -z :通过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz 
    -j :通过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2 
    -J :通过 xz 的支持进行压缩/解压缩:此时文件名最好为 *.tar.xz 特别留意, -z, -j, -J 不可以同时出现在一串命令行中 
    
    -v :在压缩/解压缩的过程中,将正在处理的文件名显示出来! 
    -f filename:-f 后面要立刻接要被处理的文件名!建议 -f 单独写一个选项啰!(比较不会忘记) 
    -C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。 
    
    其他后续练习会使用到的选项介绍: 
    -p(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件 
    -P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意; 
    --exclude=FILE:在压缩的过程中,不要将 FILE 打包!
    

    其实最简单的使用 tar 就只要记忆下面的方式即可:

    • 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称

    • 查 询:tar -jtv -f filename.tar.bz2

    • 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

    filename.tar.bz2 是我们自己取的文件名,tar 并不会主动的产生创建的文件名

    不加 [-z|-j|-J] 的话,文件名最好取为 .tar

    如果是 -j 选项,代表有 bzip2 的支持,因此文件名最好就取为 .tar.bz2

    如果是加上了 -z 的 gzip 的支持,那文件名最好取为 *.tar.gz

    由于“ -f filename ”是紧接在一起的,过去很多文章常会写成“-jcvf filename”,这样是对 的, 但由于选项的顺序理论上是可以变换的,所以很多读者会误认为“-jvfc filename”也可以~ 事实上这样会导致产生的文件名变成 c ! 因为 -fc 嘛!所以啰,建议您在学习 tar 时,将“ -f filename ”与其他选项独立出来,会比较不容易发生问题

    使用 tar 加入 -z, -j 或 -J 的参数备份 /etc/ 目录

    su -
    time tar -zpcv -f /root/etc.tar.gz /etc
    time tar -jpcv -f /root/etc.tar.bz2 /etc
    time tar -Jpcv -f /root/etc.tar.xz /etc
    ll -h /root/etc*
    du -sh /etc
    

    压缩比越好当然要花费的运算时间越多

    查阅 tar 文件的数据内容 (可察看文件名),与备份文件名有否根目录的意义

     tar -jtv -f /root/etc.tar.bz2
    

    从上面的数据我们可以发现一件很有趣的事情,那就是每个文件 名都没了根目录了!这也是上一个练习中出现的那个警告讯息“tar: Removing leading /' from member names(移除了文件名开头的 /' )”所告知的情况

    那为什么要拿掉根目录呢?主要是为了安全!我们使用 tar 备份的数据可能会需要解压缩回来 使用, 在 tar 所记录的文件名 (就是我们刚刚使用 tar -jtvf 所察看到的文件名) 那就是解压 缩后的实际文件名。

    如果没有拿掉根目录,解压缩后的文件名就会是绝对 路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!如此一来,你的原本的 /etc/ 下面的数据, 就会被备份数据所覆盖过去了!

    # 范例:将文件名中的(根)目录也备份下来,并察看一下备份文件的内容文件名
    tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
    # 查看压缩包内容
    tar -jtf /root/etc.and.root.tar.bz2
    

    如果加上 -P 选项,那么文件名内的根目录就会存在

    将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)

    # 本目录下进行解压缩
    tar -jxv -f /root/etc.tar.bz2
    
    # 在指定目录下进行解压缩
    tar -jxv -f /root/etc.tar.bz2 -C /tmp
    

    仅解开单一文件的方法

    # 1\. 先找到我们要的文件名,假设解开 shadow 文件好了:
    tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
    
    # 2\. 将该文件解开
    tar -jxv -f 打包档.tar.bz2 待解开文件名
    tar -jxv -f /root/etc.tar.bz2 etc/shadow
    

    打包某目录,但不含该目录下的某些文件之作法

    # 打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件
    tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root
    

    仅备份比某个时刻还要新的文件

    使用 --newer 时,表示后续的日期包含“ mtime 与 ctime ”,而 --newer-mtime 则仅是 mtime

    # 1\. 先由 [find](../Text/index.html#find) 找出比 /etc/passwd 还要新的文件
    find /etc -newer /etc/passwd
    
    # 2\. 使用 tar 来进行打包!日期为上面看到的 2015/06/17
    tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 --newer-mtime="2015/06/17" /etc/*
    # 最后行显示的是“没有被备份的”,亦即 not dumped
    
    # 3\. 显示出文件即可
    tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$'
    # 通过这个指令可以调用出 tar.bz2 内的结尾非 / 的文件名
    

    基本名称: tarfile, tarball ?

    tar 打包出来的文件有没有进行压缩所得到文件称呼不同喔! 如果仅是打 包而已,就是“ tar -cv -f file.tar ”而已,这个文件我们称呼为 tarfile 。 如果还有进行压缩的支 持,例如“ tar -jcv -f file.tar.bz2 ”时,我们就称呼为 tarball (tar 球?)

    特殊应用:利用管线命令与数据流

    # 1\. 将 /etc 整个目录一边打包一边在 /tmp 解开
    tar -cvf - /etc | tar -xvf -
    # 可以将 - 想成是在内存中的一个设备(缓冲区)
    

    例题:系统备份范例

    假设目前你已经知道重要的目录有下面这几个:

    • /etc/ (配置文件)

    • /home/ (使用者的主文件夹)

    • /var/spool/mail/ (系统中,所有帐号的邮件信箱)

    • /var/spool/cron/ (所有帐号的工作排成配置文件)

    • /root (系统管理员的主文件夹)

    /home/loop* 不需要备份,而且 /root 下面的压缩文件也不需要备份,另外假设你要将备份的数据放置到 /backups ,并且该目录仅 有 root 有权限进入! 此外,每次备份的文件名都希望不相同,例如使用:backup-system- 20150701.tar.bz2 之类的文件名来处理

    # 1\. 先处理要放置备份数据的目录与权限:
    mkdir /backups
    chmod 700 /backups
    
    # 2\. 假设今天是 2015/07/01 ,则创建备份的方式如下:
    tar -jcv -f /backups/backup-system-20150701.tar.bz2 --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* /etc /home /var/spool/mail /var/spool/cron /root
    

    解压缩后的 SELinux 课题

    如果因为某些缘故,所以你的系统必须要以备份的数据来回填到原本 的系统中,那么得要特别注意复原后的系统的 SELinux 问题! 尤其是在系统文件上面

    8.4 XFS 文件系统的备份与还原

    使用 tar 通常是针对目录树系统来进行备份的工作,那么如果想要针对整个文件系统来进行备 份与还原呢?由于 CentOS 7 已经使用 XFS 文件系统作为默认值,所以那个好用的 xfsdump 与 xfsrestore 两个工具对 CentOS 7 来说,就是挺重要的工具软件了。

    8.5 光盘写入工具

    8.6 其他常见的压缩与备份工具

    8.6.1 dd

    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 的意思。
    
    # 范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中
    dd if=/etc/passwd of=/tmp/passwd.back
    
    # 范例二:将刚刚烧录的光驱的内容,再次的备份下来成为图像挡
    dd if=/dev/sr0 of=/tmp/system.iso
    
    # 范例三:假设你的 USB 是 /dev/sda 好了,请将刚刚范例二的 image 烧录到 USB 磁盘中
    dd if=/tmp/system.iso of=/dev/sda
    
    # 范例四:将你的 /boot 整个文件系统通过 dd 备份下来
    df -h /boot
    dd if=/dev/vda2 of=/tmp/vda2.img
    

    默认 dd 是一个一个扇区去读/写的,而 且即使没有用到的扇区也会被写入备份文件中! 因此这个文件会变得跟原本的磁盘一模一样 大

    8.6.2 cpio

    cpio 可以备份任何东西,包括设备文件

    cpio -ovcB > [file|device] # 备份 
    cpio -ivcdu < [file|device] # 还原 
    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 方式储存
    
  • 相关阅读:
    自动化运维与Saltstack
    keepalived+nginx 高可用集群
    Nginx集群(负载均衡)
    Nginx优化
    Nginx管理(一)
    业务环境、测试、上线逻辑
    服务器部署逻辑
    python面试题——爬虫相关
    springmvc文件上传
    springmvc入门
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/16870668.html
Copyright © 2020-2023  润新知