linux常见的压缩指令

2020-04-23 16:37:46 浏览数 (1)

4.1 linux常见的压缩指令

  • 在 Linux 的环境中,压缩文件案的扩展名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2, *.xz』.

后缀

压缩软件

*.Z

compress 程序压缩的文件;

*.zip

zip 程序压缩的文件;

*.gz

gzip 程序压缩的文件;

*.bz2

bzip2 程序压缩的文件;

*.xz

xz 程序压缩的文件

*.tar

tar 程序打包的数据,并没有压缩过;

*.tar.gz

tar 程序打包的文件,其中并且经过 gzip 的压缩

*.tar.bz2

tar 程序打包的文件,其中并且经过 bzip2 的压缩

*.tar.xz

tar 程序打包的文件,其中并且经过 xz 的压缩

4.2 gzip,zcat/zmore/zless/zgrep

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

范例一:找出 /etc 底下 (不含子目录) 容量最大的文件,并将它复制到 /tmp ,然后以 gzip 压缩
#寻找容量最大的文件
[root@localhost tmp]# ls -ldSr /etc/*
#拷贝到/tmp
[root@localhost tmp]# cp /etc/services .
#压缩该文件
[root@localhost tmp]# gzip -v services 
services:     79.7% -- replaced with services.gz
#压缩前和压缩后对比
[root@localhost tmp]# ll -h /etc/services /tmp/services.gz 
-rw-r--r--. 1 root root 655K 6月   7 2013 /etc/services
-rw-r--r--. 1 root root 133K 5月  28 23:43 /tmp/services.gz
  • 当你使用gzip进行压缩时,在预设的状态下文件会被压缩成为.gz的档名,源文件就不存在了.但是使用gzip压缩的文件可以在win中使用winrar,7zip等软件解压
代码语言:javascript复制
#由于service是文本文件,可以用zcat,zmore,zless去读取.读取的就是service.gz解压后的源文件
[root@study tmp]# zcat services.gz

4.2.1 gzip文件的解压缩

代码语言:javascript复制
#将service.gz解压缩,gzip -d会将原本的.gz删除恢复service文件
[root@study tmp]# gzip -d services.gz 

4.2.2 gzip最佳压缩比

代码语言:javascript复制
[root@study tmp]# gzip -9 -c services > services.gz 
[root@study tmp]# ll -h /etc/services services.gz 
-rw-r--r--. 1 root root 655K 6月   7 2013 /etc/services
-rw-r--r--. 1 root root 133K 8月   9 10:20 services.gz
  • 其实gzip默认使用的6压缩比率就已经很高了,-c可以将原本要转成压缩文件的内容变成文字类型从屏幕输出,>可以将原本由屏幕输出的数据转成输出到文件,只是档名需要自己写.

4.2.3 zgrep的使用

代码语言:javascript复制
[root@study tmp]# zgrep -n 'http' services.gz 
  • cat/more/less 可以使用不同的方式来读取纯文本档,那个 zcat/zmore/zless 则可以对应于 cat/more/less 的方式来读取纯文本档被压缩后的压缩文件!

4.3 bzip2,bcat/bmore/bless/bgrep

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

#将service以bzip2压缩
[root@study tmp]# bzip2 -v services
[root@study tmp]# ll
-rw-r--r--. 1 root root 122K 8月   9 10:07 services.bz2
-rw-r--r--. 1 root root 133K 8月   9 10:20 services.gz
  • bzcat,bzip -d等级压缩同gzip用法相同.

4.4 xz, xzcat/xzmore/xzless/xzgrep

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

#用xz压缩service文件
[xiaoqi@study tmp]$ xz -v services
services (1/1)
  100 %        97.3 KiB / 654.6 KiB = 0.149 
  
#压缩效果 
[xiaoqi@study tmp]$ ll -h servic*
-rw-r--r--. 1 root   root   122K 8月   9 10:07 services.bz2
-rw-r--r--. 1 root   root   133K 8月   9 10:20 services.gz
-rw-r--r--. 1 xiaoqi xiaoqi  98K 8月   9 19:18 services.xz
  
