如何在 Linux 中使用 dd 命令?

dd 命令 是一种将文件从一个位置复制和转换到另一个位置的实用程序。 有趣的是,它代表“复制和转换”,但由于名称 cc 已经被 C 编译器采用,它被命名为 ‘dd‘。 自从 dd 直接与磁盘的扇区交互,它是一个潜在的 危险命令 并且应极其谨慎地使用。

dd 命令的基本用法

dd 命令默认从标准输入读取并写入标准输出。 这可以使用 ifof 选项。 if 指定输入文件和 of 指定输出文件:

$ dd if=<input-file-name> of=<output-file-name> 

别跑 dd 如果你不确定该放什么 if 或者 of. (dd 臭名昭著的磁盘破坏者。)

一些有用的选项:

选项 解释
bs=BYTES 定义块大小/数量 BYTES 一次读取或写入。 (默认值 = 512)
计数=N 指定仅 N 应复制的块数。
conv=sync,noerror noerror 指示 dd 如果有错误,继续前进 sync 如果出现读取错误,则指示 dd 用 NUL 填充输入块。
status=progress 可在 dd v8.24 及更新版本,显示操作进度。
(去检查 dd的版本,类型 $ dd --version )

注意:要使用的最佳块大小取决于底层存储介质。 一般来说,更大的块大小意味着更快的读取和写入。

使用 dd 可以做的实际事情

让我们在这里回顾一下 dd 命令的一些实际应用。

1. 克隆整个驱动器/分区

这是 dd 命令最流行的用途之一。 您可以使用 fdisk 命令:

$ sudo fdisk -l 
NVMe 分区
Sata SSD 分区

注意:上面显示的分区(对于 2 个 SSD、一个 NVMe 和其他 SATA)可能与您系统上的不同。

要克隆分区类型:

$ sudo dd if=/dev/sda of=/dev/sdb bs=64M conv=noerror status=progress 

此命令克隆整个 /dev/sda/dev/sdb 一次读取和写入 64 MiB,如果读取块时出现任何错误,它将继续克隆。 这 of 选项通常是一个外部空硬盘(/dev/sdb 在这种情况下)。

2. 创建分区的压缩备份

有时克隆分区可能是一个太大的过程。 您可能希望创建压缩备份以减少空间。 dd 当与 gzip 命令一起使用时,可以做到这一点:

$ sudo dd if=/dev/sda conv=sync,noerror status=progress | gzip -c > sda_backup.tar.gz 

由于没有 of 选项,dd 会写 /dev/sdastdout. | (管道字符)只是重定向 stdoutddstdingzip. -c 选项规定 gzip 将存档写入 stdout 然后被重定向到 tar.gz 文件。

如果你有,你甚至可以在远程机器上备份 ssh 访问那台机器,你有 ssh 在您的机器上设置。 很可能远程机器已经有 ssh. 要在本地系统上安装它,请遵循本教程。

要在远程机器上备份,请在本地机器上键入:

$ sudo dd if=/dev/sda bs=1M conv=sync,noerror status=progress | gzip -c | ssh [email protected]_machine 'cat > backup.tar.gz' 

Enter 您的密码和瞧,远程备份开始。

远程备份远程备份

在上面的屏幕截图中,我从远程机器上的本地机器创建了随机 40 Mib(或 42MB)的备份 ssh.

使用 ls 命令列出远程机器上的内容:

远程机器上的lsls 在远程机器上

现在而不是写信给 gzipstdout 备份被流式传输到远程服务器的 stdin 这是由 cat 命令读取的。

没有任何选项的 cat 命令只写入 stdout 它读什么形式 stdin. 重定向 stdout.tar.gz 文件的作用是 cat 命令读取备份并将其写入 .tar.gz 文件。

3. 创建一个可启动的 USB 驱动器

您甚至可以使用以下方法创建可启动的 USB 驱动器 dd. 你需要 .iso 为此,您的操作系统的文件。

需要先卸载U盘. 卸载类型:

$ sudo umount /dev/<usb_drive_partition> 

要列出 USB 驱动器的分区,请使用 fdisk -l 或使用 lsblk 命令:

$ sudo lsblk 
lsblk 输出lsblk 输出

现在驱动器已卸载,我们可以用它创建一个可引导的驱动器。 在这里,我将创建一个可引导的驱动器 /dev/sdb 使用 Ubuntu 20.04:

$ sudo dd if=~/Downloads/ubuntu-20.04.1-desktop-amd64.iso of=/dev/sdb bs=64M status=progress 

/dev/sdb 现在是一个可引导的驱动器。

4. 使用 dd 命令擦除驱动器

可以通过使用 0 或随机数据覆盖来擦除驱动器 dd. 在这里,我将擦拭 /dev/sdb 驾驶。 绝对确定您要输入哪个驱动器 of 选项.

用 0 的类型覆盖:

$ dd if=/dev/zero of=/dev/sdb bs=1M status=progress 

/dev/zero 是一种特殊设备,它提供与从中读取的一样多的空字符(ASCII NUL,0x00)。 它会覆盖 /dev/sda 0 有擦掉的效果。

要通过用随机数据覆盖驱动器来擦除驱动器,请键入:

$ dd if=/dev/urandom of=/dev/sdb bs=1M status=progress 

/dev/urandom 也是一种可以读取随机数据的特殊设备。

5. 将文件转换为大写

这是一个晦涩的用法 dd. 然而有趣的是 dd 这个也可以!

$ dd if=file of=new_file conv=ucase 
Dd 文件大写dd 将文件转换为大写

结论

在这篇文章中,我们学习了如何使用 dd. dd 是一个非常有用的命令,尽管如果使用不当会很危险。 要了解更多关于 dd 命令,查看其手册页。