Pull to refresh

Кросскомпиляция для NAS

Reading time 3 min
Views 2.2K
Я хочу рассказать, как можно расширить функциональность NAS-устройств, работающих под управлением Linux с uClibc. Вполне возможно, что манипуляции с симлинками и переменными окружения позволят добиться успеха там, где нет uClibc.

Я не буду рассматривать пути получения root shell. Механизмов слишком много, все зависит от конкретной модели. На сайте посвященном взлому NASов рассматриваются различные методики получения root shell и даются ссылки на сайты сообществ взлома конкретных моделей.

Цель данной статьи показать насколько легко добавить в NAS недостающую функциональность и указать на некоторые подводные камни.

До того как начать ломать копья посетите сайт посвященный Вашему девайсу — его можно найти в списке сообществ по взлому NASов. Там может быть не только важная информация, но и готовые бинарники, полезные советы и т.п. В первую очередь нас интересует как получить root shell. Во вторую — версии uClibc и ядра.

Сбор исходников.


Идем на сайт производителя. Там с большой вероятностью можно скачать файл вроде GPL_sources.tgz в котором будет ядро с конфигом под Ваш NAS. Если повезет еще больше, там будут исходники toolchain, среды компиляции для Вашего девайса. В моем случаи исходников toolchain не было. Более того, на сайте этой замечательной среды скачать toolchain нужной мне версии uClibc (0.9.26) невозможно. Однако существует заметка, где есть не только адрес исходников, но и необходимые патчи. Если ядра на сайте производителя не было, его всегда можно скачать с kernel.org. Еще нам понадобится module-init-tools или modutils, если ядро версии 2.6 или 2.4, соответственно.

Подготовка среды.


Для начала нужно собрать toolchain. Под Linux это труда не составит, под BSD понадобится gmake. Говорят, что можно скомпилить под cygwin, я не пробовал. Обратите внимание, в Makefile нужно проставить ARCH:=XXX, где XXX — архитектура Вашего NASа и LINUX_SOURCE:=kernel-headers-K.KK.KK.tar.bz2, где K.KK.KK — версия ядра.

Теперь можно компилировать программы, которые будут запускаться на NASе.

Для этого нужно во-первых добавить в PATH путь к бинарникам toolchain, например,
$ export PATH=$PATH:~/uclibc-toolchain-src-20040609/gcc-3.3.x/toolchain_i386/bin

Во-вторых, при запуске ./configure нужно добавить ключ --host=XXX-linux, где XXX — архитектура Вашего NASа, например,
$ ./configure --host=i386-linux

Обратите внимание! У моего NASа архитектура i386, у Вашего скорее всего другая.

Если Вы хотите добавлять модули ядра (например драйвер файловой системы или сервер NFS), нужно скомпилировать module-init-tools или modutils и само ядро. Не забудьте указать в качестве CC gcc из toolchain. Причем, будьте бдительны, модуль должен быть скомпилирован той же версией gcc, что и ядро. Соответственно, может возникнуть ситуация, когда Вам понадобится два toolchain — один с gcc для ядра и другой с Вашей любимой версией gcc для userland.

Все готово


Теперь Вы можете компилировать нужные Вам программы и запускать их на NASе. Ни каких дополнительных манипуляций не требуется.

Мне в первую очередь хотелось сделать ядерный сервер NFS. Я собрал модуль ядра и nfs-utils, но запустить все это ни как не удавалось. После долгих бесплодных исследований я понял: я скомпилировал модуль не той версией gcc. Это мне сказал insmod из modutils. До этого я использовал insmod, который обеспечивает busybox. Пресквернейшая вещь, надо сказать. Он не выдает ни какой полезной информации, в том числе и предупреждение о разных версиях gcc.

По-этому я настоятельно рекомендую использовать modutils. Когда я скомпилировал модуль правильно все заработало!

Игра стоит свеч: на моем NASе лузерспейсовая sama дает 5 МБ/с, лузерспейсовый nfs дает 4,5 МБ/с, а ядерный nfs 7 МБ/с. Я подозреваю, что загрузка при этом не 100%.
Tags:
Hubs:
+8
Comments 27
Comments Comments 27

Articles