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

# dd

在前面 第七章中特殊 loop 装置挂载时使用过 dd 这个指令,dd 指令不只是制作一个文件,它最大的功效可能就是备份了,因为 dd 可以读取磁盘装置的内容(几乎是直接读取扇区 sector),然后将装置备份成一个文件,下面讲解几个比较重要的选项

dd if="input_file" of="output_file" bs="block_size" count="number"

if:输入文件,也可以是装置
of:输出文件,也可以是装置
bs:规划一个 block 的大小,若未指定则预设为 512bytes(一个 sector 大小)
count:多少个 bs
1
2
3
4
5
6

实践与练习

# 将 /etc/passwd 备份到 /tmp/passwd.back 中
[root@study ~]# dd if=/etc/passwd of=/tmp/passwd.back
记录了4+1 的读入
记录了4+1 的写出
2323字节(2.3 kB)已复制,0.000202909 秒,11.4 MB/秒
[root@study ~]# ll /tmp/passwd.back /etc/passwd
-rw-r--r--. 1 root root 2323 104 18:31 /etc/passwd
-rw-r--r--. 1 root root 2323 1029 09:37 /tmp/passwd.back
# /etc/passwd 文件为 2323bytes
# 没有设置 bs,默认为 512bytes,4+1 表示有 4 个完整的 512bytes
# 以及一个未满 512bytes 的 block

# 将刚刚刻录的光驱内容,再次备份下来称为映像文档
 [root@study ~]# dd if=/dev/sr0 of=/tmp/system.iso
记录了150708+0 的读入
记录了150708+0 的写出
77162496字节(77 MB)已复制,0.503923 秒,153 MB/秒
[root@study ~]# ll /tmp/system.iso 
-rw-r--r--. 1 root root 77162496 1029 09:41 /tmp/system.iso
[root@study ~]# mount /tmp/system.iso /mnt/
mount: /dev/loop1 写保护,将以只读方式挂载
[root@study ~]# ll /mnt/
总用量 62742
-r--r--r--. 1 root root      763 122 2019 AUTORUN.INF
-r-xr-xr-x. 1 root root     6384 712 17:06 autorun.sh
dr-xr-xr-x. 2 root root      792 712 17:13 cert
dr-xr-xr-x. 2 root root     1824 712 17:13 NT3x
dr-xr-xr-x. 2 root root     2652 712 17:13 OS2
-r-xr-xr-x. 1 root root     4821 712 17:06 runasroot.sh
-r--r--r--. 1 root root      547 712 17:13 TRANS.TBL
-r--r--r--. 1 root root  3731646 712 17:05 VBoxDarwinAdditions.pkg
-r--r--r--. 1 root root     3949 712 17:05 VBoxDarwinAdditionsUninstall.tool
-r-xr-xr-x. 1 root root  8601012 712 17:07 VBoxLinuxAdditions.run
-r--r--r--. 1 root root 16584704 712 17:07 VBoxSolarisAdditions.pkg
-r-xr-xr-x. 1 root root 22909888 712 17:12 VBoxWindowsAdditions-amd64.exe
-r-xr-xr-x. 1 root root   270104 712 17:07 VBoxWindowsAdditions.exe
-r-xr-xr-x. 1 root root 12125152 712 17:09 VBoxWindowsAdditions-x86.exe     
[root@study ~]# umount /mnt/
# 本来是虚拟机,不应该有内容的把。看下文件内容,应该就是虚拟机的工具之类的
[root@study ~]# ll /dev/sr0 
brw-rw----+ 1 root cdrom 11, 0 1028 21:38 /dev/sr0
[root@study ~]# mount /dev/sr0 /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@study ~]# ll /mnt/
总用量 62742
-r--r--r--. 1 root root      763 122 2019 AUTORUN.INF
-r-xr-xr-x. 1 root root     6384 712 17:06 autorun.sh
dr-xr-xr-x. 2 root root      792 712 17:13 cert
dr-xr-xr-x. 2 root root     1824 712 17:13 NT3x
dr-xr-xr-x. 2 root root     2652 712 17:13 OS2
-r-xr-xr-x. 1 root root     4821 712 17:06 runasroot.sh
-r--r--r--. 1 root root      547 712 17:13 TRANS.TBL
-r--r--r--. 1 root root  3731646 712 17:05 VBoxDarwinAdditions.pkg
-r--r--r--. 1 root root     3949 712 17:05 VBoxDarwinAdditionsUninstall.tool
-r-xr-xr-x. 1 root root  8601012 712 17:07 VBoxLinuxAdditions.run
-r--r--r--. 1 root root 16584704 712 17:07 VBoxSolarisAdditions.pkg
-r-xr-xr-x. 1 root root 22909888 712 17:12 VBoxWindowsAdditions-amd64.exe
-r-xr-xr-x. 1 root root   270104 712 17:07 VBoxWindowsAdditions.exe
-r-xr-xr-x. 1 root root 12125152 712 17:09 VBoxWindowsAdditions-x86.exe

# 这个实例是直接记录步骤,笔者没有 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 

dd if=/tmp/system.iso of=/dev/sda
mount /dev/sda /mnt
ll /mnt
# 有一个小技巧,可以使用这里的 dd 将 iso 文件写入 USB 磁盘
# 那么久会变成可开机光盘一样的功能,可以让你用 USB 来安装 linux ,速度快很多(因为 DVD 刻录很慢)

