龙之介大人

linux常见的压缩指令
4.1 linux常见的压缩指令在 Linux 的环境中,压缩文件案的扩展名大多是:『*.tar, *.tar.g...
扫描右侧二维码阅读全文
11
2019/08

linux常见的压缩指令

4.1 linux常见的压缩指令

  • 在 Linux 的环境中,压缩文件案的扩展名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2, *.xz』.
后缀压缩软件
*.Zcompress 程序压缩的文件;
*.zipzip 程序压缩的文件;
*.gzgzip 程序压缩的文件;
*.bz2bzip2 程序压缩的文件;
*.xzxz 程序压缩的文件
*.tartar 程序打包的数据,并没有压缩过;
*.tar.gztar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2tar 程序打包的文件,其中并且经过 bzip2 的压缩
*.tar.xztar 程序打包的文件,其中并且经过 xz 的压缩

4.2 gzip,zcat/zmore/zless/zgrep

[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等软件解压
#由于service是文本文件,可以用zcat,zmore,zless去读取.读取的就是service.gz解压后的源文件
[root@study tmp]# zcat services.gz

4.2.1 gzip文件的解压缩

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

4.2.2 gzip最佳压缩比

[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的使用

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

4.3 bzip2,bcat/bmore/bless/bgrep

[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

[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的参数非常多,常用的选项即可满足大多需求
[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的使用例子:

#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文件的数据内容

#查看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(大写) 这个选项.
#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解压缩

#解包本目录
[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 参数.将不需要的文件移除在打包的目录之内,
#打包方法
[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而已
# 先由 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 之类的档名来处理。
# 配置备份数据的目录与权限
[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 的选项虽然非常的繁复,不过如果只是想要简单的操作时,您只要记得底下的几个选项就够用了.
[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 列出目前备份的信息状态
# 先确定/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进行积累备份

  • 下面的积累备份需要有首次备份.
# 查看有没有任何文件进行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这个指令,改指令参数也特别多.
[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后的备份数据内容

[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就能复原.
# 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 目录这个选项与参数即可.
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 到系统内.
#由于之前复原了level 0 所以现在把level 1复原到/tmp/boot中
[root@study xiaoqi]# xfsrestore -f /srv/boot.dump1 /tmp/boot
  • 互动模式还原部分文件
# 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指令的使用

[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当中
[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 的意思!
最后修改:2019 年 08 月 14 日 09 : 19 PM

发表评论