显示行号
|
选择喜欢的代码风格
默认
GitHub
Dune
LakeSide
Plateau
Vibrant
Blue
Eighties
Tranquil
dd 命令根据指定的操作复制文件,并转换过程中的数据格式,对原文件的内容进行转换和格式化处理。
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 命令评论