为什么“/dev/rdisk”比 Mac OS X 中的“/dev/disk”快 20 倍

spu*_*der 148 disk-utility sd-card dd dev

根据rasbery pi 文档,您可以使用 /dev/disk 或 /dev/rdisk 将操作系统加载到闪存卡。

rdisk 代表原始磁盘。

/dev/disk 是块级设备,为什么 rdisk 会快 20 倍?

使用 Mac OSX

注意:在 OS X 中,每个磁盘在 /dev 中可能有两个路径引用:/dev/disk# 是一个缓冲设备,这意味着任何发送的数据都会经过额外的处理。/dev/rdisk# 是一个原始路径,它要快得多,而且在使用 dd 程序时完全没问题。在 Class 4 SD 卡上,使用 rdisk 路径的差异大约快 20 倍。

ast*_*uct 110

接受的答案是正确的,但没有详细说明。

当您从用户空间访问它们时,/dev/disk和之间的主要区别/dev/rdisk之一/dev/disk是缓冲。用于/dev/disk将 I/O 分解为 4KB 块的读/写路径,它读入缓冲区缓存,然后复制到用户空间缓冲区(然后发出下一个 4KB 读……)。这很好,因为您可以进行未对齐的读取和写入,并且它可以正常工作。相比之下,/dev/rdisk基本上只是将读取或写入直接传递给设备,这意味着 I/O 的开始和结束需要在扇区边界上对齐。

如果您对 进行了大于一个扇区的读取或写入操作/dev/rdisk,则该请求将直接通过。较低层可能会将其分解(例如,由于 USB 协议中的最大有效负载大小,USB 会将其分解为 128KB 的片段),但您通常可以获得更大和更高效的 I/O。流式传输时,例如 via dd,128KB 到 1MB 是相当不错的大小,可以在当前的非 RAID 硬件上获得接近最佳的性能。

/dev/disk的读写路径完成的缓存非常简单,几乎是脑死亡。即使不是绝对必要,它也会缓存;就像设备可以内存映射并直接传输到您的应用程序缓冲区一样。它执行小 (4KB) I/O,这会导致大量的 per-I/O 开销。它不进行任何预读或后写。


Dan*_*ton 101

来自man hdiutil

/dev/rdisk 节点是字符特殊设备,但在 BSD 意义上是“原始的”并强制块对齐 I/O。它们比缓冲区缓存更接近物理磁盘。另一方面,/dev/disk 节点是缓冲的块特殊设备,主要由内核的文件系统代码使用。

通俗地说/dev/rdisk,几乎直接进入磁盘,/dev/disk并通过更长更昂贵的路线

  • @user391339 因为缓存仍然是一件可取的事情。如果您有可移动媒体,您希望尽快获取物理设备上的数据,因为您希望数据位于另一个物理位置。内部硬盘驱动器是另一回事。您通常不会随身携带它们,因此您不关心数据何时实际写入设备。当您缓存写入/读取设备的数据时,这是一种更昂贵的写入磁盘的方式,但您的程序仍然更快,因为它们不需要等到要写入的所有数据都写入磁盘。 (21认同)
  • 可以使用 rdisk 时为什么要使用磁盘? (17认同)

k06*_*06a 6

对于 HDD 和 SSD,它似乎/dev/disk/dev/rdisk工作方式不同。想检查它是否有 MicroSD 卡。刚刚将 2GB 磁盘映像写入 Sandisk Ultra MicroSD 64GB ( https://www.amazon.com/gp/product/B073JYVKNX )。

反复测试几次,但效果稳定:17MB / s的/dev/diskVS 20MB /秒/dev/rdisk。更改bs=1mbs=16m在写入速度上绝对没有区别。

  1. 写信给 /dev/disk2

    sudo dd if=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531.img of=/dev/disk2 bs=1m
    2094006272 bytes transferred in 121.860007 secs (17183704 bytes/sec)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 写信给 /dev/rdisk2

    $ sudo dd if=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531.img of=/dev/rdisk2 bs=1m
    2094006272 bytes transferred in 102.743870 secs (20380839 bytes/sec)
    
    Run Code Online (Sandbox Code Playgroud)

然后,我决定测试读取速度:26MB / s的/dev/diskVS 87MB /秒/dev/rdisk。更改bs=1mbs=16m在阅读速度上绝对没有区别。

  1. 阅读自 /dev/disk2

    sudo dd if=/dev/disk2 of=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531-2.img bs=1m
    257949696 bytes transferred in 9.895572 secs (26067184 bytes/sec)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 阅读自 /dev/rdisk2

    $ sudo dd if=/dev/rdisk2 of=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531.img bs=1m
    877658112 bytes transferred in 10.021974 secs (87573377 bytes/sec)
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

我知道这是一个旧线程,但其他人可能对我尝试过的速度影响感兴趣。我想将 MacBook Pro 13" Retina(带有 Silicon Power 1\xe2\x80\xafTB SSD)中的内部 SSD 备份到外部 USB\xe2\x80\xaf3.0 2.5"\xe2\x80\xaf 硬盘驱动器,想要捕获 macOS 和 BOOTCAMP 分区。我最初的命令行是:

\n\n
sudo dd if=/dev/disk0 of=/dev/disk2 bs=1m\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是复制速率约为 31.3\xe2\x80\xafMB/秒。这时间太长了,让我等不及了。因此,在第二次尝试时,命令行是:

\n\n
sudo dd if=/dev/rdisk0 of=/dev/rdisk2 bs=1m\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用/dev/rdisk而不是/dev/disk显着加快速度,达到大约 98.4\xe2\x80\xafMB/秒!然而,它会变得更好。因此,对于第三次尝试,我使用了以下命令行:

\n\n
sudo dd if=/dev/rdisk0 of=/dev/rdisk2 bs=1m conv=sparse\n
Run Code Online (Sandbox Code Playgroud)\n\n

稀疏选项告诉 DD 不要写入输入全为 0 的输出块。很酷的是,即使在磁盘“已满”区域的中间,速度也比您想象的要快得多。在任何未满的驱动器上,您都会有大量的 0,从而进一步加快 DD 速度。至少到目前为止,DD 仅仅以我的硬盘的理论传输速度运行:~116.4\xe2\x80\xafMB/秒,而且还没有达到那些大的空白区域。

\n\n

尝试一下这些选项 \xe2\x80\x93 它们有效!请注意:请小心更改if=and\xc2\xa0of=以正确指向列出的正确驱动器(对于 Mac):

\n\n
diskutil list\n
Run Code Online (Sandbox Code Playgroud)\n

  • 当您复制*文件时, `conv=sparse` 非常有用。* 我担心它在复制*整个磁盘、* *分区*或* **文件系统**时可能会导致损坏,*除非您100% 确定目标磁盘只包含零。 (5认同)