一.dd命令用法
dd的作用是拷贝文件,从指定的来源,指定的方式进行文件创建、拷贝,过程中可以进行各种转换。dd可以很方便的验证各种IO表现,还可以用来进行整个盘/文件的复制。
dd的拷贝方式是数据块block级别的, 忽略文件系统类型和操作系统。
介绍下主要选项:
- bs=BYTES 一次读写BYTES个字节。是指定了block大小,默认512字节,跟扇区大小一致。
- 包括ibs/obs
- cbs=BYTES 一次转换BYTES个字节
- ibs=BYTES 一次读取的字节数,默认为512
- if=FILE 读取FILE而不是标准输入
- iflag=FLAGS 指定读取的方法
- obs=BYTES 一些写入BYTES个字节,默认512
- of=FILE 写入FILE而不是标准输出
- oflag=FLAGS 指定写入的方法
- conv=CONVS 指定转换标记,多个用逗号分隔
- count=N 只拷贝N个输入block
- seek=BLOCKS
- 针对输出,跳过BLOCKS个obs大小的block
- 通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
- skip=BLOCKS
- 针对输入,跳过BLOCKS个ibs大小的block
- status=LEVEL 输出到标准错误输出stderr的信息LEVEL
- progress 显示阶段性的传输统计,便于评估进度
CONVS可取值如下,多个用逗号分隔:
- ascii 编码EBCDIC转换为ASCII
- ebcdic 编码ASCII转换为EBCDIC
- ibm 编码ASCII转换为另一种EBCDIC
- block 把每一行转换为长度为cbs,不足部分用空格填充
- unblock
- lcase 大写改成小写
- ucase 小写改成大写
- sparse
- swab 交换出输入的字节
- sync 如果遇到读取的错误,则使用NULL填充输入的block,这样能保证数据的偏移量一致。
- excl 如果输出文件已经存在则报错
- nocreat 不创建文件
- notrunc 不截断文件
- fdatasync
- fsync
- noerror 表示读处理过程中忽略所有错误。不指定,默认表现为遇到错误就退出
FLAG标记取值如下,多个用逗号分隔:
- append 追加模式,只针对输出,应该与conv=notrunc合用
- direct 使用direct IO
- directory 除非是目录,否则报错
- dsync 使用同步IO
- sync 使用同步IO,包括元数据meta
- fullblock 只针对iflag,累计所有block
- nonblock 使用非阻塞IO
- noatime 不更新文件的access time信息
- nocache 忽略缓存中的数据
- noctty 不给文件分配控制终端
- symlinks 不跟踪软链接
- count_bytes 只针对iflag,认为count=N为指定字节数目
- skip_bytes 只针对iflag,认为skip=N为指定字节数目
- seek_bytes 只针对oflag,认为seek=N为指定字节数目
二.用法示例
1)克隆一个设备,注意会包括启动扇区,所有分区,UUID和数据等。
2)备份硬盘/dev/sdX,并恢复至外挂其他硬盘/dev/sdY# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress
a) 确保没有在使用
b) Mount
c) 备份
考虑避免过大单文件
# dd if=/dev/sdX conv=sync,noerror bs=64K | gzip -c | split -a3 -b2G - /path/to/backup.img.gz考虑直接传到远程主机
# dd if=/dev/sdX conv=sync,noerror bs=64K | gzip -c | ssh user@remotehost dd of=backup.img.gz备份额外的原硬盘分区表等信息
# fdisk -l /dev/sdX > /path/to/list_fdisk.infod) 恢复
# gunzip -c /path/to/backup.img.gz | dd of=/dev/sdY如果是已经分隔的文件,则如下方式解压
# cat /path/to/backup.img.gz* | gunzip -c | dd of=/dev/sdY3)备份与恢复MBR
备份磁盘开始的512个字节大小的MBR信息到指定文件:
# dd if=/dev/hda of=/root/image count=1 bs=512
恢复:
# dd if=/root/image of=/dev/had将备份的MBR信息写到磁盘开始部分
4)增加swap分区文件大小
增加swap分区文件大小
a) 创建一个大小为256M的文件:
# dd if=/dev/zero of=/swapfile bs=1024 count=262144
b) 把这个文件变成swap文件:
# mkswap /swapfile
c) 启用这个swap文件:
# swapon /swapfile
d) 编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile swap swap default 0 0
5)确定硬盘的最佳块大小
# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
# dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
# dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
# dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。
6)修复硬盘
# dd if=/dev/sda of=/dev/sda 或dd if=/dev/hda of=/dev/hda
当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生magnetic flux point,当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数 据起死回生。并且这个过程是安全、高效的。
7)将一个大视频文件的第i个字节的值改成0x41(大写字母A的ASCII值)
# echo A | dd of=bigfile seek=$i bs=1 count=1 conv=notrunc8)io测试1:direct io写文件,测试不刷cache的表现
dd if=/dev/zero of=./big_file bs=100M count=400 oflag=direct9)io测试2:第二个测试,采用cache io方式做本地写入测试
dd if=/dev/zero of=./big_file bs=100M count=300
10)转换大小写
# cat > abc
sif928j984fSOf9hf2s
sajdflk S02hSnkUUNG
# dd if=abc of=abc2 conv=ucase
0+1 records in
0+1 records out
40 bytes (40 B) copied, 0.000209984 s, 190 kB/s
# cat abc2
SIF928J984FSOF9HF2S
SAJDFLK S02HSNKUUNG
三.其他
/dev/null 表示一个"黑洞",如同一个只写的文件,任何写入都会丢弃,往往用于屏蔽一些无用输出,如:# find / -name mytest 2>/dev/null这样遇到错误如权限不足等,都直接丢弃,不会忽略打印影响交互。
/dev/zero 是一个输入设备,可以用来初始化文件,其提供无穷无尽的null(二进制的零流,而不是ASCII型的0)
# dd if=/dev/zero of=mytest.log bz=10 count=1
参考
https://wiki.archlinux.org/index.php/disk_cloning
https://www.cnblogs.com/jikexianfeng/p/6103500.html
没有评论:
发表评论