初识Linux(五)------ 文件与文件系统的压缩,打包与备份

1. 压缩文件

  在Linux的环境中,压缩文件的扩展名大多是:“*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2, *.xz”,为什么会有这样的扩展名呢?不是说 Linux 的扩展名没有什么作用吗?

  这是因为 Linux 支持的压缩指令非常多,且不同的指令所用的压缩技术并不相同,当然彼此之间可能就无法互通压缩/解压缩文件。 所以,当你下载到某个压缩文件时,自然就需要知道该文件是由哪种压缩指令所制作出来的,好用来对照着解压缩。

  • *.Z compress 程序压缩的文件;
  • *.zip zip 程序压缩的文件;
  • *.gz gzip 程序压缩的文件;
  • *.bz2 bzip2 程序压缩的文件;
  • *.xz xz 程序压缩的文件;
  • *.tar tar 程序打包的数据,并没有压缩过;
  • *.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
  • *.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
  • *.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩

  Linux上常见的压缩指令就是 gzip, bzip2 以及最新的 xz ,至于 compress 已经不流行了。为了支持 windows 常见的 zip,其实 Linux 也早就有 zip 指令了! gzip 是由 GNU 计划所开发出来的压缩指令,该指令已经取代了 compress 。 后来 GNU 又开发出 bzip2 及 xz 这几个压缩比更好的压缩指令!不过,这些指令通常仅能针对一个文件来压缩与解压缩,如此一来, 每次压缩与解压缩都要一大堆文件,岂不烦人?此时,那个所谓的“打包软件, tar”就显的很重要。

  这个 tar 可以将很多文件“打包”成为一个文件!甚至是目录也可以。不过,单纯的 tar 功能仅是“打包”而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能。

1.1 gzip, zcat/zmore/zless/zgrep

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

