Я полагаю, это происходит только с флешками, поддерживающими USB3. Насколько я понял, происходит следующее: Router OS присваивает имя слота диска каждому USB-устройству, которое сообщает драйвер xhci-hcd.
xhci-hcd сообщает о двух USB-устройствах для каждого физического USB-порта (/system/resource/usb):
– «Device: 1-0», устройство с «USB Version: 2.0» и «speed: 480»
ему присвоено имя USB-интерфейса «USB 2.10 480Mbps»
ему же присвоено имя слота диска «usb2»
– «Device: 2-0», устройство с «USB Version: 3.0» и «speed: 5000»
ему присвоено имя USB-интерфейса «USB 3.00 5000Mbps»
ему же присвоено имя слота диска «usb1»
Когда флешка определяется как USB 3, она отображается на USB 3-интерфейсе xhci-hcd, и раздел флешки монтируется в «/usb1» (слот диска, назначенный этому устройству); соответственно, когда флешка определяется как USB 2, она отображается на USB 2-интерфейсе xhci-hcd, а раздел монтируется в «/usb2».
Проблема в том, что USB3-флешки чередуются в распознавании как USB2 или USB3, меняя состояние (почти) при каждом перезагрузке. Возможные причины:
– отсутствие отключения питания USB во время перезагрузки (или слишком короткий цикл), из-за чего флешка остаётся в состоянии, которого драйвер не ожидает (например, флешка уже включена и готова к работе, но драйвер пытается определить её возможности, как если бы она была только что сброшена),
– недостаточная задержка после перезагрузки перед определением устройства,
– баг в драйвере.
Поскольку проблема, как правило, переключается раз за перезагрузку, я склоняюсь к тому, что это либо проблема с состоянием аппаратуры, либо баг в драйвере, а не дефект железа.
Итого: проблема двухсторонняя — раздел флешки монтируется не туда, куда нужно, и USB 3.0 флешка работает на скорости USB 2.1.
Исправление довольно простое: если устройство определили неправильно, перезагрузите роутер. Добавьте следующий скрипт в /system/scheduler под именем «Reboot_if_USB3_detected_as_USB2» и запланируйте запуск при загрузке роутера.
Он просто проверяет, неправильно ли устройство распознано как USB 2.1, и, если да, логирует ошибку, ждёт 60 секунд и перезагружает роутер. Скрипт пытается сделать это не более пяти раз, после чего прекращает попытки.
Важно: остановить уже запущенный скрипт нельзя, так что не убирайте задержку! Если после изменений в скрипт или прошивку роутера скрипт начнёт перезагружать устройство бесконечно и без задержек, вы фактически «замуруете» устройство и придётся делать NetInstall! Будьте ОЧЕНЬ осторожны с изменениями этого скрипта.
Проверьте код сами — я новичок в Mikrotik Scripting. Это буквально мой второй скрипт!
#лог как ошибка, потому что автоперезагрузка сразу после запуска может сбивать с толку и — дело серьёзное.
:log error "Ждём 20 секунд перед проверкой, не распознан ли USB3 как USB2, возможно, будет перезагрузка... (это не ошибка)"
:delay 20s
:log error "Проверяем, не распознан ли USB3 как USB2 (это не ошибка)"
:local attempts 0
# Проверяем, существует ли файл с попытками, и считываем количество
:if ([/file find name="USB_Fix_Attempts"] != "") do={
:set attempts [/file get [find name="USB_Fix_Attempts"] contents]
} else {
# Создаём файл, если его нет, и устанавливаем изначальное значение 0
/file add name="USB_Fix_Attempts" contents="0"
}
:if ($attempts < 5) do={
:foreach disk in=[/disk find] do={
:if (([:pick [/disk get $disk interface] 0 5] = "USB 2") && [:len [/disk get $disk model]] > 0 && [:len [/disk get $disk serial]] > 0) do={
:log error ("USB3 флешка ошибочно распознана как USB2, сделано попыток перезагрузки: " . $attempts)
:log error ("Перезагрузка через 60 секунд!")
:log error ("Отключите задание /system/scheduler Reboot_if_USB3_detected_as_USB2, чтобы избежать дальнейших перезагрузок!")
:set attempts ($attempts + 1)
# Обновляем файл с количеством попыток
/file set USB_Fix_Attempts contents=$attempts
:delay 60s
:log error ("Перезагрузка")
/system reboot
:error "USB3 устройство ошибочно распознано как USB2, перезагружаюсь сейчас."
}
}
# Успех! В следующий раз может снова сломаться, сбросим счётчик для повторения процесса.
:log error "Всё в порядке, перезагрузка не нужна."
} else {
:log error "Исчерпано 5 попыток исправить USB3, распознанный как USB2... возможно, это действительно USB2. Всё равно загружаемся..."
}
# Сохраняем эту загрузку. В любом случае проверим снова при следующем запуске.
:set attempts 0
/file set USB_Fix_Attempts contents=$attempts