Примечание:
Статья годится только для ядер 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.
2 коментарі “Добавляем поддержку флешек в openwrt через модули из других версий ядра”
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.
Я думаю https://forums.gentoo.org/viewtopic-t-814657-start-0.html поможет.