鸟哥的Linux私房菜 总结索引 | 第八章:文件与文件系统的压缩,打包与备份

在 Linux 下面的扩展名是没有什么很特殊的意义的

1、压缩文件的用途与技术

1、因为 比较大型的文件通过 文件压缩技术之后,可以将他的磁盘使用量降低。此外,有的压缩程序 还可以进行容量限制, 使一个大型文件 可以分区成为数个小型文件,以方便软盘片携带

2、目前 使用的计算机系统中 都是使用所谓的 Bytes 单位来计量,由于 记录数字是 1 ,1 会在最右边占据 1 个 bit ,而其他的 7 个 bits 将会自动的被填上 0
为了要满足目前 操作系统数据的存取,所以 就会将该数据转为 Byte 的型态来记录。利用一些复杂的计算方式, 将这些没有使用到的空间“丢”出来,以让文件占用的空间变小

另外一种压缩技术 是将重复的数据进行统计记录的。举例来说,如果 数据为“111…”共有100个1时, 那么压缩技术会记录为“100个1” 而不是真的有100个1的位存在

简单的说,其实文件里面有相当多的“空间”存在,并不是完全填满的, 而“压缩”的技术就是将这些“空间”填满,以让整个文件占用的容量下降。不过,这些 “压缩过的文件” 并无法 直接被 操作系统所使用的,因此, 若要使用这些被压缩过的文件数据,则必须将他“还原”回 未压缩前的模样, 那就是所谓的“解压缩”
压缩后与压缩的文件所占用的磁盘空间大小, 就可以被称为是“压缩比”

3、目前很多的 WWW 网站也是 利用文件压缩的技术来进行数据的传送,好让网站带宽的可利用率上升。由于目前的计算机运算速度 相当的快速, 因此 其实在网页浏览的时候,时间都是花在“数据的传输”上面,而不是 CPU 的运算

2、Linux 系统常见的压缩指令

1、因为 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
这些指令通常仅能针对一个文件来压缩与解压缩,tar 可以将很多文件“打包”成为一个文件,甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是“打包”而已,亦即是 将很多文件集结成为一个文件, 事实上,并没有提供压缩的功能

2.1 gzip, zcat/zmore/zless/zgrep

gzip 可以解开 compress, zip 与 gzip 等软件所压缩的文件

