Linux 系统常见的压缩指令

1
2
3
4
5
6
7
8
9
*.Z compress 程序压缩的文件;
*.zip zip 程序压缩的文件;
*.gz gzip 程序压缩的文件;
*.bz2 bzip2 程序压缩的文件;
*.xz xz 程序压缩的文件;
*.tar tar 程序打包的数据,并没有压缩过;
*.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
*.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩

gzip, zcat/zmore/zless/zgrep

gzip 可以说是应用度最广的压缩指令了!目前 gzip 可以解开 compress, zip 与 gzip 等软件所压缩的文件。 至于 gzip 所创建的压缩文件为 *.gz 的文件名。

1
2
3
4
5
6
7
8
[dmtsai@study ~]$ gzip [-cdtv#] 文件名
[dmtsai@study ~]$ zcat 文件名.gz
选项与参数:
-c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6

cat/more/less 可以使用不同的方式来读取纯文本文件,那个 zcat/zmore/zless 则可以对应于 cat/more/less 的方式来读取纯文本文件被压缩后的压缩文件!

如果你还想要从文字压缩文件当中找数据的话,可以通过 zgrep 来搜寻关键字喔!而不需要将压缩文件解开才以 grep 进行! 这对查询备份中的文本文件数据相当有用!

bzip2, bzcat/bzmore/bzless/bzgrep

1
2
3
4
5
6
7
8
9
[dmtsai@study ~]$ bzip2 [-cdkzv#] 文件名
[dmtsai@study ~]$ bzcat 文件名.bz2
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留原始文件,而不会删除原始的文件喔!
-z :压缩的参数 (默认值,可以不加)
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!

xz, xzcat/xzmore/xzless/xzgrep

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

通过 time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz] 去执行运算结果,结果发现这三个指令的执行时间依序是: 0.019s, 0.042s, 0.261s, 看最后一个数字!差了 10 倍的时间耶!所以,如果你并不觉得时间是你的成本考虑,那么使用 xz 会比较好!如果时间是你的重要成本,那么 gzip 恐怕是比较适合的压缩软件喔!

打包指令: tar

gzip, bzip2, xz 也能够针对目录来进行压缩,不过, 这两个指令对目录的压缩指的是“将目录内的所有文件 “分别” 进行压缩”的动作!而不像在 Windows 的系统,可以使用类似 WinRAR 这一类的压缩软件来将好多数据“包成一个文件”的样式。

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

tar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[dmtsai@study ~]$ tar [-z|-j|-J] [cv] [-f 待创建的新文件名] filename... <==打包与压缩
[dmtsai@study ~]$ tar [-z|-j|-J] [tv] [-f 既有的 tar文件名] <==察看文件名
[dmtsai@study ~]$ 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 欲解压缩的目录

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

1
2
3
4
5
[root@study ~]$ tar -jxv -f /root/etc.tar.bz2 -C /tmp
[root@study ~]$ ll /tmp
....(前面省略)....
drwxr-xr-x. 131 root root 8192 Jun 26 22:14 etc
....(后面省略)....

仅解开单一文件的方法

使用 -jtv 找到你要的文件名,然后将该文件名解开即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1\. 先找到我们要的文件名,假设解开 shadow 文件好了:
[root@study ~]$ tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
---------- root/root 721 2015-06-17 00:20 etc/gshadow
---------- root/root 1183 2015-06-17 00:20 etc/shadow-
---------- root/root 1210 2015-06-17 00:20 etc/shadow <==这是我们要的!
---------- root/root 707 2015-06-17 00:20 etc/gshadow-
# 先搜寻重要的文件名!其中那个 grep 是“撷取”关键字的功能!我们会在第三篇说明!
# 这里您先有个概念即可!那个管线 | 配合 grep 可以撷取关键字的意思!
# 2\. 将该文件解开!语法与实际作法如下:
[root@study ~]$ tar -jxv -f 打包档.tar.bz2 待解开文件名
[root@study ~]$ tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@study ~]$ ll etc
total 4
----------. 1 root root 1210 Jun 17 00:20 shadow
# 很有趣!此时只会解开一个文件而已!不过,重点是那个文件名!你要找到正确的文件名。
# 在本例中,你不能写成 /etc/shadow !因为记录在 etc.tar.bz2 内的并没有 / 之故!

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

1
2
[root@study ~]$ tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
> --exclude=/root/system.tar.bz2 /etc /root

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

某些情况下你会想要备份新的文件而已,并不想要备份旧文件!此时 --newer-mtime 这个选项就粉重要啦! 其实有两个选项啦,一个是 --newer 另一个就是 --newer-mtime

1. `--newer` 表示后续的日期包含 `mtime` 与 `ctime`
2. `--newer-mtime` 则仅是 `mtime` 而已!

基本名称: tarfile, tarball ?

如果仅是打包而已,就是 tar -cv -f file.tar而已,这个文件我们称呼为 tarfile

进行压缩的支持,例如 tar -jcv -f file.tar.bz2 时,我们就称呼为 tarball

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

