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

还有一些很好用的工具得要跟大家介绍介绍,尤其是 dd 这个玩意儿呢!

8.6.1 dd

我们在[第七章当中的特殊 loop 设备挂载时]使用过 dd 这个指令对吧? 不过,这个指令可不只是制作一个文件而已喔~这个 dd 指令最大的功效,鸟哥认为,应该是在于“备份”啊! 因为 dd 可以读取磁盘设备的内容(几乎是直接读取扇区"sector"),然后将整个设备备份成一个文件呢!真的是相当的好用啊~ 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 的意思。

范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中
[root@study ~]# 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 这个指令啦~

范例二:将刚刚烧录的光驱的内容,再次的备份下来成为图像挡
[root@study ~]# 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 磁盘中
[root@study ~]# lsblk /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda    8:0    0   2G  0 disk             # 确实是 disk 而且有 2GB 喔!

[root@study ~]# dd if=/tmp/system.iso of=/dev/sda
[root@study ~]# mount /dev/sda /mnt
[root@study ~]# 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 备份下来
[root@study ~]# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2      1014M  149M  866M  15% /boot       # 请注意!备份的容量会到 1G 喔!
[root@study ~]# dd if=/dev/vda2 of=/tmp/vda2.img
[root@study ~]# ll -h /tmp/vda2.img
-rw-r--r--. 1 root root 1.0G Jul  2 23:39 /tmp/vda2.img
# 等于是将整个 /dev/vda2 通通捉下来的意思~所以,文件大小会跟整颗磁盘的最大量一样大!

其实使用 dd 来备份是莫可奈何的情况,很笨耶!因为默认 dd 是一个一个扇区去读/写的,而且即使没有用到的扇区也会倍写入备份文件中! 因此这个文件会变得跟原本的磁盘一模一样大!不像使用 xfsdump 只备份文件系统中有使用到的部份。不过, dd 就是因为不理会文件系统, 单纯有啥纪录啥,因此不论该磁盘内的文件系统你是否认识,它都可以备份、还原的!所以,鸟哥认为,上述的第三个案例是比较重要的学习喔!

例题:你想要将你的 /dev/vda2 进行完整的复制到另一个 partition 上,请使用你的系统上面未分区完毕的容量再创建一个与 /dev/vda2 差不多大小的分区 (只能比 /dev/vda2 大,不能比他小!),然后将之进行完整的复制 (包括需要复制 boot sector 的区块)。答:因为我们的 /dev/sda 也是个测试的 USB 磁盘,可以随意恶搞!我们刚刚也才测试过将光盘镜像文件给它复制进去而已。 现在,请你分区 /dev/sda1 出来,然后将 /dev/vda2 完整的拷贝进去 /dev/sda1 吧!

非常有趣的范例吧!新分区出来的 partition 不需要经过格式化,因为 dd 可以将原本旧的 partition 上面,将 sector 表面的数据整个复制过来! 当然连同 superblock, boot sector, meta data 等等通通也会复制过来!是否很有趣呢?未来你想要创建两颗一模一样的磁盘时, 只要下达类似: dd if=/dev/sda of=/dev/sdb ,就能够让两颗磁盘一模一样,甚至 /dev/sdb 不需要分区与格式化, 因为该指令可以将 /dev/sda 内的所有数据,包括 MBR 与 partition table 也复制到 /dev/sdb 说! ^_^

话说,用 dd 来处理这方面的事情真的是很方便,你也不需考虑到啥有的没的,通通是磁盘表面的复制而已!不过如果真的用在文件系统上面, 例如上面这个案例,那么再次挂载时,恐怕得要理解一下每种文件系统的挂载要求!以上面的案例来说,你就得要先清除 XFS 文件系统内的 log 之后, 重新给予一个跟原本不一样的 UUID 后,才能够顺利挂载!同时,为了让系统继续利用后续没有用到的磁盘空间,那个 xfs_growfs 就得要理解一下。 关于 xfs_growfs 我们会在后续第十四章继续强调!这里先理解即可。

8.6.2 cpio

这个指令挺有趣的,因为 cpio 可以备份任何东西,包括设备设备文件。不过 cpio 有个大问题, 那就是 cpio 不会主动的去找文件来备份!啊!那怎办?所以啰,一般来说, cpio 得要配合类似 [find] 等可以找到文件名的指令来告知 cpio 该被备份的数据在哪里啊! 有点小麻烦啦~因为牵涉到我们在第三篇才会谈到的[数据流重导向]说~ 所以这里你就先背一下语法,等到第三篇讲完你就知道如何使用 cpio 啰!

你应该会发现一件事情,就是上述的选项与指令中怎么会没有指定需要备份的数据呢?还有那个大于 (>) 与小于 (<) 符号是怎么回事啊?因为 cpio 会将数据整个显示到屏幕上,因此我们可以通过将这些屏幕的数据重新导向 (>) 一个新的文件! 至于还原呢?就是将备份文件读进来 cpio (<) 进行处理之意!我们来进行几个案例你就知道啥是啥了!

我们使用 find boot 可以找出文件名,然后通过那条管线 (|, 亦即键盘上的 shift+\ 的组合), 就能将文件名传给 cpio 来进行处理!最终会得到 /tmp/boot.cpio 那个文件喔!你可能会觉得奇怪,为啥鸟哥要先转换目录到 / 再去找 boot 呢? 为何不能直接找 /boot 呢?这是因为 cpio 很笨!它不会理会你给的是绝对路径还是相对路径的文件名,所以如果你加上绝对路径的 / 开头, 那么未来解开的时候,它就一定会覆盖掉原本的 /boot 耶!那就太危险了!这个我们在 tar 也稍微讲过那个 -P 的选项!!理解吧! 好了,那接下来让我们来进行解压缩看看。

事实上 cpio 可以将系统的数据完整的备份到磁带机上头去喔!如果你有磁带机的话!

  • 备份:find / | cpio -ocvB > /dev/st0

  • 还原:cpio -idvc < /dev/st0

这个 cpio 好像不怎么好用呦!但是,他可是备份的时候的一项利器呢!因为他可以备份任何的文件, 包括 /dev 下面的任何设备文件!所以他可是相当重要的呢!而由于 cpio 必需要配合其他的程序,例如 find 来创建文件名,所以 cpio 与管线命令及数据流重导向的相关性就相当的重要了!

其实系统里面已经含有一个使用 cpio 创建的文件喔!那就是 /boot/initramfs-xxx 这个文件啦!现在让我们来将这个文件解压缩看看,看你能不能发现该文件的内容为何?

Last updated