dd
if=xxx 从xxx读取,如if=/dev/zero,该设备无穷尽地提供0,(不产生读磁盘IO)of=xxx 向xxx写出,可以写文件,可以写裸设备。如of=/dev/null,"黑洞",它等价于一个只写文件. 所有写入它的内容都会永远丢失. (不产生写磁盘IO)bs=8k 每次读或写的大小,即一个块的大小。count=xxx 读写块的总数量。
null是个空文件,而zero是个无显示的无限输入文件,永远无尽头,这就代表zero可以作为一个无限写入硬盘的文件,而null是个无限空的文件可以理解为windows下的垃圾桶。
实例
[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 if=/dev/zero of=/home/jli/testfile bs=1M count=100
if=filename 指定将要拷贝输入的文件名。ibs=blocksize 指定输入文件的块大小。ifskip=numberofeof 指定前跳过的eof标志的个数。files=numberofblocks 在拷贝前,在输入文件上跳过指定数目的块.of=filename 指定创建的输出文件obs=blocaksize 指定输出块大小seek=recordnumber 拷贝文件时,指定输入文件的开始记录号。conv=conversionparameter 指定数据转换的类型,描述数据转换类型的参数有: ASCII,EBCDIC,block,unblock.lcase,,ucase.
示例:将file.dd 输出到磁盘文件.
dd if=file.dd of=/dev/rfd0135ds18
将EBCDIC格式存放的文件转换为ASCII文件
dd if=file1 of =file2 conv=ascii
将磁带上的三个文件拷贝到文件file1
dd if=/dev/mnt0 fskip=2 of =file1
实例:
创建一个100M的空文件
dd if=/dev/zero of=hello.txt bs=100M count=1
创建一个4G的tmp.test 文件
dd if=/dev/zero of=tmp.test bs=4096M count=1
dd if=/dev/zero of=100M.img bs=1M count=100
dd if=/dev/zero of=1G.img bs=1M seek=1000 count=0
ls -l 1G.img
-rw-r-r- 1 root root 1048576000 Mar 25 15:32 1G.img
du -m 1G.img
1M
这里用了一个新的命令seek,表示略过1000个Block不写(这里Block按照bs的定义是1M),count=0表示写入0个Block。用ls命令看新生成的文件,大小可以看出是1000M。但是再用du一看,实际占用硬盘大小只有1M。
if=FILE : 指定输入文件,若不指定则从标注输入读取。这里指定为/dev/zero是Linux的一个伪文件,它可以产生连续不断的null流(二进制的0)
of=FILE : 指定输出文件,若不指定则输出到标准输出
bs=BYTES : 每次读写的字节数,可以使用单位K、M、G等等。另外输入输出可以分别用ibs、obs指定,若使用bs,则表示是ibs和obs都是用该参数
count=BLOCKS : 读取的block数,block的大小由ibs指定(只针对输入参数)
1.将本地的/dev/hdb整盘备份到/dev/hdd
dd if=/dev/hdb of=/dev/hdd
2.将/dev/hdb全盘数据备份到指定路径的image文件
dd if=/dev/hdb of=/root/image
3.将备份文件恢复到指定盘
dd if=/root/image of=/dev/hdb
4.备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径
dd if=/dev/hdb | gzip > /root/image.gz
5.将压缩的备份文件恢复到指定盘
gzip -dc /root/image.gz | dd of=/dev/hdb
6.备份磁盘开始的512个字节大小的MBR信息到指定文件
dd if=/dev/hda of=/root/image count=1 bs=512
count=1指仅拷贝一个块;bs=512指块大小为512个字节。
恢复:dd if=/root/image of=/dev/hda
7.备份软盘
dd if=/dev/fd0 of=disk.img count=1 bs=1440k (即块大小为1.44M)
8.拷贝内存内容到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)
9.拷贝光盘内容到指定文件夹,并保存为cd.iso文件
dd if=/dev/cdrom(hdc) of=/root/cd.iso
1.1整盘数据备份与恢复
备份
将本地的/dev/hdx整盘备份到/dev/hdy :
dd if=/dev/hdx of=/dev/hdy
将/dev/hdx全盘数据备份到指定路径的image文件:
dd if=/dev/hdx of=/path/to/image
备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径:
dd if=/dev/hdx | gzip>/path/to/image.gz
恢复
将备份文件恢复到指定盘:
dd if=/path/to/image of=/dev/hdx
将压缩的备份文件恢复到指定盘:
gzip -dc /path/to/image.gz | dd of=/dev/hdx
2.1利用netcat远程备份
在源主机上执行此命令备份/dev/hda:
dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
在目的主机上执行此命令来接收数据并写入/dev/hdc:
netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
以下两条指令是目的主机指令的变化分别采用bzip2 gzip对数据进行压缩,并将备份文件保存在当
前目录:netcat -l -p 1234 | bzip2 > partition.imgnetcat -l -p 1234 | gzip > partition.img
3.1备份MBR
备份:备份磁盘开始的512Byte大小的MBR信息到指定文件:
dd if=/dev/hdx of=/path/to/image count=1 bs=512
恢复:将备份的MBR信息写到磁盘开始部分:
dd if=/path/to/image of=/dev/hdx
4.1备份软盘
将软驱数据备份到当前目录的disk.img文件:
dd if=/dev/fd0 of=disk.img count=1 bs=1440k
将内存里的数据拷贝到root目录下的mem.bin文件:
dd if=/dev/mem of=/root/mem.bin bs=1024
5.1从光盘拷贝iso镜像
拷贝光盘数据到root文件夹下,并保存为cd.iso文件:
dd if=/dev/cdrom of=/root/cd.iso
6.1增加Swap分区文件大小创建一个足够大的文件(此处为256M):
dd if=/dev/zero of=/swapfile bs=1024 count=262144
把这个文件变成swap文件:
mkswap /swapfile
启用这个swap文件:
swapon /swapfile
在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行:
/swapfile swap swap defaults 0 0
7.1销毁磁盘数据
利用随机的数据填充硬盘:
dd if=/dev/urandom of=/dev/hda1
在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。
8.1磁盘管理
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小:
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
测试硬盘读写速度
通过两个命令输出的执行时间,可以计算出测试硬盘的读/写速度:
dd if=/dev/zero of=/mnt/test/1Gb.file bs=1024 count=1000000
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 13.8662 s, 73.8 MB/s
dd if=/mnt/test/1Gb.file bs=64k | dd of=/dev/null
15625+0 records in
15625+0 records out
1024000000 bytes (1.0 GB) copied, 6.19643 s, 165 MB/s
2000000+0 records in
2000000+0 records out
1024000000 bytes (1.0 GB) copied, 6.19598 s, 165 MB/s
time dd if=/dev/zero of=/mnt/test/1Gb.file bs=1k count=1000000 conv=fsync
000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 23.9636 s, 42.7 MB/s
real 0m23.968s
user 0m0.100s
sys 0m1.736s
加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,这样算出来的时间才是比较符合实际使用结果的。conv=fsync表示把文件的“数据”和“metadata”都写入磁盘(metadata包括size、访问时间st_atime & st_mtime等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作,fsync 与fdatasync相差不大。(重要,最有参考价值)
把/mnt/test/1Gb.file中的数据写入/tmp/test1文件中
time dd if=/mnt/test/1Gb.file of=/tmp/test1 bs=1k count=1000000
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 24.3568 s, 42.0 MB/s
real 0m24.437s
user 0m0.212s
sys 0m3.284s
修复硬盘
当硬盘较长时间(比如一两年年)放置不使用后,磁盘上会产生magnetic flux point。当磁头读到
这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致
硬盘报废。下面的命令有可能使这些数据起死回生。且这个过程是安全,高效的。dd if=/dev/sda of=/dev/sda