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 :可以显示出原文件/压缩文件的压缩比等信息; -
|
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 :可以显示出原文件/压缩文件的压缩比等信息; -
|
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
| [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-
[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
|
打包某目录,但不含该目录下的某些文件之作法
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
| [root@study ~]$ cd /tmp [root@study tmp]$ tar -cvf - /etc | tar -xvf -
|
在上面的例子中,我们想要将 /etc
下面的数据直接 copy
到目前所在的路径,也就是 /tmp
下面,但是又觉得使用 cp -r
有点麻烦,那么就直接以这个打包的方式来打包,其中,指令里面的 - 就是表示那个被打包的文件啦!
由于我们不想要让中间文件存在,所以就以这一个方式来进行复制的行为啦!
XFS 文件系统的备份与还原
CentOS 7 已经使用 XFS 文件系统作为默认值,所以那个好用的 xfsdump
与 xfsrestore
两个工具对 CentOS 7 来说,就是挺重要的工具软件了。
XFS 文件系统备份 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 [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 后的备份数据内容
- 找出
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
| [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
[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
[root@study ~]$ mkdir /tmp/boot2 [root@study ~]$ xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2
|
如果只想要复原某一个目录或文件的话,直接加上 -s 目录
这个选项与参数即可
复原累积备份数据
1 2
| [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
| [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
|
光盘写入工具
- 先将所需要备份的数据创建成为一个镜像文件(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 方式储存
|