dd 命令详解

| 选择喜欢的代码风格  

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

dd 命令安装:


-bash: dd: command not found

#Debian
apt-get install coreutils

#Ubuntu
apt-get install coreutils

#Alpine
apk add man

#Arch Linux
pacman -S coreutils
 
#Kali Linux
apt-get install coreutils

#CentOS
yum install coreutils

#Fedora
dnf install coreutils

#OS X
brew install coreutils

#Raspbian
apt-get install coreutils

#Docker
docker run cmd.cat/dd dd

dd 命令补充说明:


dd 命令用于复制文件并对原文件的内容进行转换和格式化处理。dd 命令功能很强大的,对于一些比较底层的问题,使用 dd 命令往往可以得到出人意料的效果。用的比较多的还是用 dd 来备份裸设备。但是不推荐,如果需要备份 oracle 裸设备,可以使用 rman 备份,或使用第三方软件备份,使用 dd 的话,管理起来不太方便。

建议在有需要的时候使用 dd 对物理磁盘操作,如果是文件系统的话还是使用 tar backup cpio 等其他命令更加方便。另外,使用 dd 对磁盘操作时,最好使用块设备文件。

dd 命令语法:


dd [OPERAND]...
dd OPTION

dd 命令选项:


if=文件名:输入文件名,默认为标准输入。即指定源文件。
of=文件名:输出文件名,默认为标准输出。即指定目的文件。
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
conv=<关键字>,关键字可以有以下11种:
    conversion:用指定的参数转换文件。
    ascii:转换ebcdic为ascii
    ebcdic:转换ascii为ebcdic
    ibm:转换ascii为alternate ebcdic
    block:把每一行转换为长度为cbs,不足部分用空格填充
    unblock:使每一行的长度都为cbs,不足部分用空格填充
    lcase:把大写字符转换为小写字符
    ucase:把小写字符转换为大写字符
    swab:交换输入的每对字节
    noerror:出错时不停止
    notrunc:不截短输出文件
    sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
--help:显示帮助信息
--version:显示版本信息

dd 命令选项数值后缀(块大小可以使用的计量单位表):


BLOCKS 和 BYTES 后面可以跟以下乘法后缀:

c = 1
w = 2
b = 512
kB = 1000
K = 1024
MB = 1000 * 1000
M = 1024 * 1024
xM = M
GB = 1000 * 1000 * 1000
G = 1024 * 1024 * 1024

依次为T(TB),P(PB),E(exabyte),Z(zettabytes)和Y(yottabytes)。

dd 命令的坑:


警告

谨慎使用 dd ———— 使用不当或输入错误的值可能会无意间擦除,破坏或覆盖硬盘驱动器上的数据。

dd 命令实例


从计算机中的 CD 创建 ISO 光盘映像。

dd if=/dev/sr0 of=/home/hope/exampleCD.iso bs=2048 conv=noerror,sync

创建 /dev/sda 硬盘驱动器的 img 文件。 要还原该映像,请输入:dd if=disk1.img of=/dev/sda

dd if=/dev/sda of=~/disk1.img

将内容从 if= drive /dev/sda 复制到 of= drive /dev/sdb

dd if=/dev/sda of=/dev/sdb

dd 命令其他示例:

[root@localhost text]# dd if=/dev/zero of=sun.txt bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s

[root@localhost text]# du -sh sun.txt 
1.1M    sun.txt

该命令创建了一个 1M 大小的文件 sun.txt,其中参数解释:

  • if 代表输入文件。如果不指定 if,默认就会从 stdin 中读取输入。
  • of 代表输出文件。如果不指定 of,默认就会将 stdout 作为默认输出。
  • bs 代表字节为单位的块大小。
  • count 代表被复制的块数。
  • /dev/zero 是一个字符设备,会不断返回 0 值字节(\0)。

块大小可以使用的计量单位表如本文上面显示 dd 命令数值后缀换算关系,以上命令可以看出 dd 命令来测试内存操作速度:

1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s

dd 命令,生成随机字符串

我们甚至可以使用 /dev/urandom 设备配合 dd 命令 来获取随机字符串:

[www@CommandNotFound /]$ dd if=/dev/urandom bs=1 count=15|base64 -w 0
15+0 records in
15+0 records out
15 bytes (15 B) copied, 0.000143231 s, 105 kB/s

y38aC+sFYmsejdDQUvs8

还有一种情况,比如在配置很低的服务器上编译 make (1G 内存) PHP 7.4.X 的时候,可能会遇到 virtual memory exhausted: Cannot allocate memory,先用 free 命令 查看:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:            991         176         372           0         442         673
Swap:             0           0           0

可以按下面方式设置 swap 大小来解决:

mkdir /opt/images
rm -rf /opt/images/swap #如果有

接下来,用 dd 命令:

$ dd if=/dev/zero of=/opt/images/swap bs=1024 count=2048000
2048000+0 records in
2048000+0 records out
2097152000 bytes (2.1 GB) copied, 5.99634 s, 350 MB/s

#继续执行,用 mkswap 和 swapon 命令:
[root@CommandNotFound /opt/images]
$ mkswap /opt/images/swap
Setting up swapspace version 1, size = 2047996 KiB
no label, UUID=96aa2fe9-1ffe-418d-8bd6-1354b0fc229a


[root@CommandNotFound /opt/images]
$ swapon /opt/images/swap
swapon: /opt/images/swap: insecure permissions 0644, 0600 suggested.

此时再 free -m 可以看到已经设置了 swap,使用完毕后,可以关掉 swap:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:            991         177          76           0         736         669
Swap:          1999           0        1999

$ swapoff swap
$ rm -f /opt/images/swap  #swap文件也可以不删除,留着以后使用,关键是你的虚拟机硬盘够用

dd 命令扩展阅读:




dd 命令评论