Ошибка «устройство определилось как флешка, а не как привод» при настройке USB-гаджета на Linux почти всегда означает, что образ смонтирован без флага cdrom в функции mass_storage. Эмуляция CD-ROM через файл — рабочий приём для одноплатных компьютеров вроде Raspberry Pi Zero или Orange Pi: хост видит устройство как виртуальный оптический привод с ISO-образом, что полезно для установки ОС, загрузки WinPE или раздачи драйверов без записи на реальный диск.
В этой статье разберём, как работает подсистема USB Gadget в ядре Linux, чем отличаются модули g_file_storage, g_mass_storage и современный подход через configfs с libcomposite, как правильно сконфигурировать функцию эмуляции CD-ROM и что проверять, если хост не видит устройство или образ монтируется только для чтения с ошибками.
Как работает USB Gadget в ядре Linux
Подсистема USB Gadget позволяет устройству с контроллером USB Device Controller (UDC) выступать в роли периферии: флешки, сетевого адаптера, последовательного порта или привода. Ключевое условие — на плате должен быть порт, работающий в режиме OTG/peripheral. На обычном десктопном ПК такого контроллера обычно нет, поэтому тема актуальна в первую очередь для одноплатников и встраиваемых систем.
Исторически существовали монолитные модули: g_file_storage (устарел и удалён из ядра), затем g_mass_storage. Современный способ — configfs вместе с модулем libcomposite: конфигурация собирается через файловую систему /sys/kernel/config/usb_gadget/ без перезагрузки модулей, и в одном гаджете можно комбинировать несколько функций.
- 🔧 UDC — аппаратный контроллер, без него гаджет не запустится; список доступных смотрите в /sys/class/udc/
- 💿 mass_storage — функция эмуляции накопителя, поддерживает режим CD-ROM
- 🧩 libcomposite — модуль-компоновщик, собирающий гаджет из отдельных функций
- 📁 configfs — интерфейс настройки через каталоги и файлы в /sys/kernel/config
Эмуляция CD-ROM возможна только на устройстве с USB-контроллером в режиме peripheral/OTG. Проверьте наличие записей в /sys/class/udc/ до начала настройки.