118

Согласно документации rasbery pi, вы можете загрузить свою ОС на флеш-карту либо с помощью /dev /disk, либо /dev /rdisk.

rdisk обозначает сырой диск.

/dev/disk - это устройство блочного уровня, почему бы rdisk быть в 20 раз быстрее?

Использование Mac OSX

Примечание: В OS X каждый диск может иметь две ссылки на пути в /dev: /dev /disk # - это буферизованное устройство, что означает, что любые отправляемые данные подвергаются дополнительной обработке. /dev /rdisk # - это необработанный путь, который намного быстрее и прекрасно работает при использовании программы dd. На SD-карте класса 4 разница была примерно в 20 раз быстрее при использовании пути rdisk.

4 ответа4

91

Принятый ответ правильный, но не вдаваться в подробности.

Одно из ключевых отличий между /dev/disk и /dev/rdisk при доступе к ним из пользовательского пространства заключается в том, что /dev/disk буферизуется. Путь чтения / записи для /dev/disk разбивает ввод-вывод на 4 КБ порции, которые он считывает в буферный кеш, а затем копирует в буфер пространства пользователя (а затем выдает следующее чтение 4 КБ…). Это хорошо тем, что вы можете выполнять выравнивание чтения и записи, и это просто работает. Напротив, /dev/rdisk основном просто передает чтение или запись прямо на устройство, что означает, что начало и конец ввода / вывода должны быть выровнены на границах секторов.

Если вы выполняете чтение или запись в /dev/rdisk размером более одного сектора, этот запрос будет сразу передан. Нижние уровни могут разбить его (например, USB разбивает его на куски по 128 КБ из-за максимального размера полезной нагрузки в протоколе USB), но в целом вы можете получить более крупные и эффективные операции ввода-вывода. При потоковой передаче, например, через dd , от 128 КБ до 1 МБ достаточно хороших размеров, чтобы получить почти оптимальную производительность на текущем оборудовании без RAID.

Кэширование, выполняемое путями чтения / записи в /dev/disk очень просто и почти не работает. Он кэшируется, даже если это не строго необходимо; например, если устройство может отображать карту памяти и напрямую переноситься в буфер вашего приложения. Он выполняет небольшие операции ввода-вывода (4 КБ), что приводит к значительным накладным расходам на ввод-вывод. Это не делает никакого чтения вперед или записи позади.

87

От man hdiutil:

Узлы /dev /rdisk являются символьно-специальными устройствами, но являются "необработанными" в смысле BSD и вынуждают выровненный блок ввода-вывода. Они ближе к физическому диску, чем кеш буфера. Узлы /dev /disk, с другой стороны, являются буферизованными блочно-специальными устройствами и используются главным образом кодом файловой системы ядра.

С точки зрения непрофессионала /dev/rdisk идет почти напрямую на диск, а /dev/disk идет по более длинному и более дорогому маршруту

4

Кажется, что /dev/disk и /dev/rdisk работают по-разному для жестких дисков и твердотельных накопителей. Хочу проверить это на карту MicroSD. Только что записал образ диска 2 ГБ в Sandisk Ultra MicroSD 64 ГБ (https://www.amazon.com/gp/product/B073JYVKNX).

Несколько раз проводил тесты, но результаты были стабильными: 17 МБ / с для /dev/disk против 20 МБ / с для /dev/rdisk . Изменение bs=1m на bs=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)
    
  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)
    

Затем я решил проверить скорость чтения: 26 МБ / с для /dev/disk против 87 МБ / с для /dev/rdisk . Изменение bs=1m на bs=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)
    
  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)
    
1

Для записи, по крайней мере в macOS High Sierra, /dev /disk оказывается намного быстрее, чем /dev /rdisk. Запустив dd или ddrescue, мое копирование для сравнения пропускной способности с магнитного HD на SSD было 3,7 МБ / с при использовании /dev /rdisk, и 45 МБ / с при использовании /dev /disk. Так что в более поздних версиях macOS может быть лучше использовать /dev /disk вместо /dev /rdisk для лучшей производительности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .