第8章 文件与文件系统的压缩

8.2 Linux常见压缩命令

扩展名含义

*.zip

zip程序压缩的文件
*.gzgzip程序压缩的文件
*.bz2bzip2程序压缩的文件
*.xzxz程序压缩的文件
*.tartar程序打包的文件,并没有压缩过
*.tar.gztar程序打包的文件,并且经过gzip压缩
*.tar.bz2tar程序打包的文件,并且经过bzip2压缩
*.tar.xztar程序打包的文件,并且经过xz压缩

8.2.1 gzip, zcat/zmore/zless/zgerp

gzip [-cdtv#] 文件名

    -c:将压缩的数据输出到屏幕

    -d:解压缩

    -t:用于检验一个压缩文件的一致性

    -v:可以显示压缩比等信息

    -#:#为数字的意思,代表压缩等级,-9压缩比最好,但是最慢

[root@host-192-168-177-76 tmp]# gzip -v services
services:        79.4% -- replaced with services.gz
# 源文件会消失
[root@host-192-168-177-76 tmp]# ll /etc/services services.gz
-rw-r--r--. 1 root root 692252 Jul  7  2020 /etc/services
-rw-r--r--. 1 root root 142528 Jul 25 20:20 services.gz

使用zcat/zmore/zless/可以直接读取压缩文件内容

[root@host-192-168-177-76 tmp]# zcat services.gz

解压缩

[root@host-192-168-177-76 tmp]# gzip -d services.gz
[root@host-192-168-177-76 tmp]# ls -la services
-rw-r--r--. 1 root root 692252 Jul 25 20:20 services

使用最佳压缩比-9,并保留原本的文件

[root@host-192-168-177-76 tmp]# gzip -9 -c services > services.gz
[root@host-192-168-177-76 tmp]# ls -l serv*
-rw-r--r--. 1 root root 692252 Jul 25 20:20 services
-rw-r--r--. 1 root root 141945 Jul 25 20:29 services.gz

使用zgerp找到压缩文件中的关键词

[root@host-192-168-177-76 tmp]# zgrep -n 'http' services.gz
14:#       http://www.iana.org/assignments/port-numbers
87:http            80/tcp          www www-http    # WorldWideWeb HTTP
88:http            80/udp          www www-http    # HyperText Transfer Protocol

8.2.2 bzip2, bzcat/bzmore/bzless/bzgrep

bzip2比前面的gzip压缩比更好,时间更长,命令参数基本一样,多了一个-k

bzip2 [-cdktv#] 文件名

    -c:将压缩的数据输出到屏幕

    -d:解压缩

    -k:保留原始文件

    -v:可以显示压缩比等信息

    -#:#为数字的意思,代表压缩等级,-9压缩比最好,但是最慢

[root@host-192-168-177-76 tmp]# bzip2 -vk services
  services: \ 5.353:1,  1.495 bits/byte, 81.32% saved, 692252 in, 129328 out.
[root@host-192-168-177-76 tmp]# ls -la services*
-rw-r--r--. 1 root root 692252 Jul 25 20:20 services
-rw-r--r--. 1 root root 129328 Jul 25 20:20 services.bz2
-rw-r--r--. 1 root root 141945 Jul 25 20:29 services.gz

8.2.3 xz, xzcat/xzmore/xzless/xzgerp

xz压缩比更好,多了一个-l,可以列出压缩文件的相关信息

xz [-dtlkc#] 文件名

    -c:将压缩的数据输出到屏幕

    -d:解压缩

    -l:列出压缩文件的相关信息

    -k:保留原始文件

    -t:用于检验一个压缩文件的一致性

    -#:#为数字的意思,代表压缩等级,-9压缩比最好,但是最慢

[root@host-192-168-177-76 tmp]# xz -kv services
services (1/1)
  100 %       103.4 KiB / 676.0 KiB = 0.153
[root@host-192-168-177-76 tmp]# ls -la services*
-rw-r--r--. 1 root root 692252 Jul 25 20:20 services
-rw-r--r--. 1 root root 129328 Jul 25 20:20 services.bz2
-rw-r--r--. 1 root root 141945 Jul 25 20:29 services.gz
-rw-r--r--. 1 root root 105872 Jul 25 20:20 services.xz
# 通过-l查看压缩前后的容量
root@host-192-168-177-76 tmp]# xz -l services.xz
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1    103.4 KiB    676.0 KiB  0.153  CRC64   services.xz

8.3 打包命令:tar

tar可以把多个目录和多个文件打包成一个大文件,同时还可以通过gzip,bzip2,xz的支持,将文件同时进行压缩

打包与压缩:tar [-z | -j | -J] [cv] [-f 新文件名] 老文件名/目录

查看文件名:tar [-z | -j | -J] [tv] [-f 既有的tar文件名]

解压缩:       tar [-z | -j | -J] [xv] [-f 既有的tar文件名] [-C 目录]

    -c:建立打包文件

    -t:查看打包文件

    -x:解包或者解压缩,搭配-C,可以指定解压后的目录

    

    -z:通过gzip进行压缩/解压缩,文件名最好是*.tar.gz

    -j:通过bzip2进行压缩/解压缩,文件名最好是*.tar.bz2

    -J:通过xz进行压缩/解压缩,文件名最好是*.tar.xz

    

    -v:在压缩/解压缩过程中,将正在处理的文件名显示出来

    -f filename:-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 想解压到的具体目录

使用tar进行压缩

[root@host-192-168-177-76 tecs]# 三种压缩搭配tar的用法
[root@host-192-168-177-76 tecs]# time tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/' from member names  # 删除文件名开头的/
real    0m2.408s
user    0m2.357s
sys     0m0.082s

[root@host-192-168-177-76 tecs]# time tar -jpc -f /root/etc.tar.bz2 /etc
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
real    0m4.090s
user    0m4.059s
sys     0m0.086s

[root@host-192-168-177-76 tecs]# time tar -Jpc -f /root/etc.tar.xz /etc
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets

real    0m21.621s
user    0m21.558s
sys     0m0.121s

[root@host-192-168-177-76 tecs]# ll /root/etc*
-rw-r--r--. 1 root root  8755998 Jul 26 10:17 /root/etc.tar.bz2
-rw-r--r--. 1 root root 10765469 Jul 26 10:16 /root/etc.tar.gz
-rw-r--r--. 1 root root  7297512 Jul 26 10:19 /root/etc.tar.xz
[root@host-192-168-177-76 tecs]# du -sm /etc
43      /etc            # 实际占用43MB,压缩后基本是7-10M

查看tar文件数据

查看etc.tar.bz2会发现每个文件名都没有根目录(/),打包压缩时的告警也可以体现

拿掉根目录的好处在于,如果在/tmp目录解压,文件名就会变成/tmp/etc/xxx,如果没有去掉,解压后文件时绝对路径,一定会被放在/etc/xxx,这样/etc下最新的文件会被覆盖

[root@host-192-168-177-76 tecs]# tar -jtv -f /root/etc.tar.bz2
......
-rw-r--r-- root/root        55 2020-04-24 11:14 etc/asound.conf
-rw------- root/root        36 2022-07-22 22:45 etc/cron.allow

如果确定就是要备份根目录,使用-P(大写)即可

[root@host-192-168-177-76 tecs]# tar jpPc -f /root/etc.root.tar.bz2 /etc
[root@host-192-168-177-76 tecs]# tar jtf /root/etc.root.tar.bz2
/etc/asound.conf
/etc/cron.allow
# 在etc前面多了根目录/,并且没有加-v,所以没有详细属性和权限

将tar文件解压缩

如果直接解压缩,文件会放在当前目录,也可以通过 -C将文件解压到指定目录

[root@host-192-168-177-76 ~]# tar -jx -f /root/etc.tar.bz2 -C /tmp
[root@host-192-168-177-76 tmp]# ls -la
total 1112
drwxrwxrwt.   9 root root   4096 Jul 26 10:39 .
dr-xr-xr-x.  19 root root   4096 Jul 26 07:45 ..
-rw-r-----.   1 root root    240 Jul 26 10:42 dftab
drwxr-xr-x. 118 root root  12288 Jul 26 07:45 etc

解开单一文件

# 1. 先找到我要要的文件名,比如shadow
[root@host-192-168-177-76 ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
---------- root/root      1450 2022-07-25 17:57 etc/shadow
---------- root/root       667 2022-07-22 22:42 etc/gshadow-
---------- root/root      1450 2022-07-22 22:46 etc/shadow-
---------- root/root       672 2022-07-22 22:46 etc/gshadow
# 2. 将文件解开
[root@host-192-168-177-76 ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@host-192-168-177-76 ~]# ll etc
total 4
----------. 1 root root 1450 Jul 25 17:57 shadow
# 会将shadow解压到当前目录的/etc目录中
# 不能写成/etc/shadow,这里的压缩没有加P,所以没有根目录(/)

打包目录但排除某些文件

可以通过--exclude实现

[root@host-192-168-177-76 tecs]# tar -jcv -f /root/system.tar.gz2 --exclude=/root/etc* \  
> --exclude=/root/system.tar.gz2 /etc /root
# 反斜杠时可以把命令变成多行,实际上就是tar -jcv -f /root/system.tar.gz2 --exclude=/root/etc* --exclude=/root/system.tar.gz2 /etc /root

备份比某个时刻更新的文件

# 1.先由find找出比/etc/passwd还要新的文件
[root@host-192-168-177-76 ~]# find /etc -newer /etc/passwd
[root@host-192-168-177-76 ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1862 Jul 22 22:45 /etc/passwd
# 2.用tar打包,日期为2022/07/22
[root@host-192-168-177-76 ~]# tar -jcv -f /root/etc.newer.passwd.tar.bz2 \
> --newer-mtime="2022/07/22" /etc/*
# not dumped即没有被备份
# 3.显示文件
[root@host-192-168-177-76 tecs]# tar -jtv -f /root/etc.newer.passwd.tar.bz2 | grep -v '/$'
#此命令可以调出tar.bz2内的结尾非/的文件名

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

 XFS文件系统备份xfsdump

    -L:xfsdump的session标头,填写简易说明

    -M:存储媒介的标头,填写简易说明

    -l:L小写,指定等级0-9,默认0,完整备份

    -f:后面接新文件名

    -I:查出目前备份的信息

# 进行全量备份/boot文件系统
[root@host-192-168-177-76 tecs]# xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot
#下面是增量备份
# 1. 首先用xfsdump -I查看备份信息,只有session 0,而且level是0
# 2. 然后可以建立一个大约10MB的文件在/boot内
[root@host-192-168-177-76 tecs]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
# 3. 创建差异备份文件,使用level 1
[root@host-192-168-177-76 tecs]# xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot
#生成的boot.dump1应该就是10MB

XFS文件系统还原xfsrestore

    -I:查出目前备份的信息

    -f:后面接备份文件

    -L:session的标头

    -s:接特定目录,即只恢复某一个文件或目录

简单恢复level 0的文件系统

# 1. 直接将数据覆盖到/boot
[root@host-192-168-177-76 tecs]# xfsrestore -f /srv/boot.dump -L boot_all /boot
# 2. 再将数据覆盖到/tmp/boot
[root@host-192-168-177-76 tecs]# mkdir /tmp/boot
[root@host-192-168-177-76 tecs]# xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot
[root@host-192-168-177-76 tecs]# du -sm /boot /tmp/boot
# 两个不一致,因为上面步骤2新建了一个10MB的在/boot
# 3. 只恢复备份文件的grub2到/tmp/boot2
[root@host-192-168-177-76 tecs]# mkdir /tmp/boot2
[root@host-192-168-177-76 tecs]# xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2

恢复增量备份数据,如果备份数据是level 0 -> level 1 -> level 2...,那么恢复也是一样的,恢复level 0后,就可以恢复level 1

 [root@host-192-168-177-76 tecs]# xfsrestore -f /srv/boot.dump1 /tmp/boot

8.5 光盘写入工具

8.5.1 mkisofs:建立镜像文件

    -o:接制作的镜像文件

    -J:产生较兼容Windows的文件名结构

    -r:可记录更多的信息,比如UID/GID,权限

    -v:显示创建过程

    -V vol:建立Volume,有点像Windows在文件资源管理器内看到的CD卷标

    -m file:排除文件不备份到镜像文件中

    -graft-point:graft有转嫁或移植的意思

一般数据光盘镜像文件

一般情况,所有被加到镜像文件中的文件都会被放置在根目录,加上-graft-point后可以指定目录,如下:

[root@host-192-168-177-76 tmp]# mkisofs -r -V 'linux_file' -o /tmp/system.img -m /root/etc -graft-point /root=/root /home=/home /etc=/etc
I: -input-charset not specified, using utf-8 (detected in locale settings)
Using SYSTE000.;1 for  etc/system-release (system-release-cpe)
 79.49% done, estimate finish Tue Jul 26 16:06:59 2022
 90.87% done, estimate finish Tue Jul 26 16:06:59 2022
Total translation table size: 0
Total rockridge attributes bytes: 250821
Total directory bytes: 970752
Path table size(bytes): 5832
Max brk space used 22f000
44036 extents written (86 MB)

[root@host-192-168-177-76 tmp]# ll -h /tmp/system.img
-rw-r--r--. 1 root root 87M Jul 26 16:06 /tmp/system.img
[root@host-192-168-177-76 tmp]# mount -o loop /tmp/system.img /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
[root@host-192-168-177-76 tmp]# ll /mnt
total 42
dr-xr-xr-x. 127 root root 36864 Jul 26 14:59 etc
dr-xr-xr-x.  10 root root  2048 Jul 25 17:57 home
dr-xr-xr-x.   5 root root  4096 Jul 26 14:40 root
[root@host-192-168-177-76 tmp]# umnout /mnt

制作/修改可启动光盘镜像文件

P279

8.5.2 cdrecord:光盘刻录工具

P280

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

8.6.1 dd

    if      :input file,也可以是设备

    of     :output file,也可以是设备

    bs     :设置一个block的大小,默认521B

    count:多少个bs的意思

示范一:将/etc/passwd备份到/tmp/passwd.backo
[root@host-192-168-177-76 tecs]# dd if=/etc/passwd of=/tmp/passwd.backo
3+1 records in
3+1 records out
1971 bytes (2.0 kB, 1.9 KiB) copied, 0.000113069 s, 17.4 MB/s
[root@host-192-168-177-76 tecs]# ll /etc/passwd /tmp/passwd.backo
-rw-r--r--. 1 root root 1971 Jul 26 13:48 /etc/passwd
-rw-r--r--. 1 root root 1971 Jul 26 16:30 /tmp/passwd.backo
# 3+1表示有3个完整的512B的block,和一个不满512的block

示范二:将光盘/U盘的内容,备份成镜像文件
[root@host-192-168-177-76 tecs]# dd if=/dev/sdx2 of=/tmp/system.iso
204800+0 records in
204800+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.522017 s, 201 MB/s

示范三:将镜像文件刻录到U盘,可用于制作Linux启动盘来进行安装Linux
[root@host-192-168-177-76 tecs]# dd if=/tmp/system.iso of=/dev/sda
#if是镜像,of是磁盘所在的设备名

示范四:将/boot整个文件系统用dd备份下来
[root@host-192-168-177-76 tecs]# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdx3       976M  268M  641M  30% /boot
[root@host-192-168-177-76 tecs]# dd if=/dev/sdx3 of=/tmp/sdx3.img
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.43829 s, 197 MB/s
[root@host-192-168-177-76 tecs]# ll -h /tmp/sdx3.img
-rw-r--r--. 1 root root 1.0G Jul 26 16:43 /tmp/sdx3.img
# 将整个/dev/sdx3保存下来,文件容量和整块磁盘的最大量一样大,而不是使用量

8.6.2 cpio

cpio可以备份任何东西,包括设备文件,但是不会主动找文件备份,所以必须利用find等命令,把要备份的文件告知cpio

备份:cpio -ovcB > [file|device] 

还原:cpio -ivcdu < [file|device] 

查看:cpio -ivct < [file|device] 

    -o:备份输出的文件或设备

    -B:让默认的blocks增加到5120字节

    -i:将数据从文件或设备中复制到系统中

    -d:自动建立目录,cpio备份的内容不一定在同一层目录,因此需要在还原时可以建立新目录

    -u:自动的将较新的文件覆盖旧文件

    -t:配合-i,可用在“查看”cpio建立的文件或设备

    -v:显示过程

    -c:一种较新的portable format方式存储

示范:找出/boot下面所有文件,并备份到/tmp/boot.pio
[root@host-192-168-177-76 tecs]# cd /
#必须先到达boot所在目录,也就是/,使用相对路径
[root@host-192-168-177-76 /]# find boot -print
boot
boot/dracut
boot/config-4.18.0-193.14.2.el8_2.x86_64
...
#通过find我们可以找到boot下面的文件名,包括文件和目录,然后进行备份
[root@host-192-168-177-76 /]# find boot | cpio -ocvB > /tmp/boot.pio
boot
boot/dracut
boot/config-4.18.0-193.14.2.el8_2.x86_64
...
[root@host-192-168-177-76 /]# ll -h /tmp/boot.pio
-rw-r--r--. 1 root root 282M Jul 26 17:00 /tmp/boot.pio
[root@host-192-168-177-76 /]# file /tmp/boot.pio
/tmp/boot.pio: ASCII cpio archive (SVR4 with no CRC)

如果使用绝对路径,也就是find /boot,以后在解开的时候就一定会覆盖掉原本的/boot

下面进行解压缩

[root@host-192-168-177-76 ~]# cd ~
[root@host-192-168-177-76 ~]# cpio -idvc < /tmp/boot.pio
[root@host-192-168-177-76 ~]# ll /root/boot
# 内容与/boot的一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值