低调但大胆的 - dd 命令
除了入门介绍的基本功能,今天再加点干货。
测试写入速度
1 | dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct |
这个命令增加了一个选项叫做oflag=direct
,
oflag=direct
:确保数据直接写入磁盘,跳过系统缓存。
这个命令将会输出写入速度。完成测试后,可以删除 testfile
文件。
测试读取速度
首先写一个测试文件(可以使用上面的写入命令),然后执行以下读取命令:
1 | dd if=testfile of=/dev/null bs=1G count=1 iflag=direct |
同样的增加了iflag=direct
,可以加速:
iflag=direct
:直接读取数据,跳过系统缓存。
这样可以得到硬盘的读取速度。
#######TODO
backup an entire copy of a hard disk to another hard disk
1 | # dd if=/dev/sda of=/dev/sdb conv=sync,noerror |
cbs=BYTES
convert BYTES bytes at a time
conv=CONVS
convert the file as per the comma separated symbol list
ibs=BYTES
read up to BYTES bytes at a time (default: 512)
iflag=FLAGS
read as per the comma separated symbol list
obs=BYTES
write BYTES bytes at a time (default: 512)
oflag=FLAGS
write as per the comma separated symbol list
seek=N skip N obs-sized blocks at start of output
skip=N skip N ibs-sized blocks at start of input
status=LEVEL
The LEVEL of information to print to stderr; 'none' suppresses everything but error messages, 'noxfer'
suppresses the final transfer statistics, 'progress' shows periodic transfer statistics
N and BYTES may be followed by the following multiplicative suffixes: 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, and so on for T, P, E, Z, Y.
Each CONV symbol may be:
ascii from EBCDIC to ASCII
ebcdic from ASCII to EBCDIC
ibm from ASCII to alternate EBCDIC
block pad newline-terminated records with spaces to cbs-size
unblock
replace trailing spaces in cbs-size records with newline
lcase change upper case to lower case
ucase change lower case to upper case
sparse try to seek rather than write the output for NUL input blocks
swab swap every pair of input bytes
sync pad every input block with NULs to ibs-size; when used with block or unblock, pad with spaces rather
than NULs
excl fail if the output file already exists
nocreat
do not create the output file
notrunc
do not truncate the output file
noerror
continue after read errors
fdatasync
physically write output file data before finishing
fsync likewise, but also write metadata
Each FLAG symbol may be:
append append mode (makes sense only for output; conv=notrunc suggested)
direct use direct I/O for data
directory
fail unless a directory
dsync use synchronized I/O for data
sync likewise, but also for metadata
fullblock
accumulate full blocks of input (iflag only)
nonblock
use non-blocking I/O
noatime
do not update access time
nocache
Request to drop cache. See also oflag=sync
noctty do not assign controlling terminal from file
nofollow
do not follow symlinks
count_bytes
treat 'count=N' as a byte count (iflag only)
skip_bytes
treat 'skip=N' as a byte count (iflag only)
seek_bytes
treat 'seek=N' as a byte count (oflag only)
Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then re‐
sume copying.
使用dd命令克隆整个系统
进入Linux操作系统,打开命令行,执行如下命令:
1 | sudo fdisk -u -l |
可以查看所有磁盘上的所有分区的尺寸和布局情况。
-u,让start和end中数字的单位是512字节,也就是一个sector扇区的大小。
具体步骤
找一个U盘,安装UbuntuLive Cd系统。
U盘启动,进入盘上的Ubuntu系统,打开命令行,执行:
1 | sudo fdisk -u -l /dev/sda |
查看硬件的分区情况。
然后执行:
1 | dd bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sda of=/ghost.img |
这样,就可以把我需要的分区数据全部copy到ghost.img文件中。镜像制作完成了!
然后,我们就可以把U盘插到其他系统上,用U盘启动,进入UbuntuLiveCD,打开命令行,执行如下命令:
1 | dd if=/ghost.img of=/dev/sda |
完成后,拔掉U盘,启动计算机,就可以看到我们的Linux系统已经安装完毕了!
注意:不要直接在计算机上用本地磁盘启动系统后执行dd命令生成本地磁盘的镜像。而应该使用livecd启动计算机。因此计算机运行时会对系统盘产生大量写操作。 直接对运行中的系统盘生成的镜像,在恢复到其他硬盘上时,很可能会无法启动!
一样适用于非Linux操作系统, 在linux上用dd命令实现系统镜像备份和恢复,是不是很简单呢?
对于Windows系统,甚至Mac等等任意系统,其实都可以用dd命令实现系统镜像的备份和恢复。
因为,Linux的fdisk命令能够识别任意系统下的分区格式。fdisk并不关系分区上的文件系统,甚至有无文件系统都不关心。fdisk总是可以报告分区占用了哪些扇区。
dd命令也不关心磁盘的文件系统格式,它只是简单地按照要求从指定的位置,复制多少字节数据而已。
dd命令实现镜像备份和恢复,比Ghost软件简单和强大多了。使用ghost软件,依然需要用户进行复杂而危险的磁盘分区操作。
而使用fdisk和dd这两条命令,一切都免了!
压缩和解压缩
可能我们需要备份的分区很大,使用dd命令生成的镜像文件也就很大。存储和传输这些镜像不太方便。 我们也可以使用压缩程序压缩生成的镜像文件。 这里,我选择使用gzip程序,配合dd命令一起使用。
gzip参数:
- -c 表示输出到stdout
- -d 表示解压缩
- -1 表示最快压缩
- -9 表示最好压缩
默认使用的是-6压缩级别。
要使用 dd 和 gzip 生成压缩的镜像文件,可以执行命令:
1 | dd bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sda | gzip -6 > /ghost.img.gz |
还原时,可以执行下列命令: # gzip -dc /ghost.img.gz.gz | dd of=/dev/sda
提醒:
如果你把镜像恢复到另一台计算机上,你可能会发现你的网卡是eth1,而不是eth0。这是因为
/etc/udev/rules.d/70-persistent-net.rules 文件把你做镜像的计算机的网卡作为eth0登记了。
如果你的网络脚本对eth0进行了处理,而没有对eth1进行处理,那么不修改网络脚本,你可能就无法上网了。
也许你会希望在做镜像之前,先删除 /etc/udev/rules.d/70-persistent-net.rules 文件。这样你恢复镜像时,网卡的名字就是eth0。 就不会造成你在恢复后的计算机上无法上网的问题了。