我如何加速完整的磁盘dd?
我正在使用此命令在两个相同的驱动器上执行dd
:
dd if=/dev/sda of=/dev/sdb bs=4096
两个硬盘驱动器的型号完全相同,都有1TB的存储空间。 /dev/sda
使用的块大小为4096. /dev/sda
是本地驱动器, /dev/sdb
是远程caddy。 我或许可以使用以下协议:
- USB2.0 HighSpeed(目前计划)
- 千兆网络克隆(真的不想尝试这个)
- USB3.0(如果我找到我的其他驱动器球童)
- eSATA(如果我发现/购买电缆)
- SATA(如果我找到/购买电缆,必须爱笔记本电脑CD驱动器)
有没有办法运行这个驱动器副本,花费少于96小时? 我愿意使用除dd
以外的工具。
我需要克隆以下分区(包括UUID)
- Fat32 EFI分区(*)
- NTFS Windows分区(*)
- HFS + OSX分区
- EXT4 Ubuntu分区(*)
- 交换分区(*)
*
由Clonezilla支持
我尝试过Clonezilla(它的速度要快得多),但它不支持我需要的HFS +智能复制。 也许最新版本支持这个?
当我完成第一次克隆时,除了HFS +之外,我做了所有分区,并且进行得非常快。 (总共不超过3小时)
根据我的经验,我不认为命令行中的某些东西比dd
更快。 调整bs
参数可以提高速度,例如,我有2个HDD,我知道它的读/写速度大于100 MB / s所以我这样做:
dd if=/dev/sda of=/dev/sdb bs=100M
还有pv
(需要首先安装)检查两个驱动器上的最快速度,然后继续进行克隆。 这当然必须从root完成:
pv < /dev/sda > /dev/sdb
使用PV我得到156 MB / s
除了速度之外, pv
的优点在于它显示了进度,当前速度,自开始以来的时间和ETA。 关于HFS +我不知道,我只想帮助“速度”部分。 使用pv
或非常优化的bs
参数,您可以在不到7小时内完成4 TB驱动(6小时50分钟,当前速度为150 MB / s)。
我使用您正在使用的连接类型和其他可用的连接类型进行了几项测试。 我使用的是华硕Z87 Pro和Intel DZ68DP。 这是我的结果,但首先我们需要知道许多传输速率(原始速度)的理论速度就是理论 。 做真正的测试显示它们是原始速度的40%到80%。 此测试可能会根据所使用的设备,连接类型,主板,连接电缆的类型,文件系统类型等而改变。 考虑到这一点,这就是我得到的(我只测试了写入设备的速度,读取通常更高):
Connected Device - Connection Type - Speed (Write Speed) USB 2.0 USB 2.0 25 MB/s USB 3.0 USB 2.0 35 MB/s USB 3.0 USB 3.0 73 MB/s eSata eSata 80 MB/s Sata 2G HDD Sata 2G 120 MB/s Sata 3G HDD Sata 2G 140 MB/s Sata 3G HDD Sata 3G 190 MB/s Sata 2G SDD Sata 2G 170 MB/s Sata 3G SDD Sata 2G 210 MB/s Sata 3G SDD Sata 3G 550 MB/s
问题是您的连接类型和块大小。 为了获得最快的结果,您的块大小应该是您通常接收的最低写入速度的一半。 这将给你一个安全边际,但仍然允许大量; 当然你也需要有足够的ram来保存数据。
Usb 2.0是12兆比特每秒(Mbps),Usb 2.0高速是480 Mbps。 这当然是原始速度; 在一个字节中有8位和帧开销,以MB / s为单位的可用速度通常是小数位。 因此,例如480 raw,变为48MB可用。 请记住,这是数学上最好的,在现实世界中它会更低一些。 对于usb 2.0高速连接,如果实际存储设备可以等于或超过连接速度,则应该预期大约30-35 MB的最大写入速度。
要复制分区批发,请使用cat
而不是dd
。 我刚刚运行基准测试 ,在两个磁盘之间复制一个大文件而不是一个分区(在同一个磁盘上,相对时序不同):
dd bs=64M 51.3 dd bs=1M 41.8 dd bs=4k 48.5 dd bs=512 48.9 cat 41.7 cp 45.3
这个基准测试的结论是, dd
的块大小的选择很重要(但不是那么多),并且cat
自动找到快速复制的最佳方法: dd
只能减慢你的速度。 由于块大小较小, dd
浪费时间,导致丢失微小的读写操作。 对于大块大小,一个磁盘保持空闲而另一个磁盘正在读取或写入。 当一个磁盘读取而另一个磁盘写入时,实现最佳速率。
要复制分区,使用cp -a
复制文件可能会更快。 这取决于有多少文件以及文件系统有多少是可用空间。 复制文件的开销与文件数大致成比例,但另一方面复制空闲空间会浪费时间。
USB2的最大数据速率略低于50 MB / s,传输1TB可达6-7小时。 这假定硬盘速度足以使USB总线饱和; 我认为更快的7200转驱动器可以做到但5900rpm可能不会那么快(也许它们用于线性写入?)。
如果任意一个磁盘并行使用,这可能会大大减慢复制速度,因为磁头需要移动。
我同意调整良好的dd
(’pv’)或’cat’命令的原始速度很难被击败,但如果副本有任何问题(坏扇区,电源故障,用户错误等),那么你必须重来。
我想建议ddrescue – 一个具有dd速度的FOSS工具,但它可以解决磁盘错误,如果出现故障,可以在以后恢复。
我正在将Windows 7从HDD转移到SSD并找到了这个以及其他一些答案……我学到的东西可能对其他人有所帮助。 在我的情况下,源驱动器更大,否则我将在/ dev / sda – > / dev / sdb设备级别工作。
Win7及其3个分区……我在usb上使用了Xbuntu 14.04 live cd。 弹出胜利计算机的DVD并将SSD放在原位。 安装了partclone并尝试了这个:
partclone.ntfs -b -N -s /dev/sda3 -o /dev/sdb3
Partclone在需要chkdisk在Windows上运行的ntfs上呕吐,因此快速解决了partclone的问题:
ntfsfix -b /dev/sda3 ntfsfix -d /dev/sda3
所有命令都以root身份运行。 Partclone的ncurses UI(-N选项)表示传输速率为7GB / min,最终为5GB / min,相当于83MB / sec。 最重要的是partclone不会复制未使用的空间,因此这使克隆速度非常快。
额外潜在的getchyas:
-
如果您转移到的驱动器以前使用过,它可能有GPT的残余。 Windows 7出厂安装通常是msdos / mbr分区表。 您需要从目标驱动器中删除GPT片段。 这个Unix和Linux QA帮助了我。 您必须在设备上使用
gdisk
,使用x然后使用z和yes来删除GPT数据,并确保保留MBR。 -
不要忘记如果你没有设备级别dd,你需要使用复制MBR
dd if=/dev/sdb of=/dev/sda bs=446 count=1
其中sdb是源或旧驱动器,sda是目标或新驱动器 ( 源 )
我最近创建了100GB分区(HDD)的映像并将其写入新的SSD磁盘。
这是一个可以大大加快过程的提示:)
将文件拆分成更小的部分(文件越大,工作越慢)
sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img
在此过程中,您可以使用(在单独的终端中)检查速度
pgrep -l '^dd$' #to find PROCESSID kill -USR1 PROCESSID #to check the speed
然后,当你有一个完整的结果文件目录(maindisk.img000,maindisk.img001等等)时使用
sudo cat maindisk.img* | sudo dd of=/dev/sda1
将图像“刻录”到SSD的新部分(parition必须与旧版本相同)
对我来说,它比平时更快地工作(没有分裂)。 创建图像的平均速度约为13MB / s。 当我使用“正常”方式时,它以~15MB / s开始,然后降低到1MB / s。
对于任何发现此线程的人来说,使用专为数据恢复而设计的工具(如ddrescue)更容易,更快捷。 它会尝试在读取错误的情况下首先挽救好的部件。 您也可以随时中断救援,并在以后同一时间恢复。
运行两次:
第一轮,复制每个块没有读取错误,并将错误记录到rescue.log。
sudo ddrescue -f -n /dev/sdX /dev/sdY rescue.log
第二轮,只复制坏块并在放弃之前尝试3次从源读取。
sudo ddrescue -d -f -r3 /dev/sdX /dev/sdY rescue.log
现在您可以挂载新驱动器并检查文件系统是否损坏。
更多信息:
https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html
我建议输入/读取 – 文件/磁盘在SATA上以提高读取速度。 USB 2.0高速也很好, 因为ddrescue的平均速度为33816 kb / s ,而设置为2014 kb / s时的USB 2.0到SATA
使用不同的块大小。 这是dd
读取的数据量。 如果读得太少,则会花费更多的时间在程序逻辑上,如果读得太多,则花费大量时间来移动大数据。
要测量不同块大小的速度,请使用以下bash
脚本:
- 将
$dev
设置为该设备 - 将
cbtotal
修复为预期读取速度的至少5倍
(set -o errexit; skip=0; cbtotal=$((120*1024**2)); bs=256; for power in `seq 10`; do bs=$((bs*2)); skip=$((skip/2)); count=$((cbtotal/bs)); if [ "$count" -lt 1 ]; then break; fi; echo $bs; dd if=$dev of=/dev/null skip=$skip bs=$bs count=$count skip=$((skip+count)) done)
由于前面的磁盘读数,结果可能会偏向更大的尺寸 – 这就是为什么设置cbtotal
大的cbtotal
很重要的原因。