在Linux中可以使用dd命令进行数据备份。dd命令可以对文件(包括设备)的内容导入导出,导出数据后,原文件(或设备)的内容不会被删除或改变。用这种方式可实现任何文件(设备)到其他任何文件(设备)的数据导出,实现备份的目的。
格式如下:
dd if=源文件/设备 of=目标文件/设备 bs=每次操作的数据量 count=操作次数
其中的bs和count可以省略,省略后采用默认值。bs默认值是512字节,count默认值和源文件大小有关。
举例如下。
①dd if=f1 of=f2:把f1文件导入到f2中,相当于将文件f1复制为文件f2。相关操作如下:
[root@file01 ~]# cd /mnt [root@file01 mnt]# cp /etc/sudoers ./f1 [root@file01 mnt]# ls f1 hgfs [root@file01 mnt]# dd if=f1 of=f2 记录了8+1 的读入 记录了8+1 的写出 4328字节(4.3 kB)已复制,0.000566382 秒,7.6 MB/秒 [root@file01 mnt]# ls -l 总用量 16 -r--r----- 1 root root 4328 8月 2 10:11 f1 -rw-r--r-- 1 root root 4328 8月 2 10:12 f2 drwxr-xr-x 2 root root 6 11月 6 2020 hgfs |
②dd if=f1 of=f2 bs=1 count=3:把f1文件导入到f2中,每次导入1字节,导入3次。相关操作如下:
[root@file01 mnt]# dd if=f1 of=f2 bs=1 count=3 记录了3+0 的读入 记录了3+0 的写出 3字节(3 B)已复制,0.000652474 秒,4.6 kB/秒 [root@file01 mnt]# cat f2 ## [root@file01 mnt]# |
③dd if=/dev/sda1 of=/mnt/f1:把sda1分区的数据导入到f1中,相当于用文件存储整个分区数据。相关操作如下:
[root@file01 mnt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos_mini7-root 253:0 0 17G 0 lvm / └─centos_mini7-swap 253:1 0 2G 0 lvm [SWAP] loop0 7:0 0 32.6M 0 loop /media [root@file01 mnt]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 devtmpfs devtmpfs 475M 0 475M 0% /dev tmpfs tmpfs 487M 0 487M 0% /dev/shm tmpfs tmpfs 487M 14M 473M 3% /run tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup /dev/mapper/centos_mini7-root xfs 17G 3.1G 14G 18% / /dev/sda1 xfs 1014M 229M 786M 23% /boot tmpfs tmpfs 98M 0 98M 0% /run/user/0 /dev/loop0 iso9660 33M 33M 0 100% /media [root@file01 mnt]# dd if=/dev/sda1 of=/mnt/f1 记录了2097152+0 的读入 记录了2097152+0 的写出 1073741824字节(1.1 GB)已复制,8.7408 秒,123 MB/秒 [root@file01 mnt]# ls -lh f1 -r--r----- 1 root root 1.0G 8月 2 10:30 f1 |
④dd if=/dev/sda1 of=/dev/sdb1:把sda1分区的数据导入到sdb1中,相当于拷贝整个分区。
[root@file01 ~]# sfdisk -d /dev/sda|sfdisk /dev/sdb Checking that no-one is using this disk right now ... OK Disk /dev/sdb: 2610 cylinders, 255 heads, 63 sectors/track Old situation: Units: cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System /dev/sdb1 * 0+ 130- 131- 1048576 83 Linux /dev/sdb2 130+ 2610- 2481- 19921920 8e Linux LVM /dev/sdb3 0 - 0 0 0 空 /dev/sdb4 0 - 0 0 0 空 New situation: Units: sectors of 512 bytes, counting from 0 Device Boot Start End #sectors Id System /dev/sdb1 * 2048 2099199 2097152 83 Linux /dev/sdb2 2099200 41943039 39843840 8e Linux LVM /dev/sdb3 0 - 0 0 空 /dev/sdb4 0 - 0 0 空 Warning: partition 1 does not end at a cylinder boundary Warning: partition 2 does not start at a cylinder boundary Warning: partition 2 does not end at a cylinder boundary Successfully wrote the new partition table |
Re-reading the partition table ... If you created or changed a DOS partition, /dev/foo7, say, then use dd(1) to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1 (See fdisk(8).) [root@file01 ~]# dd if=/dev/sda1 of=/dev/sdb1 记录了2097152+0 的读入 记录了2097152+0 的写出 1073741824字节(1.1 GB)已复制,19.7337 秒,54.4 MB/秒 |
⑤dd if=/dev/sda of=/dev/sdb:把sda磁盘的数据导入到sdb磁盘中,相当于拷贝整个磁盘。相关操作如下:
[root@file01 ~]# dd if=/dev/sda of=/dev/sdb 记录了41943040+0 的读入 记录了41943040+0 的写出 21474836480字节(21 GB)已复制,394.098 秒,54.5 MB/秒 |
⑥dd if=/dev/zero of=/mnt/f1 bs=100M count=5:把空字符导入到f1中,每次导入100M字节,导入5次,相当于创建一个500M的全都是空字符的文件。相关操作如下:
[root@file01 mnt]# ls -l f1 -r--r----- 1 root root 1073741824 8月 2 10:30 f1 [root@file01 mnt]# dd if=/dev/zero of=/mnt/f1 bs=100M count=5 记录了5+0 的读入 记录了5+0 的写出 524288000字节(524 MB)已复制,0.877345 秒,598 MB/秒 [root@file01 mnt]# ls -l f1 -r--r----- 1 root root 524288000 8月 2 11:00 f1 [root@file01 mnt]# strings f1|more [root@file01 mnt]# hexdump -C f1 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 1f400000 |
注意,/dev/zero并非是真正的设备或文件,类似于程序,功能是无限生成二进制的0,即空字符。
⑦dd if=/dev/zero of=/dev/sdb1 bs=100M count=1:把空字符导入到sdb2分区中,每次导入100M字节,导入1次,相当于擦除分区前100M空间,多用于分区无法格式化时,进行先擦除再格式化。此操作为危险操作,执行前确保分区/dev/sdb1中无重要数据。