# 列出文件的压缩信息
[xiaoqi@study tmp]$ xz -l services.xz 
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1     97.3 KiB    654.6 KiB  0.149  CRC64   services.xz

#读出压缩文件的内容
[xiaoqi@study tmp]$ xzcat services.xz 

#解压缩
[xiaoqi@study tmp]$  xz -d services.xz 
#保留源文件压缩
[xiaoqi@study tmp]$ xz -k services

xzcat,xz -d,xzmore,xzgrep,xzless等级压缩同gzip用法相同.

4.5 tar文件打包

  • tar的参数非常多,常用的选项即可满足大多需求
代码语言:javascript复制
[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 打包!

4.5.1 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,因为 bzip2会产生 .bz2 的扩展名之故! 所以如果是加上了 -zgzip 的支持,那档名最好取为 *.tar.gz.

4.5.2 tar的使用例子:

代码语言:javascript复制
#zip方式打包
[root@study tmp]# time tar -zpcv -f /root/etc.tar.gz /etc 
tar: 从成员名中删除开头的“/”
......
/etc/scl/prefixes/
/etc/vconsole.conf
/etc/locale.conf
/etc/hostname
/etc/.updated
/etc/aliases.db

real    0m1.084s        #用了time会显示程序运行的时间.
user    0m1.030s
sys     0m0.051s

#bzip2方式打包
[root@study tmp]# time tar -jpc -f /root/etc.tar.bz2 /etc 
tar: 从成员名中删除开头的“/”

real    0m2.661s
user    0m2.588s
sys     0m0.042s

#xz方式打包
[root@study tmp]# time tar -Jpc -f /root/etc.tar.xz /etc  
tar: 从成员名中删除开头的“/”

real    0m12.029s
user    0m11.937s
sys     0m0.075s

#压缩方式打包效果对比
[root@study tmp]# ll -h /root/etc.*
-rw-r--r--. 1 root root 6.6M 8月  10 00:13 /root/etc.tar.bz2
-rw-r--r--. 1 root root 7.7M 8月  10 00:10 /root/etc.tar.gz
-rw-r--r--. 1 root root 5.4M 8月  10 00:14 /root/etc.tar.xz
[root@study tmp]# du -sm /etc/
29      /etc/        #实际etc目录有29M
  • -v 这个选项,因此正在作用中的文件名就会显示在屏幕上。
  • -p 的选项,重点在于『保留原本文件的权限与属性』之意.

4.5.3 查看tar文件的数据内容

代码语言:javascript复制
#查看bzip2压缩打包的文件内容
[root@study tmp]# tar -jtv -f /root/etc.tar.bz2
......
lrwxrwxrwx root/root         0 2019-08-09 03:49 etc/scl/conf -> prefixes
drwxr-xr-x root/root         0 2015-03-26 21:22 etc/scl/prefixes/
-rw-r--r-- root/root     12288 2019-08-09 04:01 etc/aliases.db
  • 如果加上 -v 这个选项时,详细的文件权限/属性都会被列出来.
  • 如果只是想要知道文件名而已,那么就将 -v 拿掉即可。

从上面的数据我们可以发现一件很有趣的事情,那就是每个文件名都没了根目录. 因为,在示例中有一行tar: Removing leading '/' from member names(移除了档 名开头的 '/'说明了移除的情况.

  • 为什么要移除根目录呢?

主要是为了安全!我们使用tar备份的数据可能会需要解压缩回来使 用,在tar所记录的文件名 (就是我们刚刚使用tar -jtvf所察看到的文件名) 那就是解压缩后的实际档名。 如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的档名就会变成/tmp/etc/xxx。 但.'如果没有拿掉根目录,解压缩后的档名就会是绝对路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!'.如此一来,你的原本的/etc/底下的数据,就会被备份数据所覆盖过去.

  • 如何备份文件的根目录?

如果需要备份根目录到tar的文件中,那可以使用-P(大写) 这个选项.

代码语言:javascript复制
#bzip2方式备份文件的根目录
[root@study tmp]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc

#查看打包的文件
[root@study tmp]# tar -jtf /root/etc.and.root.tar.bz2
....
/etc/scl/prefixes/
/etc/vconsole.conf
/etc/locale.conf
/etc/hostname
/etc/.updated
/etc/aliases.db

4.6 tar解压缩

代码语言:javascript复制
#解包本目录
[root@study ~]# tar -jxv -f etc.tar.bz2

#解包到特定目录
[root@study ~]# tar -jxv -f etc.tar.bz2 -C /tmp/

#解开单一文件
## 搜寻解包的文件名
[root@study ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
---------- root/root      1263 2019-08-09 03:53 etc/shadow #解包这个文件
---------- root/root      1268 2019-08-09 03:53 etc/shadow-

# 解包单一文件语法
[root@study ~]# tar -jxv -f 文件名.tar.bz2 待解开档名

#实际用法
[root@study ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow

[root@study ~]# ll -h etc
总用量 4.0K
----------. 1 root root 1.3K 8月   9 03:53 shadow
  • 需要注意的是,重点在文件名.解包单一文件的话需要找到正确的文件名.
  • 打包时把更目录/拿掉了,所以解包的时候是解包在本根目录下.

4.6.1 打包单一目录文件

  • 假设我们想要打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件.

  • 此时我们可以透过 --exclude 参数.将不需要的文件移除在打包的目录之内,
代码语言:javascript复制
#打包方法
[root@study ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* 
> --exclude=/root/system.tar.bz2 /etc/ /root/

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

  • 某些情况下你会想要备份新的文件而已,并不想要备份旧文件!
  • 此时 --newer-mtime 这个选项就发挥实际的用处了.

其实有两个选项,一个是--newer.另一个是--newer-mtime. 两个参数的区别:--newer 时,表示后续的日期包含mtimectime.而--newer-mtime则仅是mtime而已

代码语言:javascript复制
# 先由 find 找出比 /etc/passwd 还要新的文件
[root@study ~]# find /etc/ -newer /etc/passwd
.......
/etc/udev
/etc/udev/hwdb.bin
/etc/chrony.keys
/etc/tuned/active_profile
/etc/aliases.db

# 此时会显示出比 /etc/passwd 这个文件的 mtime 还要新的文件,

[root@study ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2273 8月   9 03:53 /etc/passwd

# 使用tar来进行打包,日期为 2019-05-09 03:53
[root@study ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 
> --newer-mtime="2019/08/09" /etc/*
......
/etc/yum.repos.d/
tar: /etc/yum.repos.d/CentOS-Base.repo: 文件未改变;未输出
tar: /etc/yum.repos.d/CentOS-fasttrack.repo: 文件未改变;未输出

# 通过`grep`查看不是`/`结尾的文件名
[root@study ~]# tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v "/$"
  • 另外值得一提的是tar打包出来的文件有没有进行压缩所得到文件称呼不同.

  • 如果仅是打包而已,就是tar -cv -f file.tar 而已,这个文件我们称呼为tarfile.
  • 如果还有进行压缩的支持,例如tar -jcv -f file.tar.bz2时,我们就称呼为tarball.

此外,tar 除了可以将资料打包成为文件之外,还能够将文件打包到某些特别的装置去,举例来说,磁带机 (tape)就是一个常见的例子。磁带机由于是一次性读取/写入的装置,因此我们不能够使用类似 cp 等指令来复制的! 那如果想要将 /home, /root, /etc 备份到磁带机 (/dev/st0) 时,就可以使用:tar -cv -f /dev/st0 /home /root /etc,磁带机用在备份(尤其是企业应用)是很常见的工作!

4.6.3 系统备份例子

  • 系统上有非常多的重要目录需要进行备份,而且其实不建议将备份数据放置到/root目录下! 假设目前你已经知道重要的目录有底下这几个:

  • /etc/ (配置文件)
  • /home/ (用户的家目录)
  • /var/spool/mail/ (系统中,所有账号的邮件信箱)
  • /var/spool/cron/ (所有账号的工作排成配置文件)
  • /root (系统管理员的家目录)
  • 此外,每次备份的档名都希望不相同,例如使用:backup-system-19-08-10.tar.bz2 之类的档名来处理。
代码语言:javascript复制
# 配置备份数据的目录与权限
[root@study ~]# mkdir backups
[root@study ~]# chmod 700 backups/
[root@study ~]# ll -d backups/
drwx------. 2 root root 6 8月  10 23:35 backups/

# 备份规则
[root@study ~]# tar -jcv -f /root/backups/backup-system-2019-081001.tar.bz2     
> --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* 
> /etc/ /home/ /var/spool/mail/ /var/spool/cron/ /root/

[root@study ~]# ll -h /root/backups/
总用量 13M
-rw-r--r--. 1 root root 13M 8月  10 23:41 backup-system-2019-081001.tar.bz2

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

  • 其实xfsdump的功能颇强!他除了可以进行文件系统的完整备份 (full backup) 之外,还可以进行累 积备份 (Incremental backup) .

使用xfsdump时,注意底下的限制

  • xfsdump 不支援没有挂载的文件系统备份!所以只能备份已挂载的!
  • xfsdump 必须使用 root 的权限才能操作 (涉及文件系统的关系)
  • xfsdump 只能备份 XFS 文件系统啊!
  • xfsdump 备份下来的数据 (文件或储存媒体) 只能让 xfsrestore 解析
  • xfsdump 是透过文件系统的 UUID 来分辨各个备份档的,因此不能备份两个具有相同 UUID 的文件系统

喔!

4.7.1 xfsdump备份文件

xfsdump 的选项虽然非常的繁复,不过如果只是想要简单的操作时,您只要记得底下的几个选项就够用了.

代码语言:javascript复制
[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 列出目前备份的信息状态
代码语言:javascript复制
# 先确定/boot 是不是独立的文件系统
[root@study ~]# df -h /boot/
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda2      1014M  164M  851M   17% /boot    #boot是挂在点    

# 将完整的文件名记录成为 /svr/boot.dump
[root@study ~]# xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control
xfsdump: level 0 dump of study.centos.xiaoqi:/boot            # 开始备份本机/boot 系统
xfsdump: dump date: Sat Aug 10 23:58:21 2019                # 备份的时间
xfsdump: session id: 3e97555b-1d48-40e1-bf40-918b5e385826    # 这次 dump 的 ID
xfsdump: session label: "boot_all"                            # 简单给予一个名字记忆
xfsdump: ino map phase 1: constructing initial dump list    # 开始备份程序
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 138045952 bytes
xfsdump: /var/lib/xfsdump/inventory created
xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 137729128 bytes
xfsdump: dump size (non-dir files) : 137493968 bytes
xfsdump: dump complete: 1 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /srv/boot.dump OK (success)
xfsdump: Dump Status: SUCCESS
# 在指令的下达方面,你也可以不加 -L 及 -M 的,只是那就会进入互动模式,要求你 Enter!

[root@study ~]# ll -h /srv/boot.dump 
-rw-r--r--. 1 root root 132M 8月  10 23:58 /srv/boot.dump


# 使用了 xfsdump 之后才会有上述 /var/lib/xfsdump/inventory 内的文件产生喔!
[root@study ~]# ll -h /var/lib/xfsdump/inventory/
总用量 16K
-rw-r--r--. 1 root root  312 8月  10 23:58 9cf2163d-1f96-4282-9c09-942fa7296572.InvIndex
-rw-r--r--. 1 root root 5.0K 8月  10 23:58 acfc68f3-ada9-4a04-8afe-a05ea8933749.StObj
-rw-r--r--. 1 root root  576 8月  10 23:58 fstab

这样很简单的就建立起来/srv/boot.dump文件,该文件将整个/boot/文件系统都备份下来了! 并且 将备份的相关信息 (文件系统/时间/session ID 等等) 写入/var/lib/xfsdump/inventory中,准备让下次 备份时可以作为一个参考依据.

4.7.2 xfsdump进行积累备份

  • 下面的积累备份需要有首次备份.
代码语言:javascript复制
# 查看有没有任何文件进行xfsdump过资料
[root@study ~]# xfsdump -I
file system 0:
        fs id:          9cf2163d-1f96-4282-9c09-942fa7296572
        session 0:
                mount point:    study.centos.xiaoqi:/boot
                device:         study.centos.xiaoqi:/dev/sda2
                time:           Sat Aug 10 23:58:21 2019
                session label:  "boot_all"
                session id:     3e97555b-1d48-40e1-bf40-918b5e385826
                level:          0
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot.dump
                        start:          ino 132 offset 0
                        end:            ino 2138243 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     137729128
                                mfile start:    ino 132 offset 0
                                mfile end:      ino 2138243 offset 0
                                media label:    "boot_all"
                                media id:       6403c9cc-9b77-4e75-9996-21cf1fde600d
xfsdump: Dump Status: SUCCESS
# 我们可以看到目前仅有一个 session 0 的备份资料而已!而且是 level 0 !


# 1.建立一个10M的文件到/boot目录进行试验
[root@study ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
记录了10 0 的读入
记录了10 0 的写出
10485760字节(10 MB)已复制,0.0108943 秒,962 MB/秒

# 2.开始建立差异备份文档.此时需要使用level 1
[root@study ~]# xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot

# 3.查看差异备份文件的大小
[root@study ~]# ll -h /srv/boot.*
-rw-r--r--. 1 root root 132M 8月  10 23:58 /srv/boot.dump
-rw-r--r--. 1 root root  11M 8月  11 00:10 /srv/boot.dump1  #这是差异备份只是备份了刚刚建立的文件的容量

# 4.查看是否有level 1是否有备份的时间点
[root@study ~]# xfsdump -I
......
        session 1:
                mount point:    study.centos.xiaoqi:/boot
                device:         study.centos.xiaoqi:/dev/sda2
                time:           Sun Aug 11 00:10:41 2019
                session label:  "boot_2"
                session id:     f7899091-2d18-4045-a7c7-dbb6abe5fc28
                level:          1
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot.dump1
                        start:          ino 93566 offset 0
                        end:            ino 93567 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     10510952
                                mfile start:    ino 93566 offset 0
                                mfile end:      ino 93567 offset 0
                                media label:    "boot_2"
                                media id:       dd91cc4d-694e-4174-98fe-6877c524a355
xfsdump: Dump Status: SUCCESS

4.8 XFS文件系统的还原

  • 备份文件就是在急用时可以回复系统的重要数据.所以就要熟悉如何复原数据.
  • xfsdump的复原是使用xfsrestore这个指令,改指令参数也特别多.
代码语言:javascript复制
[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 :进入互动模式,进阶管理员使用的!一般我们不太需要操作它!

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

代码语言:javascript复制
[root@study ~]# xfsrestore -I
file system 0:
        fs id:          9cf2163d-1f96-4282-9c09-942fa7296572
        session 0:
                mount point:    study.centos.xiaoqi:/boot
                device:         study.centos.xiaoqi:/dev/sda2
                time:           Sat Aug 10 23:58:21 2019
                session label:  "boot_all"
                session id:     3e97555b-1d48-40e1-bf40-918b5e385826
                level:          0
                resumed:        NO
                subtree:        NO
                streams:        1

        session 1:
                mount point:    study.centos.xiaoqi:/boot
                device:         study.centos.xiaoqi:/dev/sda2
                time:           Sun Aug 11 00:10:41 2019
                session label:  "boot_2"
                session id:     f7899091-2d18-4045-a7c7-dbb6abe5fc28
                level:          1
                resumed:        NO
                subtree:        NO
                streams:        1
  • 复原level 0的文件系统

/boot整个复原到最原始的状态只需要只要想要复原的文件以及该文件的session label name就能复原.

代码语言:javascript复制
# 1.将数据复原过去
[root@study xiaoqi]# 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 xiaoqi]# mkdir /tmp/boot
[root@study xiaoqi]# xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot/
[root@study xiaoqi]# diff -r /boot/ /tmp/boot/
只在 /boot/ 存在:testing.img  #对比两个目录文件是否一样
  • 复原单目录或单文件

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

代码语言:javascript复制
3. 仅复原备份文件的grub2到/tmp/boot2里面
[root@study xiaoqi]# xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2
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: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
[root@study xiaoqi]# ll /tmp/boot2/
总用量 0
drwx------. 6 root root 104 8月   9 03:54 grub2
  • 复原积累备份文件

如果备份数据是由level 0 -> level 1 -> level 2...去进行的, 就需要相同的流程来复原. 因此当我们复原了 level 0 之后,接下来当然就要复原 level 1 到系统内.

代码语言:javascript复制
#由于之前复原了level 0 所以现在把level 1复原到/tmp/boot中
[root@study xiaoqi]# xfsrestore -f /srv/boot.dump1 /tmp/boot
  • 互动模式还原部分文件
代码语言:javascript复制
# 1. 先进入备份文件内,准备找出需要备份的文件名数据,同时预计还原到 /tmp/boot3 中!
[root@study xiaoqi]# 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
           93565 initramfs-3.10.0-327.el7.x86_64kdump.img 
             138 initramfs-3.10.0-327.el7.x86_64.img 
             141 vmlinuz-0-rescue-bd3b89df84bd403a843d83220c2e2448 
             140 initramfs-0-rescue-bd3b89df84bd403a843d83220c2e2448.img 
             139 initrd-plymouth.img 
             137 vmlinuz-3.10.0-327.el7.x86_64 
             136 symvers-3.10.0-327.el7.x86_64.gz 
             135 config-3.10.0-327.el7.x86_64 
             134 System.map-3.10.0-327.el7.x86_64 
             133 .vmlinuz-3.10.0-327.el7.x86_64.hmac 
         1048704 grub2/
             131 grub/
             
 -> add grub
 -> add grub2
 -> add config-3.10.0-327.el7.x86_64
 -> extract
 
[root@study xiaoqi]# ll -h /tmp/boot3/
总用量 124K
-rw-r--r--. 1 root root 124K 11月 20 2015 config-3.10.0-327.el7.x86_64
drwxr-xr-x. 2 root root   26 8月   9 03:43 grub
drwx------. 6 root root  104 8月   9 03:54 grub2

-i是很有帮助的一个参数!可以从备份档里面找出你所需要的数据来复原.

4.9 dd指令的使用

代码语言:javascript复制
[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 的意思。
  • 示例1:将/etc/passwd备份到/tmp/passwd.back当中
代码语言:javascript复制
[root@study xiaoqi]# dd if=/etc/passwd of=/tmp/passwd.back
记录了4 1 的读入
记录了4 1 的写出
2273字节(2.3 kB)已复制,0.000247737 秒,9.2 MB/秒

[root@study xiaoqi]# ll -h /etc/passwd /tmp/passwd.back 
-rw-r--r--. 1 root root 2.3K 8月   9 03:53 /etc/passwd
-rw-r--r--. 1 root root 2.3K 8月  11 21:00 /tmp/passwd.back

仔细的看一下,我的 /etc/passwd 文件大小为 2.3k(2273 bytes),因为我没有设定 bs , 所以默认是 512 bytes 为一个单位,因此,上面那个 4 1 表示有 4 个完整的 512 bytes, 以及未满 512 bytes 的另一个 block 的意思!


版权属于:龙之介大人

本文链接:https://cloud.tencent.com/developer/article/1619531

本站所有原创文章采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 您可以自由的转载和修改,但请务必注明文章来源和作者署名并说明文章非原创且不可用于商业目的。

0 人点赞