0%

低调但大胆的 - dd 命令

低调但大胆的 - 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。 就不会造成你在恢复后的计算机上无法上网的问题了。

处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道