# 将你的 /boot 整个文件系统通过 dd 备份下来
[root@study ~]# df -h /boot/
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda2      1014M  181M  834M   18% /boot
[root@study ~]# dd if=/dev/sda2 of=/tmp/sda2.img
记录了2097152+0 的读入
记录了2097152+0 的写出
1073741824字节(1.1 GB)已复制,5.96824 秒,180 MB/秒
[root@study ~]# ll -h /tmp/sda2.img 
-rw-r--r--. 1 root root 1.0G 1029 09:52 /tmp/sda2.img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

使用 dd 来备份是无可奈何的情况,因为默认 dd 是一个一个扇区去读写的,而且即使没有用到的扇区也会写入备份档中,因此整个文件会变得与磁盘一模一样大。缺点即优点,因此不管是什么类容都可以备份和还原

# cpio

cpio 可以备份任何东西,包括装置设备文件。不过 cpio 有个大问题,不会主动找文件,被动接收,所以需要配合类似 find 等可以找到文件名的指令来使用,因此涉及到了后续才会讲解的数据流重导向。

这里如果不明白什么是数据流重导向,那么后续学习之后再回过头来看这里

备份:cpio -ovcB > [file|device]
还原:cpio -ivcdu < [file|device]
查看:cpio -ivct < [file|device]
1
2
3

备份选项参数:

  • o:将数据 copy 输出到文件或装置上
  • B:让预设的 Blocks 可以增加至 5120bytes(预设是 512bytes),好处是:可以让大文件的存储速度加快许多(请参考 i-nodes 概念)

还原选项参数:

  • i:将数据从文件或装置中 copy 出来
  • d:自动建立目录,使用 cpio 所备份的数据内容不见得会在同一层目录中,因此必须要让 cpio 在还原时可以建立新目录
  • u:自动的将较新的文件覆盖旧文件
  • t:需要配合 -i 使用,可以用在查看以 cpio 建立的文件或装置的内容

一些共享选项参数:

  • v:输出处理的文件名
  • c:一种较新的 portable format 方式存储

实践练习:

# 找出 /boot 下的所有文件,将其备份到 /tmp/boot.cpio 
[root@study ~]# cd /
[root@study /]# find boot -print
boot
boot/efi
boot/efi/EFI
boot/efi/EFI/centos
boot/efi/EFI/centos/fw
....
# 通过 find 可以找到 boot 下存在的文件名包括文件与目录,但请千万不要是绝对路径
# 如果是绝对路径,和之前解压缩时类似的问题

# 这里就看明白了,上面语法中其实是没有指定需要备份的文件有哪些的
# 这里使用管道符号把 find boot 找到的文件名传递给了后续的 cpio 处理
[root@study /]# find boot | cpio -ocvB > /tmp/boot.cpio
[root@study /]# ll -h /tmp/boot.cpio 
-rw-r--r--. 1 root root 147M 1029 10:29 /tmp/boot.cpio
[root@study /]# file /tmp/boot.cpio 
/tmp/boot.cpio: ASCII cpio archive (SVR4 with no CRC)

# 将刚刚的文件在 /root 目录下解开
[root@study /]# cd ~
[root@study ~]# cpio -idvc < /tmp/boot.cpio 
[root@study ~]# ll /root/boot/
总用量 135200
-rw-r--r--. 1 root root   152976 1029 10:31 config-3.10.0-1062.el7.x86_64
drwx------. 3 root root       17 1029 10:31 efi
drwxr-xr-x. 2 root root       27 1029 10:31 grub
drwx------. 5 root root       97 1029 10:31 grub2
-rw-------. 1 root root 78606868 1029 10:31 initramfs-0-rescue-f228ab37c368416c84c6b27971ba45a9.img
-rw-------. 1 root root 31799826 1029 10:31 initramfs-3.10.0-1062.el7.x86_64.img
-rw-r--r--. 1 root root   318717 1029 10:31 symvers-3.10.0-1062.el7.x86_64.gz
-rw-------. 1 root root  3594971 1029 10:31 System.map-3.10.0-1062.el7.x86_64
-rw-r--r--. 1 root root 10485760 1029 10:31 testing.img
-rwxr-xr-x. 1 root root  6734016 1029 10:31 vmlinuz-0-rescue-f228ab37c368416c84c6b27971ba45a9
-rwxr-xr-x. 1 root root  6734016 1029 10:31 vmlinuz-3.10.0-1062.el7.x86_64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

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

  • 备份:find / | cpio -ocvB > /dev/st0
  • 还原:cpio -idvc < /dev/sto

虽然 cpio 不是特别的方便,但是备份可是利器,因为可以备份任何文件,包括 /dev/ 下的任何装置文件

其实系统中有一个使用 cpio 建立的文件 /boot/initramfs-xxx ,现在来解开他看看

# 先看下属于什么文件格式
[root@study ~]# file /boot/initramfs-3.10.0-1062.el7.x86_64.img 
/boot/initramfs-3.10.0-1062.el7.x86_64.img: gzip compressed data, from Unix, last modified: Fri Oct  4 18:31:46 2019, max compression

# 完了,笔者的系统比书上的新,已经不是 cpio 的了
# 那么下面只记录下解开步骤
mkdir /tmp/initramfs
cd /tmp/initramfs
cpio -idvc < /boot/initramfs-xx/img
1
2
3
4
5
6
7
8
9