8.2 Linux常见压缩命令
扩展名 | 含义 |
---|---|
*.zip | zip程序压缩的文件 |
*.gz | gzip程序压缩的文件 |
*.bz2 | bzip2程序压缩的文件 |
*.xz | xz程序压缩的文件 |
*.tar | tar程序打包的文件,并没有压缩过 |
*.tar.gz | tar程序打包的文件,并且经过gzip压缩 |
*.tar.bz2 | tar程序打包的文件,并且经过bzip2压缩 |
*.tar.xz | tar程序打包的文件,并且经过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的一致