gzip [-cdtv#] 文件名
zcat 文件名.gz # 读取解压缩之后的原始文件内容
选项与参数:
-c  :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
-d  :解压缩
-t  :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v  :可以显示出原文件/压缩文件的压缩比等信息;
-#  :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6

范例一:找出 /etc 下面 (不含子目录) 容量最大的文件,并将它复制到 /tmp ,然后以 gzip 压缩
ls -ldSr /etc/*  
.....(前面省略).....
-rw-r--r--.  1 root root    25213 Jun 10  2014 /etc/dnsmasq.conf
-rw-r--r--.  1 root root    69768 May  4 17:55 /etc/ld.so.cache
-rw-r--r--.  1 root root   670293 Jun  7  2013 /etc/services

cd /tmp 
cp /etc/services .
gzip -v services
services:        79.7% -- replaced with services.gz
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 的文件名,原始文件就不再存在了

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

范例三:将范例一的文件解压缩
gzip -d services.gz
# 使用 gzip -d 来进行解压缩!
# 与 gzip 相反, gzip -d 会将原本的 .gz 删除,回复到原本的 services 文件

范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
gzip -9 -c services > services.gz
# >: 重定向操作符,它会将左侧命令的标准输出重定向到右侧指定的文件中
# services.gz: 是重定向的目标文件,如果该文件不存在,它会被创建;如果已经存在,则会被覆盖

范例五:由范例四再次创建的 services.gz 中,找出 http 这个关键字在哪几行
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
.....(下面省略).....

范例四中:-c 可以将 原本要转成压缩文件的数据内容,将它变成 文字类型从屏幕输出, 然后 可以通过大于 (>) 这个符号,将原本应该 由屏幕输出的数据,转成输出到文件 而不是屏幕,所以 就能够创建出压缩文挡

cat/more/less 可以使用不同的方式 来读取纯文本文件,zcat/zmore/zless 则可以对应于 cat/more/less 的方式来读取 纯文本文件被压缩后的压缩文件
不但 compress 的压缩文件可以使用 gzip 来解开,同时 zcat 这个指令可以同时读取 compress 与 gzip 的压缩文件
通过 egrep 来搜寻关键字,而不需要将压缩文件解开才以 grep 进行

compress 创建出来的 .Z 文件,使用 znew 可以将该文件转成 gzip 的格式

2.2 bzip2, bzcat/bzmore/bzless/bzgrep

bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的,bzip2 的用法几乎与 gzip 相同

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

范例一:将刚刚 gzip 范例留下来的 /tmp/services 以 bzip2 压缩
bzip2 -v services
  services:  5.409:1,  1.479 bits/Byte, 81.51% saved, 670293 in, 123932 out.
ls -l services*
-rw-r--r--. 1 dmtsai dmtsai 123932 Jun 30 18:40 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
# 此时 services 会变成 services.bz2 之外,你也可以发现 bzip2 的压缩比要较 gzip 好

范例二:将范例一的文件内容读出来
bzcat services.bz2

范例三:将范例一的文件解压缩
bzip2 -d services.bz2

范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
bzip2 -9 -c services > services.bz2

对于大容量文件来说,bzip2 压缩时间 至少比 gzip 要久

2.3 xz, xzcat/xzmore/xzless/xzgrep

用法也跟 gzip/bzip2 几乎一模一样

xz [-dtlkc#] 文件名
xcat 文件名.xz
选项与参数:
-d  :就是解压缩
-t  :测试压缩文件的完整性,看有没有错误
-l  :列出压缩文件的相关信息
-k  :保留原本的文件不删除
-c  :同样的,就是将数据由屏幕上输出的意思
-#  :同样的,也有压缩比的意思

范例一:将刚刚由 bzip2 所遗留下来的 /tmp/services 通过 xz 来压缩
xz -v services
services (1/1)
  100 %        97.3 KiB / 654.6 KiB = 0.149

[dmtsai@study tmp]$ ls -l services*
-rw-rw-r--. 1 dmtsai dmtsai 123932 Jun 30 19:09 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
-rw-r--r--. 1 dmtsai dmtsai  99608 Jun 30 18:40 services.xz
# 容量又进一步下降

范例二:列出这个压缩文件的信息,然后读出这个压缩文件的内容
xz -l services.xz
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1     97.3 KiB    654.6 KiB  0.149  CRC64   services.xz

xzcat services.xz

范例三:将他解压缩
xz -d services.xz

范例四:保留原文件的文件名,并且创建压缩文件
xz -k services

运算时间 比 gzip 久很多

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

3、打包指令:tar

虽然 gzip, bzip2, xz 也能够针对目录来进行压缩,不过,这两个指令 对目录的压缩指的是 将目录内的所有文件 “分别” 进行压缩

将多个文件或目录 包成一个大文件的指令功能,可以称呼 他是一种“打包指令”。 tar 可以将多个目录或文件打包成一个大文件,同时 还可以通过 gzip/bzip2/xz 的支持,将该文件同时进行压缩

3.1 tar

tar [-z|-j|-J] [cv] [-f 待创建的新文件名] filename... # 打包与压缩
tar [-z|-j|-J] [tv] [-f 既有的 tar文件名]             # 查看文件名
tar [-z|-j|-J] [xv] [-f 既有的 tar文件名] [-C 目录]   # 解压缩
选项与参数:
-c  :创建打包文件,可搭配 -v 来察看过程中被打包的文件名
-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 -j c v -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -j t v -f filename.tar.bz2
解压缩:tar -j x v -f filename.tar.bz2 -C 欲解压缩的目录

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

由于“ -f filename ”是紧接在一起的,过去很多文章 常会写成 “-jcvf filename”,这样是对的, 由于选项的顺序理论上是可以变换的,如果 “-jvfc filename” 会导致产生的文件名变成 c

1、使用 tar 加入 -z, -j 或 -J 的参数备份 /etc/ 目录
备份 /etc 最简单的方法就是使用 tar

su -  # 因为备份 /etc 需要 root 的权限,否则会出现一堆错误
time tar -zpcv -f /root/etc.tar.gz /etc # 多了-p保存所有权限,其他都和压缩过程一致
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 这个选项,因此正在作用中的文件名就会显示在屏幕上

time tar -jpcv -f /root/etc.tar.bz2 /etc
....(前面省略)....
real    0m1.913s
user    0m1.881s
sys     0m0.038s
time tar -Jpcv -f /root/etc.tar.xz  /etc
....(前面省略)....
real    0m9.023s
user    0m8.984s
sys     0m0.086s
# 显示的讯息会跟上面一模一样,不过时间会花比较多!使用了 -J 时,会花更多时间

ll /root/etc*
-rw-r--r--. 1 root root 6721809 Jul  1 00:16 /root/etc.tar.bz2
-rw-r--r--. 1 root root 7758826 Jul  1 00:14 /root/etc.tar.gz
-rw-r--r--. 1 root root 5511500 Jul  1 00:16 /root/etc.tar.xz

du -sm /etc
28     /etc  # 实际目录约占有 28MB 的意思

压缩比越好 花费的运算时间越多

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

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 这个选项时,详细的文件权限/属性 都会被列出来。每个文件名 都没了根目录,这也是上一个练习中出现的那个警告讯息 “tar: Removing leading /’ from member names(移除了文件名开头的/’ )” 所告知的情况

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

既然是备份数据,那么需要 还原回来。” 如果 备份的数据是两年前的旧版 CentOS 6.x, 只是想要了解一下 过去的备份内容 究竟有哪些数据,结果一解开该文件,却发现 目前新版的 CentOS 7.x 下面的 /etc 被旧版的备份数据覆盖了

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

# 将文件名中的(根)目录也备份下来,并察看一下备份文件的内容文件名
tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
tar -jtf /root/etc.and.root.tar.bz2
/etc/locale.conf
/etc/hostname
/etc/aliases.db
# 这次查阅文件名不含 -v 选项,所以仅有文件名而已,没有详细属性/权限等参数

不要加上 -P 这个选项来备份,备份是为了要未来追踪问题用的,倒不一定需要还原回原本的系统中。所以拿掉根目录后,备份数据的应用会比较有弹性,也比较安全

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

tar -jxv -f /root/etc.tar.bz2
ll
....(前面省略)....
drwxr-xr-x. 131 root root    8192 Jun 26 22:14 etc
....(后面省略)....

此时 该打包文件会在“本目录下进行解压缩”的动作。 所以,会在主文件夹下面 发现一个名为 etc 的目录

3、指定欲解开的目录所在位置,使用 -C 这个选项

# 想要将该文件在 /tmp 下面解开
tar -jxv -f /root/etc.tar.bz2 -C /tmp
ll /tmp
....(前面省略)....
drwxr-xr-x. 131 root   root     8192 Jun 26 22:14 etc
....(后面省略)....

rm -rf 会递归地删除 指定目录及其下的所有文件和子目录,且不会进行 任何确认提示。以下是对 rm -rf 的详细解释:
rm:删除文件或目录的命令
-r:递归删除,删除目录及其内容
-f:强制删除,忽略不存在的文件,并且不提示用户确认

rm -rf /root/etc /tmp/etc

4、仅解开单一文件的方法
只要使用 -jtv 找到 目标文件名,然后 将该文件名解开即可

# 1、先找到我们要的文件名,假设解开 shadow 文件
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-

# 2、将该文件解开
# 格式:tar -jxv -f 打包档.tar.bz2 待解开文件名
tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
ll etc
total 4
----------. 1 root root 1210 Jun 17 00:20 shadow

5、打包某目录,但不含该目录下的某些文件
想要打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件,,当然这个文件自己不要打包自己(避免将正在创建的备份文件(即 /root/system.tar.bz2)也包含在打包的内容中),假设这个新的打包文件要放置成为 /root/system.tar.bz2,通过 --exclude

tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root

因为打包的源文件 和 打包的目的文件位置都是 /root/

如果想要两行输入时,最后面加上反斜线 (\) 并立刻按下 [enter] , 就能够到第二行继续输入了

6、仅备份比某个时刻还要新的文件
想要备份新的文件而已,当使用 --newer 时,表示后续的日期包含“ mtime 与 ctime ”,而 --newer-mtime 则仅是 mtime 而已

# 找出比 /etc/passwd 还要新的文件
find /etc -newer /etc/passwd
....(过程省略)....
# 此时会显示出比 /etc/passwd 这个文件的 mtime 还要新的文件名

# 看看是啥时间
ll /etc/passwd
-rw-r--r--. 1 root root 2092  Jun 17 00:20 /etc/passwd

# 使用 tar 来进行打包
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 的意思

# 显示出文件即可
tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$' 
# 通过这个指令可以调用出 tar.bz2 内的结尾非 / 的文件名
#(在 tar 归档文件中,目录通常以 / 结尾表示(例如,dir/)。文件名则没有 / 结尾(例如,file.txt))

# -v:选项表示“取反”,即显示不匹配模式的行
# '/$':表示正则表达式,用于匹配以 / 结尾的行

如果 在一个月前才进行过一次完整的数据备份, 那么这个月想要备份时,当然可以 仅备份上个月进行备份的那个时间点之后的更新的文件即可,这样可以降低备份的容量

7、基本名称: tarfile, tarball
tar 打包出来的文件 有没有进行压缩所得到文件称呼不同,如果仅是打包而已,就是“ tar -cv -f file.tar ”而已,这个文件 称呼为 tarfile 。 如果还有进行压缩的支持,例如“ tar -jcv -f file.tar.bz2 ”时,就称呼为 tarball

tar 除了 可以将数据打包成为文件之外,还能够将 文件打包到某些特别的设备去,举例来说, 磁带机就是一个常见的例子。磁带机 由于是 一次性读取/写入的设备,因此 不能够使用类似 cp 等指令来复制的,如果想要将 /home, /root, /etc 备份到磁带机 (/dev/st0) 时,就可以使用:tar -cv -f /dev/st0 /home /root /etc

8、特殊应用:利用管线命令 与数据流
通过标准输入输出的数据流重导向, 以及管线命令的方式,将待处理的文件 一边打包一边解压缩到目标目录去

# 将 /etc 整个目录一边打包一边在 /tmp 解开
cd /tmp
tar -cvf - /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 
# 要注意的地方在于输出文件变成 - 而输入文件也变成 - ,又有一个 | 存在
# (-f -:将 tar 归档输出到标准输出(- 表示标准输出而不是文件);-f -:从标准输入读取 tar 归档)
# 这分别代表 standard output, standard input 与管线命令
# 简单的想法中,可以将 - 想成是在内存中的一个设备(缓冲区)。

tar -cvf - /etc 打包 /etc 目录,并将打包的数据通过管道传递
tar -xvf - 从管道接收数据 并立即解压缩,最终将 /etc 目录的内容 恢复到当前目录

9、系统备份范例
/etc/ (配置文件)
/home/ (使用者的主文件夹)
/var/spool/mail/ (系统中,所有帐号的邮件信箱)
/var/spool/cron/ (所有帐号的工作排成配置文件)
/root (系统管理员的主文件夹)

/home/loop* 不需要备份,而且 /root 下面的压缩文件也不需要备份,另外假设 要将备份的数据放置到 /backups ,并且该目录仅有 root 有权限进入

# 先处理要放置备份数据的目录与权限:
mkdir /backups
chmod 700 /backups
ll -d /backups
drwx------. 2 root root 6 Jul  1 17:25 /backups

# 假设今天是 2015/07/01 ,则创建备份的方式如下:
tar -jcv -f /backups/backup-system-20150701.tar.bz2 \
> --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* \
> /etc /home /var/spool/mail /var/spool/cron /root
....(过程省略)....

ll -h /backups/
-rw-r--r--. 1 root root 21M Jul  1 17:26 backup-system-20150701.tar.bz2

10、解压缩后的 SELinux 课题
SELinux 的权限问题“可能会让你的系统 无法存取某些配置文件内容,导致 影响到系统的正常使用权”
复原倒是没问题,但是复原完毕之后,无论如何就是无法正常的登陆系统,大部分原因就是因为 /etc/shadow 这个密码文件的 SELinux 类型在还原时被更改了,导致系统的登陆程序 无法顺利的存取它, 才造成无法登陆的窘境
简单的处理方式有这几个:

  1. 通过各种可行的救援方式登陆系统,然后修改 /etc/selinux/config 文件,将 SELinux 改成 permissive 模式,重新开机后系统就正常了;
  2. 在第一次复原系统后,不要立即重新开机!先使用 restorecon -Rv /etc 自动修复一下 SELinux 的类型即可
  3. 通过各种可行的方式登陆系统,创建 /.autorelabel 文件,重新开机后系统会自动修复 SELinux 的类型,并且又会再次重新开机,之后就正常了

4、XFS 文件系统的备份与还原

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

4.1 XFS 文件系统备份 xfsdump

1、除了 可以进行文件系统的完整备份之外,还可以进行 累积备份(新备份的数据 只会记录与第一次完整备份所有差异的文件而已)
在这里插入图片描述
上方的 “实时文件系统” 是 一直随着时间而变化的数据,例如在 /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 的文件系统
xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据
xfsdump -I
选项与参数:
-L  :xfsdump 会纪录每次备份的 session 标头,这里可以填写针对此文件系统的简易说明
-M  :xfsdump 可以纪录储存媒体的标头,这里可以填写此媒体的简易说明
-l  :是 L 的小写,就是指定等级~有 0~9 共 10 个等级 (默认为 0,即完整备份)
-f  :有点类似 tar ,后面接产生的文件,亦可接例如 /dev/st0 设备文件名或其他一般文件文件名等
-I  :从 /var/lib/xfsdump/inventory 列出目前备份的信息状态

xfsdump 默认 仅支持文件系统的备份,并不支持 特定目录的备份

2、用 xfsdump 备份完整的文件系统

# 先确定 /boot 是独立的文件系统
df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2      1014M  131M  884M  13% /boot      # 挂载 /boot 的是 /dev/vda 设备
# 确实是独立的文件系统,/boot 是挂载点

# 将完整备份的文件名记录成为 /srv/boot.dump 
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 的过程中会出现如上的一些讯息,可以自行仔细的观察

ll /srv/boot.dump
-rw-r--r--. 1 root root 102872168 Jul  1 18:43 /srv/boot.dump

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 内的文件产生

3、用 xfsdump 进行累积备份
一定得要 进行过完整备份后 (-l 0) 才能够继续 进行其他累积备份 (-l 1~9)

# 看一下有没有任何文件系统被 xfsdump 过的数据
xfsdump -I
file system 0:
    fs id:          94ac5f77-cb8a-495e-a65b-2ef7442b837c
    session 0:
        mount point:    study.centos.vbird:/boot
        device:         study.centos.vbird:/dev/vda2
        time:           Wed Jul  1 18:43:04 2015
        session label:  "boot_all"
        session id:     418b563f-26fa-4c9b-98b7-6f57ea0163b1
        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:     102872168
                        mfile start:    ino 132 offset 0
                        mfile end:      ino 2138243 offset 0
                        media label:    "boot_all"
                        media id:       a6168ea6-1ca8-44c1-8d88-95c863202eab
xfsdump: Dump Status: SUCCESS
# 可以看到目前仅有一个 session 0 的备份数据,而且是 level 0 

# 创建一个大约 10 MB 的文件在 /boot 内:
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

# 开始创建差异备份文件,此时我们使用 level 1 
xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot
....(中间省略)....

/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
# 看看文件大小,就是刚刚我们所创建的那个大文件的容量

# 最后再看一下是否有记录 level 1 备份的时间点
xfsdump -I
file system 0:
    fs id:          94ac5f77-cb8a-495e-a65b-2ef7442b837c
    session 0:
        mount point:    study.centos.vbird:/boot
        device:         study.centos.vbird:/dev/vda2
....(中间省略)....

    session 1:
        mount point:    study.centos.vbird:/boot
        device:         study.centos.vbird:/dev/vda2
        time:           Wed Jul  1 18:46:21 2015
        session label:  "boot_2"
        session id:     c71d1d41-b3bb-48ee-bed6-d77c939c5ee8
        level:          1
        resumed:        NO
        subtree:        NO
        streams:        1
        stream 0:
                pathname:       /srv/boot.dump1
                start:          ino 455518 offset 0
....(下面省略)....
xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot

-L boot_2:指定备份会话的标签,这里给备份会话命名为 boot_2。这可以帮助 标识不同的备份会话
-M boot_2:指定备份介质的标签,这里将备份介质命名为 boot_2。这在多卷备份中很有用,可以确保备份数据的一致性
-f /srv/boot.dump1:指定备份文件的输出位置。备份数据将被保存到 /srv/boot.dump1 文件中
/boot:指定要备份的目录或分区。在这个例子中,/boot 是目标目录

4.2 XFS 文件系统还原 xfsrestore

1、备份文件就是在急用时 可以回复系统的重要数据,所以有备份 当然就有复原

xfsrestore -I # 用来察看备份文件数据
xfsrestore [-f 备份文件] [-L S_label] [-s] 待复原目录 # 单一文件全系统复原
xfsrestore [-f 备份文件] -r 待复原目录 # 通过累积备份文件来复原系统
xfsrestore [-f 备份文件] -i 待复原目录 # 进入互动模式
选项与参数:
-I  :跟 xfsdump 相同的输出,可查询备份数据,包括 Label 名称与备份时间等
-f  :后面接的就是备份文件,企业界很有可能会接 /dev/st0 等磁带机,我们这里接文件名
-L  :就是 Session 的 Label name,可用 -I 查询到的数据,在这个选项后输入
-s  :需要接某特定目录,亦即仅复原某一个文件或目录之意
-r  :如果是用文件来储存备份数据,那这个就不需要使用。如果是一个磁带内有多个文件,
      需要这东西来达成累积复原
-i  :进入互动模式,进阶管理员使用的,一般我们不太需要操作它

2、用 xfsrestore 观察 xfsdump 后的备份数据内容
要找出 xfsdump 的内容就使用 xfsrestore -I 来查阅即可,因为 xfsdump 与 xfsrestore 都会到 /var/lib/xfsdump/inventory/ 里面去捞数据来显示的

xfsrestore -I 
file system 0:
    fs id:          94ac5f77-cb8a-495e-a65b-2ef7442b837c
    session 0:
        mount point:    study.centos.vbird:/boot
        device:         study.centos.vbird:/dev/vda2
        time:           Wed Jul  1 18:43:04 2015
        session label:  "boot_all"
        session id:     418b563f-26fa-4c9b-98b7-6f57ea0163b1
        level:          0
                pathname:       /srv/boot.dump
                        mfile size:     102872168
                        media label:    "boot_all"
    session 1:
        mount point:    study.centos.vbird:/boot
        device:         study.centos.vbird:/dev/vda2
        time:           Wed Jul  1 18:46:21 2015
        session label:  "boot_2"
        session id:     c71d1d41-b3bb-48ee-bed6-d77c939c5ee8
        level:          1
                pathname:       /srv/boot.dump1
                        mfile size:     10510952
                        media label:    "boot_2"
xfsrestore: Restore Status: SUCCESS
# 可以看到这个文件系统是 /boot 载点,然后有两个备份,一个 level 0 一个 level 1
# 也看到这两个备份的数据他的内容大小,更重要的,就是那个 session label 

3、简单复原 level 0 的文件系统
将 /boot 整个复原到最原本的状态,要知道 想要被复原的那个文件, 以及该文件的 session label name

# 直接将数据给它覆盖回去即可
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

# 将备份数据在 /tmp/boot 下面解开
mkdir /tmp/boot
xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot
du -sm /boot /tmp/boot
109     /boot
99      /tmp/boot
# 两者怎么大小不一致呢?

diff -r /boot /tmp/boot 
# 看有什么不同,diff 用于显示两个文件或两个目录之间的差异,-r 参数用于递归比较目录中的文件
Only in /boot: testing.img
# 原来是 /boot 有增加过一个文件

因为原本 /boot 里面的东西 没有删除,直接复原的结果就是:同名的文件会被覆盖,其他系统内新的文件 会被保留

仅复原备份文件内的 grub2 到 /tmp/boot2/ 里头
mkdir /tmp/boot2
xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2

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

4、复原累积备份数据
如果备份数据是由 level 0 -> level 1 -> level 2… 去进行的, 当然复原就得要相同的流程来复原,接下来当然就要复原 level 1 到系统内

继续复原 level 1 到 /tmp/boot 当中
xfsrestore -f /srv/boot.dump1 /tmp/boot

5、仅还原部分文件的 xfsrestore 互动模式
通过 -i 这个互动界面
想要知道 level 0 的备份数据里面有哪些东西,然后再少量的还原回来

# 先进入备份文件内,准备找出需要备份的文件名数据,同时预计还原到 /tmp/boot3 当中
mkdir /tmp/boot3
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

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
# 就只会有 3 个文件名被复原,当然,如果文件名是目录,那下面的子文件当然也会被还原回来的

5、光盘写入工具

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

5.1 mkisofs:创建镜像文件

1、制作一般数据光盘镜像文件:想要 利用烧录机 将你的数据烧录到 DVD 时, 也得要 先将 数据包成一个镜像文件,这样才能够写入DVD片中。而将 数据包成一个镜像文件的方式 就通过 mkisofs 这个指令即可

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有转嫁或移植的意思

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

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

mkisofs -r -v -o /tmp/system.img /root /home /etc
I: -input-charset not specified, using utf-8 (detected in locale settings)
genisoimage 1.1.11 (Linux)
Scanning /root
.....(中间省略).....
Scanning /etc/scl/prefixes
Using SYSTE000.;1 for  /system-release-cpe (system-release)      # 被改名子了!
Using CENTO000.;1 for  /centos-release-upstream (centos-release) # 被改名子了!
Using CRONT000.;1 for  /crontab (crontab)
genisoimage: Error: '/etc/crontab' and '/root/crontab' have the same Rock Ridge name 'crontab'.
Unable to sort directory                                         # 文件名不可一样
NOTE: multiple source directories have been specified and merged into the root
of the filesystem. Check your program arguments. genisoimage is not tar.
# 因为文件名一模一样,所以就不给你创建 ISO 文档
# 先删除 /root/crontab 这个文件,然后再重复执行一次 mkisofs 

rm /root/crontab
mkisofs -r -v -o /tmp/system.img /root /home /etc
.....(前面省略).....
 83.91% done, estimate finish Thu Jul  2 18:48:04 2015
 92.29% done, estimate finish Thu Jul  2 18:48:04 2015
Total translation table size: 0
Total rockridge attributes Bytes: 600251
Total directory Bytes: 2150400
Path table size(Bytes): 12598
Done with: The File(s)                     Block(s)    58329
Writing:   Ending Padblock                 Start Block 59449
Done with: Ending Padblock                 Block(s)    150
Max brk space used 548000
59599 extents written (116 MB)

ll -h /tmp/system.img
-rw-r--r--. 1 root root 117M Jul  2 18:48 /tmp/system.img

mount -o loop /tmp/system.img /mnt
# -o loop:指定使用循环设备来挂载文件。这个选项告诉系统将文件视为一个磁盘设备。这通常用于挂载 ISO 文件或其他磁盘映像文件
# 常见的 -o 选项
# loop:将一个文件作为块设备挂载,通常用于挂载磁盘映像文件
# ro:以只读模式挂载文件系统
# rw:以读写模式挂载文件系统。
# noexec:禁止在挂载的文件系统上执行二进制文件
# nosuid:忽略 SUID 和 SGID 位,避免安全风险
# nodev:禁止设备文件的解释
df -h /mnt
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0      117M  117M     0 100% /mnt

ls /mnt
abrt            festival          mail.rc                   rsyncd.conf
adjtime         filesystems       makedumpfile.conf.sample  rsyslog.conf
alex            firewalld         man_db.conf               rsyslog.d
# 一堆数据都放置在一起,包括目录与文件等等

umount /mnt
# 测试完毕要记得卸载

把三个目录 (/root, /home, /etc) 的数据通通放置到了 镜像文件的最顶层目录中,需要保持 还是三个目录。同时避免由于 /root/etc 的存在,导致那个 /etc 的数据 没有被包含进来

mkisofs -r -V 'linux_file' -o /tmp/system.img \
>  -m /root/etc -graft-point /root=/root /home=/home /etc=/etc
ll -h /tmp/system.img
-rw-r--r--. 1 root root 92M Jul  2 19:00 /tmp/system.img
# 上面的指令会创建一个大文件,其中 -graft-point 后面接的就是我们要备份的数据
# 必须要注意的是那个等号的两边,等号左边是在镜像文件内的目录,右侧则是实际的数据

mount -o loop /tmp/system.img /mnt
ll /mnt
dr-xr-xr-x. 131 root root 34816 Jun 26 22:14 etc
dr-xr-xr-x.   5 root root  2048 Jun 17 00:20 home
dr-xr-xr-x.   8 root root  4096 Jul  2 18:48 root
# 数据是分门别类的在各个目录中。最后将数据卸载一下:

umount /mnt

2、制作/修改可开机光盘图像挡
如何让这片光盘的内容被修改之后, 还可以烧录成为可开机的模样
要将里头的数据 进行修改,假设新的镜像文件目录 放置于 /srv/newcd 里面

# 先观察一下这片光盘里面有啥东西?是否是我们需要的光盘系统
isoinfo -d -i /home/CentOS-7-x86_64-Minimal-1503-01.iso
CD-ROM is in ISO 9660 format
System id: LINUX
Volume id: CentOS 7 x86_64
Volume set id:
Publisher id:
Data preparer id:
Application id: GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) ...
Copyright File id:
.....(中间省略).....
    Eltorito defaultboot header:
 Bootid 88 (bootable)
        Boot media 0 (No Emulation Boot)
        Load segment 0
        Sys type 0
        Nsect 4

# 开始挂载这片光盘到 /mnt ,并且将所有数据完整复制到 /srv/newcd 目录去
mount /home/CentOS-7-x86_64-Minimal-1503-01.iso /mnt
mkdir /srv/newcd
rsync -a /mnt/ /srv/newcd
ll /srv/newcd/
-rw-r--r--. 1 root root    16 Apr  1 07:11 CentOS_BuildTag
drwxr-xr-x. 3 root root    33 Mar 28 06:34 EFI
-rw-r--r--. 1 root root   215 Mar 28 06:36 EULA
-rw-r--r--. 1 root root 18009 Mar 28 06:36 GPL
drwxr-xr-x. 3 root root    54 Mar 28 06:34 images
drwxr-xr-x. 2 root root  4096 Mar 28 06:34 isolinux
drwxr-xr-x. 2 root root    41 Mar 28 06:34 LiveOS
drwxr-xr-x. 2 root root 20480 Apr  1 07:11 Packages
drwxr-xr-x. 2 root root  4096 Apr  1 07:11 repodata
-rw-r--r--. 1 root root  1690 Mar 28 06:36 RPM-GPG-KEY-CentOS-7
-rw-r--r--. 1 root root  1690 Mar 28 06:36 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r--. 1 root root  2883 Apr  1 07:15 TRANS.TBL
# rsync 可以完整的复制所有的权限属性等数据,也能够进行镜像处理,用于同步文件和目录(递归地复制)
# 现在 newcd/ 目录内已经是完整的镜像文件内容

# 假设已经处理完毕你在 /srv/newcd 里面所要进行的各项修改行为,准备创建 ISO 文档
ll /srv/newcd/isolinux/
-r--r--r--. 1 root root     2048 Apr  1 07:15 boot.cat      # 开机的型号数据等等
-rw-r--r--. 1 root root       84 Mar 28 06:34 boot.msg
-rw-r--r--. 1 root root      281 Mar 28 06:34 grub.conf
-rw-r--r--. 1 root root 35745476 Mar 28 06:31 initrd.img
-rw-r--r--. 1 root root    24576 Mar 28 06:38 isolinux.bin  # 相当于开机管理程序
-rw-r--r--. 1 root root     3032 Mar 28 06:34 isolinux.cfg
-rw-r--r--. 1 root root   176500 Sep 11  2014 memtest
-rw-r--r--. 1 root root      186 Jul  2  2014 splash.png
-r--r--r--. 1 root root     2438 Apr  1 07:15 TRANS.TBL
-rw-r--r--. 1 root root 33997348 Mar 28 06:33 upgrade.img
-rw-r--r--. 1 root root   153104 Mar  6 13:46 vesamenu.c32
-rwxr-xr-x. 1 root root  5029136 Mar  6 19:45 vmlinuz       # Linux 核心文件

cd /srv/newcd
mkisofs -o /custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat \
> -no-emul-boot -V 'CentOS 7 x86_64' -boot-load-size 4 -boot-info-table -R -J -v -T .

在这里插入图片描述
此时 就有一个 /custom.img 的文件存在,可以将该光盘烧录出来

5.2 cdrecord:光盘烧录工具

1、wodim 也有链接到 cdrecord

wodim --devices dev=/dev/sr0...               
# 查询烧录机的 BUS 位置(指该设备在系统中的连接接口或总线位置)
wodim -v dev=/dev/sr0 blank=[fast|all]        
# 抹除重复读写片(对可重复使用的存储介质(如可擦写光盘或 USB 闪存)进行清除操作)
wodim -v dev=/dev/sr0 -format                 # 格式化DVD+RW
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 的格式

典型的 BUS 类型
SATA:现代光驱通常通过 SATA 接口连接到主板
IDE/PATA:较旧的光驱使用 IDE 接口
USB:外置光驱通常通过 USB 连接
SCSI:某些专业设备使用 SCSI 总线

2、侦测你的烧录机所在位置
要烧录 首先就得要找到烧录机才行,而由于早期的烧录机都是使用 SCSI 接口,因此查询烧录机的方法 就得要配合着 SCSI 接口的认定来处理了

ll /dev/sr0
brw-rw----+ 1 root cdrom 11, 0 Jun 26 22:14 /dev/sr0 # 一般 Linux 光驱文件名

wodim --devices dev=/dev/sr0

一定要有 dev=/dev/xxx 那一段,不然系统会告诉你 找不到光盘

3、进行 CD/DVD 的烧录动作
将 /tmp/system.img 烧录到 CD/DVD 里面去

# 先抹除光盘的原始内容:(非可重复读写则可略过此步骤)
wodim -v dev=/dev/sr0 blank=fast

# 开始烧录:
wodim -v dev=/dev/sr0 speed=4 -dummy -eject /tmp/system.img
....(前面省略)....
Waiting for reader process to fill input buffer ... input buffer ready.
Starting new track at sector: 0
Track 01:   86 of   86 MB written (fifo 100%) [buf  97%]   4.0x.     # 这里有流程时间
Track 01: Total Bytes read/written: 90937344/90937344 (44403 sectors).
Writing  time:   38.337s                                               # 写入的总时间
Average write speed   1.7x.                                            # 换算下来的写入时间
Min drive buffer fill was 97%
Fixating...
Fixating time:  120.943s
wodim: fifo had 1433 puts and 1433 gets.
wodim: fifo was 0 times empty and 777 times full, min fill was 89%.
# 因为有加上 -eject 这个选项的缘故,因此烧录完成后,DVD 会被退出光驱

# 烧录完毕后,测试挂载一下,检验内容:
mount /dev/sr0 /mnt
df -h /mnt
Filesystem            Size  Used Avail Use% Mounted on
Filesystem      Size  Used Avail Use% Mounted on
/dev/sr0         87M   87M     0 100% /mnt

ll /mnt
dr-xr-xr-x. 135 root root 36864 Jun 30 04:00 etc
dr-xr-xr-x.  19 root root  8192 Jul  2 13:16 root

umount /mnt    # 不要忘了卸载

6、其他常见的压缩与备份工具

6.1 dd

这个指令 可不只是制作一个文件而已,这个 dd 指令也可以“备份”。因为 dd 可以读取磁盘设备的内容(几乎是直接读取扇区"sector"),然后将整个设备备份成一个文件

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 的意思。

范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中
dd if=/etc/passwd of=/tmp/passwd.back
4+1 records in
4+1 records out
2092 Bytes (2.1 kB) copied, 0.000111657 s, 18.7 MB/s
[root@study ~]# ll /etc/passwd /tmp/passwd.back
-rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd
-rw-r--r--. 1 root root 2092 Jul  2 23:27 /tmp/passwd.back
# /etc/passwd 文件大小为 2092 Bytes,因为没有设置 bs ,
# 所以默认是 512 Bytes 为一个单位,因此,上面那个 4+1 表示有 4 个完整的 512 Bytes,
# 以及未满 512 Bytes 的另一个 block 的意思,很像 cp 这个指令

范例二:将刚刚烧录的光驱的内容,再次的备份下来成为图像挡
dd if=/dev/sr0 of=/tmp/system.iso
177612+0 records in
177612+0 records out
90937344 Bytes (91 MB) copied, 22.111 s, 4.1 MB/s
# 要将数据抓下来用这个方法,如果是要将镜像文件写入 USB 磁盘,就会变如下一个范例

范例三:假设你的 USB 是 /dev/sda 好了,请将刚刚范例二的 image 烧录到 USB 磁盘中
lsblk /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda    8:0    0   2G  0 disk             # 确实是 disk 而且有 2GB 
dd if=/tmp/system.iso of=/dev/sda
mount /dev/sda /mnt
ll /mnt
dr-xr-xr-x. 131 root root 34816 Jun 26 22:14 etc
dr-xr-xr-x.   5 root root  2048 Jun 17 00:20 home
dr-xr-xr-x.   8 root root  4096 Jul  2 18:48 root
# 如果不想要使用 DVD 来作为开机媒体,那可以将镜像文件使用这个 dd 写入 USB 磁盘,
# 该磁盘就会变成跟可开机光盘一样的功能,可以让你用 USB 来安装 Linux ,速度快

范例四:将你的 /boot 整个文件系统通过 dd 备份下来
df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2      1014M  149M  866M  15% /boot       # 备份的容量会到 1G 
dd if=/dev/vda2 of=/tmp/vda2.img
ll -h /tmp/vda2.img
-rw-r--r--. 1 root root 1.0G Jul  2 23:39 /tmp/vda2.img
# 等于是将整个 /dev/vda2 通通捉下来的意思,
所以,文件大小会跟整颗磁盘的最大量一样大

挂载和软连接:

  1. 操作对象
    挂载:
    操作对象是整个设备或分区,以及文件系统(如光盘、USB 设备、网络共享、ISO 文件等)。
    软连接:
    操作对象是文件或目录。
  2. 用途
    挂载:
    用于将一个外部设备或文件系统连接到系统的目录树中,使其可以被访问。挂载通常用于硬盘分区、USB 设备、光盘等
    软连接:
    用于在文件系统中创建快捷方式或别名,简化路径访问或提供多个路径访问同一个文件或目录
  3. 操作级别
    挂载:
    是一个系统级别的操作,必须具有超级用户权限(root 权限)才能执行。挂载通常由操作系统管理,涉及文件系统和设备的连接
    软连接:
    是一个文件系统级别的操作,可以由普通用户执行。创建软连接不需要超级用户权限,除非涉及系统级目录或文件
  4. 持久性
    挂载:
    挂载的设备在系统重启后通常不会自动重新挂载,除非在 /etc/fstab 文件中进行了配置
    软连接:
    软连接是持久的,除非目标文件或目录被删除或移动,否则软连接在系统重启后仍然有效
  5. 访问方式
    挂载:
    挂载后,设备或文件系统的内容会直接显示在挂载点目录中。用户可以像访问普通目录一样访问挂载后的内容
    软连接:
    软连接本身是一个文件,指向另一个文件或目录。访问软连接时,系统会自动重定向到目标文件或目录

默认 dd 是一个一个扇区去读/写的,而且即使没有用到的扇区 也会倍写入备份文件中
不像使用 xfsdump 只备份文件系统中 有使用到的部份。不过, dd 就是因为不理会文件系统, 单纯有啥纪录啥,因此 不论该磁盘内的文件系统 是否认识,它都可以备份、还原的

例题:你想要将你的 /dev/vda2 进行完整的复制到另一个 partition 上,请使用你的系统上面未分区完毕的容量 再创建一个与 /dev/vda2 差不多大小的分区 (只能比 /dev/vda2 大,不能比他小),然后将之进行完整的复制 (包括需要复制 boot sector 的区块)

# 1、先进行分区的动作
fdisk /dev/sda

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-4195455, default 2048): Enter
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-4195455, default 4195455): Enter
Using default value 4195455
Partition 1 of type Linux and of size 2 GiB is set

Command (m for help): p
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     4195455     2096704   83  Linux

Command (m for help): w

partprobe # 更新操作系统内核关于分区表信息

# 2、不需要格式化,直接进行 sector 表面的复制
dd if=/dev/vda2 of=/dev/sda1
2097152+0 records in
2097152+0 records out
1073741824 Bytes (1.1 GB) copied, 71.5395 s, 15.0 MB/s

xfs_repair -L /dev/sda1  # 一定要先清除一堆 log 才行,修复文件(用 xfs_repair -L 命令可以强制丢弃日志并修复文件系统)
uuidgen                  # 下面两行在给予一个新的 UUID
896c38d1-bcb5-475f-83f1-172ab38c9a0c
xfs_admin -U 896c38d1-bcb5-475f-83f1-172ab38c9a0c /dev/sda1
# 因为 XFS 文件系统主要使用 UUID 来分辨文件系统,但我们使用 dd 复制,连 UUID
# 也都复制成为相同,当然就得要使用上述的 xfs_repair 及 xfs_admin 来修订一下

mount /dev/sda1 /mnt
df -h /boot /mnt
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2      1014M  149M  866M  15% /boot
/dev/sda1      1014M  149M  866M  15% /mnt
# 这两个玩意儿会“一模一样”

# 3、接下来将文件系统放大吧
xfs_growfs /mnt
df -h /boot /mnt
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2      1014M  149M  866M  15% /boot
/dev/sda1       2.0G  149M  1.9G   8% /mnt

umount /mnt

新分区出来的 partition (连同 superblock(超级块位于文件系统的开头,通常在文件系统创建时分配在特定位置,包含文件系统的基本信息,如文件系统的大小、空闲空间、inode 计数器、块大小等), boot sector(引导扇区,MBR), meta data(元数据散布在文件系统内的各个位置)) 不需要经过格式化,因为 dd 可以将原本旧的 partition 上面,将 sector 表面的数据整个复制过来

想要 创建两颗一模一样的磁盘时, 只要下达类似: dd if=/dev/sda of=/dev/sdb ,就能够 让两颗磁盘一模一样,甚至 /dev/sdb 不需要分区与格式化, 因为该指令可以将 /dev/sda 内的所有数据,包括 MBR 与 partition table(分区表是 MBR 的一部分) 也复制到 /dev/sdb

6.2 cpio

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

cpio -ovcB  > [file|device]  # 备份
cpio -ivcdu < [file|device]  # 还原
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 方式储存

因为 cpio 会 将数据整个显示到屏幕上,因此 可以通过将这些屏幕的数据重新导向 (>) 一个新的文件。还原 就是将备份文件读进来 cpio (<) 进行处理

找出 /boot 下面的所有文件,然后将他备份到 /tmp/boot.cpio
解压缩时的问题:如果归档文件中包含绝对路径(如 /boot/kernel.img),当你在解压缩归档文件时,它将尝试将文件提取到绝对路径中。如果提取到根文件系统(/),可能会覆盖系统中重要的文件。这种行为在系统中非常危险,可能导致系统损坏
cd / # cpio 不会理会 给的是绝对路径还是相对路径的文件名,所以如果加上绝对路径的 / 开头, 那么未来解开的时候,就一定会覆盖掉原本的 /boot
find boot | cpio -ocvB > /tmp/boot.cpio
ll -h /tmp/boot.cpio
-rw-r--r--. 1 root root 108M Jul  3 00:05 /tmp/boot.cpio
file /tmp/boot.cpio
/tmp/boot.cpio: ASCII cpio archive (SVR4 with no CRC)
将刚刚的文件给他在 /root/ 目录下解开
cd ~
cpio -idvc < /tmp/boot.cpio
ll /root/boot

cpio 可以将系统的数据完整的备份到磁带机上

备份:
find / | cpio -ocvB > /dev/st0
还原:
cpio -idvc < /dev/st0
# 先来看看该文件是属于什么文件格式,然后再加以处理:
file /boot/initramfs-3.10.0-229.el7.x86_64.img
/boot/initramfs-3.10.0-229.el7.x86_64.img: ASCII cpio archive (SVR4 with no CRC)

mkdir /tmp/initramfs
cd /tmp/initramfs
cpio -idvc > /boot/initramfs-3.10.0-229.el7.x86_64.img
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
early_cpio
22 blocks
# 将这个文件解开
  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值