Часто ли вам приходится переустанавливать операционную систему? Обычный пользователь на этот вопрос, скорее всего, ответит что-то вроде: «раз в пару лет». Кто-то вообще годами сидит на одной и той же, собирая всяческие глюки. Но есть и те, кто делает эту операцию каждый день. Например, системные администраторы и инженеры ЦОДов.
Именно для этой категории людей южнокорейская компания IODD придумала очень удобные устройства — эмуляторы оптического привода (их еще часто называют «карманами»). Стоит лишь залить нужные ISO-образы дисков в специально выделенную директорию, и девайс сможет прикидываться CD/DVD-приводом, подключенным по USB. Такие гаджеты делает и Zalman, а на Хабре мы уже писали про их особенности.
Во всем этом есть только одна проблема. Цена хорошего «кармана» сейчас от 80 до 100 $. Да и найти его довольно сложно — нишевая штука. Но если вы обладатель Raspberry Pi Zero W, то его можно превратить в такой девайс, к тому же более продвинутый и кастомизируемый.

Для начала давайте глубже посмотрим на особенности Raspberry Pi Zero W (справедливо и для Zero W2). Все дело в том, что эта плата имеет USB-вход питания и, что самое важное, разъем USB OTG (On-The-Go). Последний умеет работать не только «клиентом» для подключения периферии и накопителей информации, но и может сам выступать в роли любого USB-девайса.
В Linux есть весьма интересная подсистема — USB Gadget, фактически целый стек в ядре со своими драйверами, API и утилитами. Именно она позволяет устройству представляться чем угодно — от клавиатуры до внешнего привода. Тут важно понимать, что есть четкое разделение между драйвером USB-контроллера Linux (UDC driver) и драйвером USB-гаджета.
Первый взаимодействует с самим железом, то есть рулит регистрами, буферами и прерываниями. Второй же лишь является «ведомым» первого, но при этом работает на более высоком уровне, вызывая Gadget API и предоставляя нужные функции приложениям. Так что наш малиновый одноплатник легко выдает себя за оптический привод и начинает отвечать стандартными для SCSI/ATAPI реплаями на команды вроде INQUIRY, READ TOC, READ CAPACITY и подобными.
Собственно, это и входит в задачи Gadget API. Но чтобы понять, как ISO-образ «превращается» в виртуальный оптический диск, придется вспомнить принципы работы SCSI. Там существует понятие LUN (Logical Unit Number). Каждому логическому устройству хранения присваивается конкретный адрес по которому к нему можно обратиться.
В рамках одного контроллера (физического или виртуального) может существовать несколько LUN (LUN0, LUN1, LUN2 и так далее), каждый из которых для хоста будет представлен как обособленный диск. Вся магия эмуляторов оптических приводов заключается в том, чтобы на запрос хоста подсунуть ISO в качестве отдельного LUN. Он сыграет роль «моста» между файлом образа и «диском», который хост будет видеть как настоящий CD/DVD.
USBODE
Теперь, когда логика взаимодействия ясна, пора поговорить о проекте USBODE. Это относительно свежая разработка программиста из Детройта, Дани Сарфати (Dani Sarfati aka danifunker). Задумка была такой — сделать дешевый аналог дорогих «карманов», используя максимально простое и доступное железо.
Миниатюрный одноплатник подошел по многим причинам:
Карты памяти можно менять, предельный размер до 256 Гб.
Есть Wi-Fi, что позволяет управлять устройством по беспроводной сети.
Не требуется отдельное питание — все по одному кабелю USB.
Дешевый — всего 15 $.
Расширяемый — можно докупить модуль с экранчиком и кнопками.
Сложность состояла лишь в том, чтобы написать ту самую прослойку, которая будет перенаправлять SCSI-команды в USB Gadget API. Фактически именно это центральная часть всего проекта. Также автор предусмотрел любопытную штуку — прямое воспроизведение Audio СD непосредственно из образа. Чтобы достичь хорошего качества звука, в USBODE была добавлена поддержка Pirate Audio PIM483 HAT:

Этот модуль одновременно содержит в себе DAC приличного качества небольшой OLED-экранчик с кнопками и звуковой выход. Так что если поставить такой модуль на Raspberry Pi Zero W, то получится вполне сносный проигрыватель дампов Audio CD. Кстати, разработчик планирует добавить в проект поддержку образов CUE и BIN, чем несомненно порадует меломанов, которые предпочитают слушать несжатые образы аудио компакт-дисков.
Установка и запуск
Чтобы попробовать USBODE в деле, нужно скачать образ с GitHub. На момент написания этого текста, актуальная версия 1.99 доступна по ссылке. Архив в формате xz весит 999 Мб. Его рекомендуется записывать на MicroSD-карту при помощи стандартной утилиты Raspberry Pi Imager.
Дело в том, что она позволяет сразу сконфигурировать хостнейм, задать логин и пароль, активировать доступ по SSH, а также прописать параметры Wi-Fi сети к которой «малинка» подключится автоматически. Все это нужно сделать перед началом записи образа. Распаковывать img-образ из архива необязательно — утилита разберется с этим сама.
Карточку желательно брать быструю, ведь от ее скорости будет зависеть время старта одноплатника и, соответственно, начало эмуляции оптического привода. Как только вы записали образ, необходимо подключить Micro-USB кабель к разъему OTG (не PWR) и другой конец воткнуть в компьютер:

Первый запуск будет довольно долгим. На этом этапе происходит перемонтирование корневого каталога с расширением раздела до максимального размера MicroSD-карты. Могут возникнуть сообщения о том, что USB-устройство не опознано — это нормально и пугаться не стоит. Главное — не прерывать процесс и спокойно ждать его завершения.
Признаками того, что все прошло успешно, станут появление нового съемного диска с именем imgstore и доступность веб-интерфейса устройства. Чтобы узнать его точный IP, нужно заглянуть на роутер. У меня дома сеть построена на Mikrotik, так что девайс получил адрес 192.168.88.25:

Если же вы обладатель вышеупомянутого Pirate Audio HAT или Waveshare 1.3" OLED HAT, то адрес устройства будет выведен непосредственно на дисплей. USBODE может работать в одном из двух режимов: эмулятор привода (Mode 1) или накопитель (Mode 2). Вначале система функционирует в режиме 2, так как в директории еще нет ни единого ISO-файла, а следовательно, эмулировать пока нечего.
Когда вы закинете свои образы на съемный диск, появится возможность выбрать нужный, после чего USBODE сам переключится в режим 1 и начнет прикидываться оптическим приводом:

Теперь в операционной системе есть новый внешний CD/DVD-дисковод, подключенный по USB, и ничем не отличимый от настоящего. Windows использует для него стандартные драйверы:

В BIOS/UEFI он определяется точно таким же образом. Единственный нюанс — от подачи питания до запуска эмуляции проходит в среднем 45 секунд. Это время нужно, чтобы загрузить базовую операционную систему Linux и начать выполнять приложение эмуляции:

С такого виртуального диска уже можно без проблем загрузиться в Live-режиме (для примера я попробовал GRML) или начать установку нужной вам ОС. Файловая система Ex-FAT без проблем переваривает файлы более 4 Гб (в отличие от FAT32). Ну а производительность зависит по большей части от скорости работы карты памяти, чем от производительности одноплатника.
Подводим итог
Проект USBODE — пример того, как дешевая RPI Zero W может серьезно облегчить жизнь системным инженерам и администраторам. Я ни в коем случае не пытаюсь сказать, что альтернативные методы чем-то хуже, но лично мне он показался почти настолько же удобным, как и мой Zalman VE-500, служащий мне верой и правдой много лет.
Развитие этого проекта кажется весьма перспективным. Можно расширить количество поддерживаемых внешних модулей. Я, например, сейчас работаю над добавлением стандартного экрана MMDVM_HS-P1 HAT 0.96" (SSD1306, I²C). Этот небольшой OLED-дисплей размером 128×64 устанавливается в большинстве готовых полудуплексных MMDVM на базе того же RPI Zero W. Уверен, что будет здорово всего лишь сменить карту памяти и вместо домашнего репитера DMR получить эмулятор CD/DVD-привода.
К тому же мощности «малинки» достаточно, чтобы она потянула множество дополнительных фич, как поддержка эмуляции USB-Floppy или другой периферии. В этом плане она может стать неким подобием Flipper Zero, но иной направленности. Ну а доступность плат делает разработку действительно востребованной.
Andchir
Чем это отличается от Ventoy (https://github.com/ventoy/Ventoy) ?