在 tar 的使用中,有一种方式最特殊,那就是通过标准输入输出的数据流重导向(standard input/standard output), 以及管线命令 (pipe) 的方式,将待处理的文件一边打包一边解压缩到目标目录去。

1
2
3
4
5
6
7
# 1\. 将 /etc 整个目录一边打包一边在 /tmp 解开
[root@study ~]$ cd /tmp
[root@study tmp]$ tar -cvf - /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
# 要注意的地方在于输出文件变成 - 而输入文件也变成 - ,又有一个 | 存在~
# 这分别代表 standard output, standard input 与管线命令啦!
# 简单的想法中,你可以将 - 想成是在内存中的一个设备(缓冲区)。

在上面的例子中,我们想要将 /etc 下面的数据直接 copy 到目前所在的路径,也就是 /tmp 下面,但是又觉得使用 cp -r 有点麻烦,那么就直接以这个打包的方式来打包,其中,指令里面的 - 就是表示那个被打包的文件啦!

由于我们不想要让中间文件存在,所以就以这一个方式来进行复制的行为啦!

XFS 文件系统的备份与还原

CentOS 7 已经使用 XFS 文件系统作为默认值,所以那个好用的 xfsdump
xfsrestore 两个工具对 CentOS 7 来说,就是挺重要的工具软件了。

XFS 文件系统备份 xfsdump

xfsdump可以进行:

  • 全量备份
  • 增量备份

xfsdump 运行时,完整备份与累积备份示意图

如上图所示,上方的“实时文件系统”是一直随着时间而变化的数据,例如在 /home 里面的文件数据会一直变化一样。 而下面的方块则是 xfsdump 备份起来的数据,第一次备份一定是完整备份,完整备份在 xfsdump 当中被定义为 level 0 喔!等到第二次备份时,/home 文件系统内的数据已经与 level 0 不一样了,而 level 1 仅只是比较目前的文件系统与 level 0 之间的差异后,备份有变化过的文件而已。至于 level 2 则是与 level 1 进行比较啦!这样了解呼?至于各个 level 的纪录档则放置于 /var/lib/xfsdump/inventory 中。

使用 xfsdump 时,请注意下面的限制喔:

  • xfsdump 不支持没有挂载的文件系统备份!所以只能备份已挂载的!
  • xfsdump 必须使用 root 的权限才能操作 (涉及文件系统的关系)
  • xfsdump 只能备份 XFS 文件系统啊!
  • xfsdump 备份下来的数据 (文件或储存媒体) 只能让 xfsrestore 解析
  • xfsdump 是通过文件系统的 UUID 来分辨各个备份文件的,因此不能备份两个具有相同UUID 的文件系统喔!
1
2
3
4
5
6
7
8
[root@study ~]$ xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据
[root@study ~]$ xfsdump -I
选项与参数:
-L :xfsdump 会纪录每次备份的 session 标头,这里可以填写针对此文件系统的简易说明
-M :xfsdump 可以纪录储存媒体的标头,这里可以填写此媒体的简易说明
-l :是 L 的小写,就是指定等级~有 0~9 共 10 个等级喔! (默认为 0,即完整备份)
-f :有点类似 tar 啦!后面接产生的文件,亦可接例如 /dev/st0 设备文件名或其他一般文件文件名等
-I :从 /var/lib/xfsdump/inventory 列出目前备份的信息状态

用 xfsdump 进行累积备份 (Incremental backups)

1
[root@study ~]$ xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot

XFS 文件系统还原 xfsrestore

1
2
3
4
5
6
7
8
9
10
11
12
[root@study ~]$ xfsrestore -I <==用来察看备份文件数据
[root@study ~]$ xfsrestore [-f 备份文件] [-L S_label] [-s] 待复原目录 <==单一文件全系统复原
[root@study ~]$ xfsrestore [-f 备份文件] -r 待复原目录 <==通过累积备份文件来复原系统
[root@study ~]$ xfsrestore [-f 备份文件] -i 待复原目录 <==进入互动模式
选项与参数:
-I :跟 xfsdump 相同的输出!可查询备份数据,包括 Label 名称与备份时间等
-f :后面接的就是备份文件!企业界很有可能会接 /dev/st0 等磁带机!我们这里接文件名!
-L :就是 Session 的 Label name 喔!可用 -I 查询到的数据,在这个选项后输入!
-s :需要接某特定目录,亦即仅复原某一个文件或目录之意!
-r :如果是用文件来储存备份数据,那这个就不需要使用。如果是一个磁带内有多个文件,
需要这东西来达成累积复原
-i :进入互动模式,进阶管理员使用的!一般我们不太需要操作它!

用 xfsrestore 观察 xfsdump 后的备份数据内容

  1. 找出 xfsdump 的内容就使用 xfsrestore -I 来查阅即可!不需要加任何参数!

简单复原 level 0 的文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1\. 直接将数据给它覆盖回去即可!
[root@study ~]$ xfsrestore -f /srv/boot.dump -L boot_all /boot
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.4 (dump format 3.0) - type ^C for status and control
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: examining media file 0
xfsrestore: reading directories
xfsrestore: 8 directories and 327 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 1 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore: stream 0 /srv/boot.dump OK (success) # 是否是正确的文件啊?
xfsrestore: Restore Status: SUCCESS

# 2\. 将备份数据在 /tmp/boot 下面解开!
[root@study ~]$ mkdir /tmp/boot
[root@study ~]$ xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot
[root@study ~]$ du -sm /boot /tmp/boot
109 /boot
99 /tmp/boot
# 咦!两者怎么大小不一致呢?没关系!我们来检查看看!
[root@study ~]$ diff -r /boot /tmp/boot
Only in /boot: testing.img
# 看吧!原来是 /boot 我们有增加过一个文件啦!

# 3\. 仅复原备份文件内的 grub2 到 /tmp/boot2/ 里头去!
[root@study ~]$ mkdir /tmp/boot2
[root@study ~]$ xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2

如果只想要复原某一个目录或文件的话,直接加上 -s 目录 这个选项与参数即可

复原累积备份数据

1
2
# 继续复原 level 1 到 /tmp/boot 当中!
[root@study ~]$ xfsrestore -f /srv/boot.dump1 /tmp/boot

仅还原部分文件的 xfsrestore 互动模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 1\. 先进入备份文件内,准备找出需要备份的文件名数据,同时预计还原到 /tmp/boot3 当中!
[root@study ~]$ mkdir /tmp/boot3
[root@study ~]$ xfsrestore -f /srv/boot.dump -i /tmp/boot3
========================== subtree selection dialog ==========================
the following commands are available:
pwd
ls [ <path> ]
cd [ <path> ]
add [ <path> ] # 可以加入复原文件列表中
delete [ <path> ] # 从复原列表拿掉文件名!并非删除喔!
extract # 开始复原动作!
quit
help
> ls
455517 initramfs-3.10.0-229.el7.x86_64kdump.img
138 initramfs-3.10.0-229.el7.x86_64.img
141 initrd-plymouth.img
140 vmlinuz-0-rescue-309eb890d09f440681f596543d95ec7a
139 initramfs-0-rescue-309eb890d09f440681f596543d95ec7a.img
137 vmlinuz-3.10.0-229.el7.x86_64
136 symvers-3.10.0-229.el7.x86_64.gz
135 config-3.10.0-229.el7.x86_64
134 System.map-3.10.0-229.el7.x86_64
133 .vmlinuz-3.10.0-229.el7.x86_64.hmac
1048704 grub2/
131 grub/
> add grub
> add grub2
> add config-3.10.0-229.el7.x86_64
> extract
[root@study ~]$ ls -l /tmp/boot3
-rw-r--r--. 1 root root 123838 Mar 6 19:45 config-3.10.0-229.el7.x86_64
drwxr-xr-x. 2 root root 26 May 4 17:52 grub
drwxr-xr-x. 6 root root 104 Jun 25 00:02 grub2
# 就只会有 3 个文件名被复原,当然,如果文件名是目录,那下面的子文件当然也会被还原回来的!

光盘写入工具

  • 先将所需要备份的数据创建成为一个镜像文件(iso),利用 mkisofs 指令来处理;
  • 将该镜像文件烧录至光盘或 DVD 当中,利用 cdrecord 指令来处理。

mkisofs:创建镜像文件

制作一般数据光盘镜像文件

1
2
3
4
5
6
7
8
9
10
[root@study ~]$ mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份文件... \
> -graft-point isodir=systemdir ...
选项与参数:
-o :后面接你想要产生的那个镜像文件文件名。
-J :产生较相容于 windows 机器的文件名结构,可增加文件名长度到 64 个 unicode 字符
-r :通过 Rock Ridge 产生支持 Unix/Linux 的文件数据,可记录较多的信息(如 UID/GID等) ;
-v :显示创建 ISO文件的过程
-V vol :创建 Volume,有点像 Windows 在文件资源管理器内看到的 CD title 的东西
-m file :-m 为排除文件 (exclude) 的意思,后面的文件不备份到镜像文件中,也能使用 * 万用字符喔
-graft-point:graft有转嫁或移植的意思,相关数据在下面文章内说明。

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

dd

dd 可备份完整的 partition 或 disk ,因为 dd 可读取磁盘的 sector 表面数据

1
2
3
4
5
6
[root@study ~]$ 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 的意思。

你想要创建两颗一模一样的磁盘时, 只要下达类似: dd if=/dev/sda of=/dev/sdb ,就能够让两颗磁盘一模一样,甚至 /dev/sdb 不需要分区与格式化, 因为该指令可以将 /dev/sda 内的所有数据,包括 MBR 与 partition table 也复制到 /dev/sdb 说!

cpio

cpio 为相当优秀的备份指令,不过必须要搭配类似 find 指令来读入欲备份的文件名数据,方可进行备份动作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@study ~]$ cpio -ovcB > [file|device] <==备份
[root@study ~]$ cpio -ivcdu < [file|device] <==还原
[root@study ~]$ 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 方式储存