初识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/1) 100 % 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~9 共 10 个等级喔! (默认为 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 方式储存
突然有一天假期结束,时来运转,人生才是真正开始了。