[dmtsai@study ~]$ gzip [-cdtv#] 文件名
[dmtsai@study ~]$ zcat 文件名.gz
选项与参数:
-c  :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
-d  :解压缩的参数;
-t  :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v  :可以显示出原文件/压缩文件的压缩比等信息;
-#  :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
范例一:将文件services以 gzip 压缩
[dmtsai@study tmp]$ gzip
-v services services: 79.7% -- replaced with services.gz [dmtsai@study tmp]$ ll /etc/services /tmp/services* -rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services -rw-r--r--. 1 dmtsai dmtsai 136088 Jun 30 18:40 /tmp/services.gz

  当使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的文件名,原始文件就不再存在了。 这点与一般习惯使用 windows 压缩所熟悉的情况不同。

  此外,使用 gzip 压缩的文件在 Windows 系统中,可以被 WinRAR/7zip 这个软件解压缩。

范例二:由于 services 是文本文件,请将范例一的压缩文件的内容读出来!
[dmtsai@study tmp]$ zcat services.gz
# 由于 services 这个原本的文件是是文本文件,因此我们可以尝试使用 zcat/zmore/zless 去读取!
# 此时屏幕上会显示 servcies.gz 解压缩之后的原始文件内容!

范例三:将范例一的文件解压缩
[dmtsai@study tmp]$ gzip -d services.gz
# 鸟哥不要使用 gunzip 这个指令,不好背!使用 gzip -d 来进行解压缩!
# 与 gzip 相反, gzip -d 会将原本的 .gz 删除,回复到原本的 services 文件。

范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
[dmtsai@study tmp]$ gzip -9 -c services > services.gz

范例五:由范例四再次创建的 services.gz 中,找出 http 这个关键字在哪几行?
[dmtsai@study tmp]$ zgrep -n 'http' services.gz
14:#       http://www.iana.org/assignments/port-numbers
89:http            80/tcp          www www-http    # WorldWideWeb HTTP
90:http            80/udp          www www-http    # HyperText Transfer Protocol
.....(下面省略).....

  其实 gzip 的压缩已经最优化过了,所以虽然 gzip 提供 1~9 的压缩等级,不过使用默认的 6 就非常好用了。范例四中 -c 可以将原本要转成压缩文件的数据内容,将它变成文字类型从屏幕输出, 然后我们可以通过大于 (>) 这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不是屏幕,所以就能够创建出压缩文件了。只是文件名也要自己写, 当然最好还是遵循 gzip 的压缩文件名要求较佳。更多的 > 这个符号的应用,会在 bash 章节再次提及!

  cat/more/less 可以使用不同的方式来读取纯文本文件,那个 zcat/zmore/zless 则可以对应于 cat/more/less 的方式来读取纯文本文件被压缩后的压缩文件。由于 gzip 这个压缩指令主要想要用来取代 compress 的,所以不但 compress 的压缩文件可以使用 gzip 来解开,同时 zcat 这个指令可以同时读取 compress 与 gzip 的压缩文件。

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

1.2 bzip2, bzcat/bzmore/bzless/bzgrep

   若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的,至于 bzip2 的用法几乎与 gzip 相同。

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

 

范例一:将刚刚 gzip 范例留下来的 /tmp/services 以 bzip2 压缩
[dmtsai@study tmp]$ bzip2 -v services
  services:  5.409:1,  1.479 bits/Byte, 81.51% saved, 670293 in, 123932 out.
# 压缩率由 gzip 的 79% 提升到 bzip2 的 81%

1.3  xz, xzcat/xzmore/xzless/xzgrep

   虽然 bzip2 已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了 xz 这个压缩比更高的软件!这个软件的用法也跟 gzip/bzip2 几乎一模一样。

[dmtsai@study ~]$ xz [-dtlkc#] 文件名
[dmtsai@study ~]$ xcat 文件名.xz
选项与参数:
-d  :就是解压缩啊!
-t  :测试压缩文件的完整性,看有没有错误
-l  :列出压缩文件的相关信息
-k  :保留原本的文件不删除~
-c  :同样的,就是将数据由屏幕上输出的意思!
-#  :同样的,也有较佳的压缩比的意思!
范例一:将刚刚由 bzip2 所遗留下来的 /tmp/services 通过 xz 来压缩!
[dmtsai@study tmp]$ xz -v services
services (1/1100 %        97.3 KiB / 654.6 KiB = 0.149

  虽然 xz 这个压缩比真的好太多,以这个 services 文件为范例,他可以将 gzip 压缩比 (压缩后/压缩前) 的 21% 更进一步优化到 15% ,不过, xz 最大的问题是...时间花太久了!

  通过“ time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz] ”去执行运算结果,结果发现这三个指令的执行时间依序是: 0.019s, 0.042s, 0.261s。

 2. 打包指令: tar

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

  这种将多个文件或目录包成一个大文件的命令功能,我们可以称为一种“打包指令”。tar 可以将多个目录或文件打包成一个大文件,同时还支持 gzip/bzip2/xz ,将该文件进行压缩!由于 tar 的使用太广泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 文件名的解压缩。

常用的选项:

[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 欲解压缩的目录

  那个 filename.tar.bz2 是自己取的文件名,tar 并不会主动的产生创建的文件名。如果不加 [-z|-j|-J] 的话,文件名最好取为 *.tar 。如果是 -j 选项,代表有 bzip2 的支持,因此文件名最好就取为 *.tar.bz2 。

  另外,由于“ -f filename ”是紧接在一起的,过去很多文章常会写成“-jcvf filename”,这样是对的, 但由于选项的顺序理论上是可以变换的,所以很多读者会误认为“-jvfc filename”也可以~事实上这样会导致产生的文件名变成 c 。

 

使用 tar 加入 -z, -j 或 -J 的参数备份 /etc/ 目录

范例:备份一下 /etc 这个目录
[dmtsai@study ~]$ su -  # 因为备份 /etc 需要 root 的权限,否则会出现一堆错误
[root@study
~]# time tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `
/' from member names <==注意这个警告讯息 /etc/ ....(中间省略).... /etc/hostname /etc/aliases.db real 0m0.799s # 多了 time 会显示程序运行的时间!看 real 就好了!花去了 0.799s user 0m0.767s sys 0m0.046s # 由于加上 -v 这个选项,因此正在作用中的文件名就会显示在屏幕上。 # 至于 -p 的选项,重点在于“保留原本文件的权限与属性”

 

查看 tar 文件的数据内容 (可查看文件名),与备份文件名有无根目录的意义

[root@study ~]# tar -jtv -f /root/etc.tar.bz2
....(前面省略)....
-rw-r--r-- root/root       131 2015-05-25 17:48 etc/locale.conf
-rw-r--r-- root/root        19 2015-05-04 17:56 etc/hostname
-rw-r--r-- root/root     12288 2015-05-04 17:59 etc/aliases.db

  如果加上 -v 这个选项时,详细的文件权限/属性都会被列出来。如果只是想要知道文件名而已, 那么就将 -v 拿掉即可。

  从上面的数据我们可以发现一件很有趣的事情,那就是每个文件名都没了根目录了!这也是上一个范例中出现的那个警告讯息“tar: Removing leading `/' from member names(移除了文件名开头的 `/' )”所告知的情况。

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

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

范例:将文件名中的(根)目录也备份下来,并察看一下备份文件的内容文件名
[root@study ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc

[root@study ~]# tar -jtf /root/etc.and.root.tar.bz2
/etc/locale.conf
/etc/hostname
/etc/aliases.db
# 这次查阅文件名不含 -v 选项,所以仅有文件名而已!没有详细属性/权限等参数

 

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

#范例:在当前目录解开
[root@study ~]# tar -jxv -f /root/etc.tar.bz2 [root@study ~]# ll ....(前面省略).... drwxr-xr-x. 131 root root 8192 Jun 26 22:14 etc ....(后面省略)....
#范例:-C 在指定目录解开
[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. 先找到我们要的文件名,假设解开 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 是“截取”关键字的功能。

# 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 内的并没有 /

 

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

   假设我们想要打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件,此时我们可以通过 --exclude="file" 来帮忙。

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

   上面的指令是一整列的,其实可以打成:“tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root”,如果想要两行输入时,最后面加上反斜线 (\) 并立刻按下 [enter] , 就能够到第二行继续输入了。

 

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

   某些情况下你会想要备份新的文件而已,并不想要备份旧文件!此时 --newer-mtime 这个选项就很重要。其实有两个选项,一个是“ --newer ”另一个就是“ --newer-mtime ”。当使用 --newer 时,表示后续的日期包含“ mtime 与 ctime ”,而 --newer-mtime 则仅是 mtime 。

[root@study ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2092  Jun 17 00:20 /etc/passwd

# 2. 好了,那么使用 tar 来进行打包吧!日期为上面看到的 2015/06/17
[root@study ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 \
> --newer-mtime="2015/06/17" /etc/*
tar: Option --newer-mtime: Treating date `2015/06/17' as 2015-06-17 00:00:00
tar: Removing leading `/' from member names
/etc/abrt/
....(中间省略)....
/etc/alsa/
/etc/yum.repos.d/
....(中间省略)....
tar: /etc/yum.repos.d/CentOS-fasttrack.repo: file is unchanged; not dumped
# 最后行显示的是“没有被备份的”,亦即 not dumped 的意思!

 

 

 基本名称: tarfile, tarball ?

   另外值得一提的是,tar 打包出来的文件有没有进行压缩所得到文件称呼不同。如果仅是打包而已,就是“ tar -cv -f file.tar ”而已,这个文件我们称呼为 tarfile 。 如果还有进行压缩的支持,例如“ tar -jcv -f file.tar.bz2 ”时,我们就称呼为 tarball 。

 2. XFS 文件系统的备份与还原

   使用 tar 通常是针对目录树系统来进行备份的工作,那么如果想要针对整个文件系统来进行备份与还原呢?由于 CentOS 7 已经使用 XFS 文件系统作为默认值,所以 xfsdump 与 xfsrestore 两个工具对 CentOS 7 来说,就是挺重要的工具软件了。

2.1 XFS 文件系统备份 xfsdump

    xfsdump 除了可以进行文件系统的完整备份 (full backup) 之外,还可以进行增量备份 (Incremental backup) 此时新备份的数据只会记录与第一次完整备份所有差异的文件而已。

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

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

 

  特别注意, xfsdump 默认仅支持文件系统的备份,并不支持特定目录的备份~所以你不能用 xfsdump 去备份 /etc ,因为 /etc 从来就不是一个独立的文件系统!

范例:备份完整的文件系统
# 1. 先确定 /boot 是独立的文件系统喔! [root@study ~]# df -h /boot Filesystem Size Used Avail Use% Mounted on /dev/vda2 1014M 131M 884M 13% /boot # 挂载 /boot 的是 /dev/vda 的设备 # 确实是独立的文件系统, /boot 是挂载点 # 2. 将完整备份的文件名记录成为 /srv/boot.dump : [root@study ~]# xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot 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.vbird:/boot # 开始备份本机/boot系统 xfsdump: dump date: Wed Jul 1 18:43:04 2015 # 备份的时间 xfsdump: session id: 418b563f-26fa-4c9b-98b7-6f57ea0163b1 # 这次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: 103188992 Bytes 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 102872168 Bytes xfsdump: dump size (non-dir files) : 102637296 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! # 而执行 xfsdump 的过程中会出现如上的一些讯息,可以自行仔细的观察! [root@study ~]# ll /srv/boot.dump -rw-r--r--. 1 root root 102872168 Jul 1 18:43 /srv/boot.dump [root@study ~]# ll /var/lib/xfsdump/inventory -rw-r--r--. 1 root root 5080 Jul 1 18:43 506425d2-396a-433d-9968-9b200db0c17c.StObj -rw-r--r--. 1 root root 312 Jul 1 18:43 94ac5f77-cb8a-495e-a65b-2ef7442b837c.InvIndex -rw-r--r--. 1 root root 576 Jul 1 18:43 fstab # 使用了 xfsdump 之后才会有上述 /var/lib/xfsdump/inventory 内的文件产生

 

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

范例二:增量备份
# 1. 先一个大约 10 MB 的文件在 /boot 内:
[root@study ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
10+0 records in
10+0 records out
10485760 Bytes (10 MB) copied, 0.166128 seconds, 63.1 MB/s

# 2. 开始创建备份文件,此时我们使用 level 1 :
[root@study ~]# xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot
....(中间省略)....

[root@study ~]# ll /srv/boot*
-rw-r--r--. 1 root root 102872168 Jul  1 18:43 /srv/boot.dump
-rw-r--r--. 1 root root  10510952 Jul  1 18:46 /srv/boot.dump1
# 看看文件大小,就是刚刚我们所创建的那个大文件的容量 ^_^

2.2 XFS 文件系统还原 xfsrestore

  xfsdump 的还原使用的是 xfsrestore 这个指令!这个指令的选项也非常的多~可以自行 man ,这里简单介绍。

[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 来查阅即可!不需要加任何参数!因为 xfsdump 与 xfsrestore 都会到 /var/lib/xfsdump/inventory/ 里面去捞数据来显示的,因此两者输出是相同的。

  这个查询重点是找出到底哪个文件是哪个挂载点?而该备份文件又是什么 level 等等。

 

3. 光盘写入工具

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

3.1 mkisofs:创建镜像文件

[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有转嫁或移植的意思,相关数据在下面文章内说明。

  光盘的格式一般称为 iso9660 ,这种格式一般仅支持旧版的 DOS 文件名,亦即文件名只能以 8.3 (文件名8个字符,扩展名3个字符) 的方式存在。如果加上 -r 的选项之后,那么文件信息能够被记录的比较完整,可包括UID/GID与权限等等! 所以,记得加这个 -r 的选项。

  此外,一般默认的情况下,所有要被加到镜像文件中的文件都会被放置到镜像文件中的根目录, 如此一来可能会造成烧录后的文件分类不易的情况。所以,你可以使用 -graft-point 这个选项,当你使用这个选项之后, 可以利用如下的方法来定义位于镜像文件中的目录,例如:

  • 镜像文件中的目录所在=实际 Linux 文件系统的目录所在
  • /movies/=/srv/movies/ (在 Linux 的 /srv/movies 内的文件,加至镜像文件中的 /movies/ 目录)
  • /linux/etc=/etc (将 Linux 中的 /etc/ 内的所有数据备份到镜像文件中的 /linux/etc/ 目录中)

范例略

3.2 wodim,cdrecord:光盘刻录工具

   CentOS 7 使用的是 wodim 这个文字界面指令来进行刻录的行为。不过为了相容于旧版的 cdrecord 这个指令, 因此 wodim 也有链接到 cdrecord 。因此,你还是可以使用 cdrecord 这个指令。不建议还是改用 wodim,这个指令常见的选项有下面数个: 

[root@study ~]# wodim --devices dev=/dev/sr0...               <==查询烧录机的 BUS 位置
[root@study ~]# wodim -v dev=/dev/sr0 blank=[fast|all]        <==抹除重复读写片
[root@study ~]# wodim -v dev=/dev/sr0 -format                 <==格式化DVD+RW
[root@study ~]# wodim -v dev=/dev/sr0 [可用选项功能] file.iso
选项与参数:
--devices       :用在扫瞄磁盘总线并找出可用的烧录机,后续的设备为 ATA 接口
-v              :在 cdrecord 运行的过程中,显示过程而已。
dev=/dev/sr0    :可以找出此光驱的 bus 位址,非常重要!
blank=[fast|all]:blank 为抹除可重复写入的CD/DVD-RW,使用fast较快,all较完整
-format         :对光盘片进行格式化,但是仅针对 DVD+RW 这种格式的 DVD 而已;
[可用选项功能] 主要是写入 CD/DVD 时可使用的选项,常见的选项包括有:
   -data   :指定后面的文件以数据格式写入,不是以 CD 音轨(-audio)方式写入!
   speed=X :指定烧录速度,例如CD可用 speed=40 为40倍数,DVD则可用 speed=4 之类
   -eject  :指定烧录完毕后自动退出光盘
   fs=Ym   :指定多少缓冲内存,可用在将镜像文件先暂存至缓冲内存。默认为 4m,
             一般建议可增加到 8m ,不过,还是得视你的烧录机而定。
针对 DVD 的选项功能:
   driveropts=burnfree :打开 Buffer Underrun Free 模式的写入功能
   -sao                :支持 DVD-RW 的格式

 

 略

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

 4.1 dd

  这个 dd 指令最大的作用,应该是在于“备份,因为 dd 可以读取磁盘设备的内容(几乎是直接读取扇区"sector"),然后将整个设备备份成一个文件。

[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 来备份很笨,因为默认 dd 是一个一个扇区去读/写的,而且即使没有用到的扇区也会倍写入备份文件中! 因此这个文件会变得跟原本的磁盘一模一样大!不像使用 xfsdump 只备份文件系统中有使用到的部份。不过, dd 就是因为不理会文件系统, 单纯有啥记录啥,因此不论该磁盘内的文件系统你是否认识,它都可以备份、还原的。

4.2 cpio

  cpio 可以备份任何东西,包括设备设备文件。不过 cpio 有个大问题, 那就是 cpio 不会主动的去找文件来,一般来说, cpio 得要配合类似 find 等可以找到文件名的指令来告知 cpio 该被备份的数据在哪里。

[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 方式储存 

 

posted @ 2022-10-28 11:29  莫莫君不恋爱  阅读(305)  评论(0编辑  收藏  举报