dd
命令在 Unix 系统上进行数据复制和迁移的方法。它通过指定源文件和目标文件,将数据从一个位置复制到另一个位置,常用于磁盘克隆或备份。
dd
是Linux/Unix下的一个非常有用的命令,其作用是将指定大小的输入文件(或设备文件)按block为单位拷贝到指定的输出文件(或设备文件)中,并在拷贝的同时进行指定的转换,当不指定转换选项时,使用指定的输入和输出块大小来复制文件(默认是从标准输入到标准输出)。dd
每次从输入文件或设备文件读取指定大小的一个块(默认是512字节),如果使用bs=bytes
选项,将把全部读到的数据写到独立的输出块,这个输出块的长度和读到的数据完全一样,除非指定使用sync
选项转换。
if=FILE:指定输入文件的名称,缺省为标准输入。
of=FILE:指定输出文件的名称,缺省是标准输出。
bs=BYTES:指定输入输出块的大小,取代ibs
和obs
标志,由bs
标志指定的块大小值必须始终是使用的媒介物理块大小的整数倍。
cbs=BYTES:指定由可变长度到固定长度和从固定长度到可变长度的转换块大小。
conv=CONVERSION[,CONVERSION]…:指定一个或多个转换选项,多个转换之间用逗号隔开。
count=BLOCKS:仅复制由BLOCKS
变量指定的输入块的数量。
ibs=BYTES:指定输入块的大小;缺省为512字节。
obs=BYTES:指定输出块的大小;缺省为512字节。
seek=BLOCKS:在复制之前,从输出文件开头跳过BLOCKS
值的块大小,每块大小为obs-byte
字节。
skip= BLOCKS:在开始复制之前跳过指定的BLOCKS
值的输入块,每块大小为ibs-byte
字节。
数字值选项:BLOCKS
和BYTES
后面可以跟一个乘数:c =1
,w =2
,b =512
,kB =1000
,K =1024
,MB =10001000
,M =10241024
,xM =M
,GB =100010001000
,G =102410241024
等等,同理可得T
,P
,E
,Z
,Y
。
block:将变长记录转换到固定长度,长度由转换块大小(cbs
)决定,对于换行用空格代替,必要时使用空格填充。
unblock:将固定长度的块转化为可变长度,长度由转换块大小(cbs
)决定,该选项与block
选项冲突。
lcase:将所有大写字符转换为小写字符。
nocreat:不创建输出文件;输出文件必须已经存在。
excl:如果输出文件已经存在则操作失败,该选项与nocreat
选项冲突。
notrunc:不截取输出文件。
ucase:把所有小写字符转换为大写字符。
swab:交换每对输入字节,对于GNU dd,如果读入的最后的字节数是奇数,则只是简单的复制到输出(因为没有能跟它交换的字节)。
noerror:发生错误时也不停止进程,继续进行。
sync:使用zero字节将每个输入块填充到ibs
值指定的长度,如果指定block
或者unblock
选项,则以空格补齐。
fdatasync:在复制结束之前,同步输出数据,改选项将会做物理写入操作。
fsync:在复制结束之前,同步输出数据和元数据,改选项将会做物理写入操作。
1、将本地的/dev/sdx
整盘备份到/dev/sdy
:
sudo dd if=/dev/sdx of=/dev/sdy
2、将/dev/sdx
全盘数据备份到指定路径的image文件:
sudo dd if=/dev/sdx of=/path/image
3、备份/dev/sdx
全盘数据,并利用gzip工具进行压缩,保存到指定路径:
sudo dd if=/dev/sdx | gzip > /path/image.gz
4、恢复备份:
将备份文件恢复到指定盘:
sudo dd if=/path/image of=/dev/sdx
将压缩的备份文件恢复到指定盘:
gzip -dc /path/image.gz | sudo dd of=/dev/sdx
1、备份磁盘开始的512Byte大小的MBR信息到指定文件:
sudo dd if=/dev/sdx of=/path/file count=1 bs=512
2、恢复备份的MBR信息到磁盘开始部分:
sudo dd if=/path/file of=/dev/sdx
1、将软驱数据备份到当前目录的disk.img文件:
sudo dd if=/dev/fd0 of=disk.img count=1 bs=1440k
2、要使用36个512字节块来有效的实现向软盘的传输:
sudo dd if=filename of=/dev/fd0 bs=36b conv=sync
3、将块大小为720字节的输入文件复制到软盘当中:
sudo dd if=testfile of=/dev/fd0 bs=720b conv=sync
1、确认目标磁盘的大小和分区情况,确保目标磁盘空间足够容纳源磁盘的数据。
2、确认目标磁盘未挂载,如果已经挂载,需要先卸载。
3、将目标磁盘与源磁盘连接到同一台机器上,可以使用外接硬盘或者虚拟机等方式。
1、打开终端,确保你有足够的权限来执行dd
命令。
2、确定源磁盘的设备名,可以使用命令lsblk
或fdisk -l
来查看系统中的磁盘设备信息,通常情况下,源磁盘的设备名为/dev/sda
或/dev/nvme0n1
。
3、确定目标磁盘的设备名,同样使用上面提到的命令来查看目标磁盘的设备名。
4、使用以下命令进行系统迁移:
sudo dd if=/dev/[source-disk] of=/dev/[target-disk] bs=4M conv=sync status=progress
[source-disk]
是源磁盘的设备名,[target-disk]
是目标磁盘的设备名。bs=4M
表示使用4MB的块大小进行拷贝,conv=sync
表示在每个块拷贝之后进行同步操作以确保数据完整性,status=progress
表示显示拷贝进度。
5、等待dd
命令完成拷贝操作,这可能需要一段时间取决于系统的大小和硬件性能。
6、系统迁移后的操作:
如果源磁盘和目标磁盘是相同大小的,迁移后你可以直接将目标磁盘连接到原来的机器上,启动系统即可。
如果目标磁盘比源磁盘大,你可以使用分区工具(如fdisk
、parted
等)来扩展目标磁盘的分区。
如果目标磁盘比源磁盘小,可能需要进行额外的操作,如缩小分区等,在这种情况下,建议先进行数据备份再进行操作,以免丢失数据。
Q1: dd命令中的if和of参数分别代表什么?
A1:if
参数指定输入文件或设备的名称,即源数据所在的位置;of
参数指定输出文件或设备的名称,即目标数据的存放位置,在命令dd if=/dev/sda of=/dev/sdb
中,/dev/sda
是源磁盘,/dev/sdb
是目标磁盘。
Q2: 使用dd命令进行数据迁移时,如何确保数据的完整性?
A2: 为了确保数据的完整性,可以在使用dd
命令时添加conv=sync
选项,这个选项会在每个块拷贝之后进行同步操作,确保数据被正确地写入到目标设备中,还可以在拷贝完成后验证数据的一致性,例如通过比较源数据和目标数据的哈希值或其他校验和来确认数据是否完整且未损坏。