Добавляем поддержку флешек в openwrt через модули из других версий ядра

Примечание:

Статья годится только для ядер 2.6.Х. Для ядер 3.Х нужно поставить пакеты через —force-depends и просто скопировать нужные модули из папки /lib/modules/XXX в /lib/modules/YYY. Более того, в ядрах 3.Х присутствует команда modprobe.

И так. Для того, что бы добавить поддержку USB-storage (собственно флешка) нужны такие модули ядра: kmod-usb-storage, kmod-scsi-mod, kmod-sd-mod. При попытке установить получаем сообщение

# opkg install kmod-usb-storage
Installing kmod-usb-storage (2.6.32.27-1) to root...
Downloading http://downloads.openwrt.org/backfire/10.03.1/ar71xx/packages/kmod-usb-storage_2.6.32.27-1_ar71xx.ipk.
Collected errors:
* satisfy_dependencies_for: Cannot satisfy the following dependencies for kmod-usb-storage:
* kernel (= 2.6.32.27-1) * kernel (= 2.6.32.27-1) *
* opkg_install_cmd: Cannot install package  kmod-usb-storage.

В итоге пакет не поставился вообще.

Напомню: версия ядра на роутере — 2.6.32.25, а версия в репозитории (10.03.1) — 2.6.32.27. А если посмотреть в соседнюю ветку 10.03 то там версия 2.6.32.10. В любом случае получаем несоответствие версий.

Любые попытки сделать upgrade пакетов не увенчались успехом (получал вот такие сообщения):

Not upgrading package which is marked hold (flags=0x102)

Multiple packages providing same name marked HOLD or PREFER

Можно принудительно поставить пакет так:

# opkg --force-depends install kmod-usb_storage

Пакет ставится, но нужные модули лежат в соответствующей папке с версией ядра: /lib/modules/2.6.32.27. Тут можно пойти на хитрость: взять да и скопировать нужный модуль в папку /lib/modules/2.6.32.25, но и тут ждёт сюрприз при подгрузке модуля:

usb_storage: version magic '2.6.32.27 mod_unload MIPS32_R2 32BIT ' should be '2.6.32.25 mod_unload MIPS32_R2 32BIT '

и модуль не подгружается. Выход один — править бинарный модуль ядра usb_storage.ko. Открываем его в редакторе vi и ищем часть строки

vermagic=2.6.32.27

меняем только нужный номер версии на 2.6.32.25, сохраняем и подгружаем. Такое нужно проделать также для модулей scsi_mod sd_mod. Подгружать модули нужно в таком порядке:

# insmod sd_mod
# insmod scsi_mod
# insmod usb_storage

Если в другом, то будет ругань, что не найдены объекты.

Усложняется всё тем, что в openwrt нет команды modprobe, которая пытает подгрузить модуль, поэтому получаем риски при установке модуля. Вместо этого используется insmod, которая сразу же прописывает его в загружаемых при старте ОС модулях. И если что-то пойдёт не так — выгрузить сбойный модуль может быть не так легко.

После подгрузки модуля, можно увидеть в логах сообщения

sd 0:0:0:0: [sda] 7835648 512-byte logical blocks: (4.01 GB/3.73 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 03 41 00 00
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: sda1

что говорит, что наша флешка увиделась.

Примечание: не забудьте поставить поддержку нужной ФС (ext3, например), ибо по дефолту тут присутствует только jffs2.

Добавляем поддержку флешек в openwrt через модули из других версий ядра: 2 комментария

  1. Юра

    NTFS и JFS монтируются а FAT ругается: FAT-fs (sda1): codepage cp437 not found. Установил kmod-nls_iso8859-1.ko, nls_base.ko в папку модулей моего ядра, но FAT не монтируется. JFS и NTFS монтируются а FAT выдаёт ошибку codepage cp437 not found.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *